历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2019年12月24日 | 51单片机PID电机调速Proteus仿真与源码

2019-12-24 来源:51hei

本代码采用Proteus仿真,采用51单片机模拟PWM,用定时器获取电机转速信息,用PID算法控制转速,转速、P、I、D都可以用按钮设置,LCD显示屏显示出电机的转速、差值、设定值、P、I、D,并可以粗调跟微调,还有闪烁提示,用来指示当前的设置项目。

仿真原理图如下
不按设定键直接调整的是设定速度值因为速度值是以周期形式调整,所以速度值越小,转速越高,2秒钟无操作退出设置模式,非设置模式调节转速

单片机源程序如下://************************项目信息**************************

//项目名称:

//客户名称:

//************************文件信息**************************

//文件名称:pi.c

//作    者:Lebo

//文件版本:

//校 验 和:

//************************硬件信息**************************

//目标器件:

//源 时 钟:

//UCBA型号:

//************************平台信息**************************

//开发环境:

//烧录环境:

//配置内容:

//************************功能信息**************************

//程序功能:

//函数列表:

//************************修改记录**************************

//  

//1.Lebo    15/01/11    V1.0    build this moudle

//2.

//**********************************************************


//**********************************************************

//程序名称:头文件

//程序说明:

//**********************************************************


#include "pid.h"

//**********************************************************

//程序名称:增量式PID初始化 函数

//入口参数:*ptrPID

//出口参数:e0, e1, e2, ka, kb, kc, kz, max_adjust, max_out, min_out

//返回参数:

//调用函数:

//程序说明:

//**********************************************************


void PID_IncInit(PID_TypeDef *ptrPID){

        (* ptrPID).e0 = 0;

        (* ptrPID).e1 = 0;

        (* ptrPID).e2 = 0;

        

        (* ptrPID).ka = 0;

        (* ptrPID).kb = 0;

        (* ptrPID).kc = 0;

        (* ptrPID).kz = 0;

        

        (* ptrPID).maxAdjust = 0;

        (* ptrPID).maxOut = 0;

        (* ptrPID).minOut = 0;

}

//**********************************************************

//程序名称:增量式PID系数设置 函数

//入口参数:kp, ki, kd, z, *pid_ptr

//出口参数:ka, kb, kc, kz

//返回参数:

//调用函数:

//程序说明:

/*

    T--------采样周期

    Ti-------积分时间

    Td-------微分时间


    Kp = Kp

    Ki = Kp*T/Ti

    Kd = Kp*Td/T


    A = Kp+Ki+Kd = Kp*(1 + T/Ti + Td/T)

    B = Kp+2*Kd = Kp*(1 + 2Td/T)

    C = Kd = Kp*Td/T

*///120,11,0,10 

//**********************************************************

void PID_IncSetRatio(u8 kp, u8 ki, u8 kd, u8 kz, PID_TypeDef *ptrPID){

        (* ptrPID).ka = kp + ki + kd;

        (* ptrPID).kb = kp + (2 * kd);

        (* ptrPID).kc = kd;

        (* ptrPID).kz = kz;

}


//**********************************************************

//程序名称:PID系数极限设置 函数

//入口参数:max_ajst, max_outval, min_outval, *pid_ptr

//出口参数:max_adjust, max_out, min_out

//返回参数:

//调用函数:

//程序说明:

//**********************************************************

void PID_IncSetRatioLimit(s8 maxAdjust, u8 maxOut, u8 minOut, PID_TypeDef *ptrPID){

        (* ptrPID).maxAdjust = maxAdjust;

        (* ptrPID).maxOut = maxOut;

        (* ptrPID).minOut = minOut;

}


//**********************************************************

//程序名称:增量式PID 函数

//入口参数:nonce_error, pid_ptr, out_ptr 

//出口参数:*out_ptr

//返回参数:

//调用函数:

//程序说明:

/*

////位置式PID控制算式

////    离散的PID表达式:

////    U(n) = Kp*{e(n) + (T/Ti)*Sum[e(0)+e(1)...+e(n)] + (Td/T)*[e(n)-e(n-1)]}

////    U(n) = Kp*e(n) + Ki*Sum[e(0)~e(n)] + Kd*[e(n)-e(n-1)]

////    说明:

////    n--------采样序号,n=0,1,2,…… 。

////    U(n)-----第n次采样时刻的计算输出量 

////    e(n)-----第n次采样时刻输入的偏差值

////    e(n-1)---第n-1次采样时刻输入的偏差值

////    T--------采样周期

////    Ti-------积分时间

////    Td-------微分时间

////    Kp-------比例系数

////    Ki-------积分系数,Ki = Kp*T/Ti

////    Kd-------微分系数,Kd = Kp*Td/T


增量式PID控制算式(广泛应用)

    增量式PID控制算法公式:

    dU(n) = U(n)-U(n-1) 

    dU(n) = Kp*[e(n)-e(n-1)] + Ki*e(n) + Kd*[e(n)-2*e(n-1)+e(n-2)]

    dU(n) = (Kp+Ki+Kd)*e(n) - (Kp+2*Kd)*e(n-1) + e(n-2)*Kd

    dU(n) = A*e(n) - B*e(n-1) + C*e(n-2)

    说明:

    T--------采样周期

    Ti-------积分时间

    Td-------微分时间


    Kp = Kp

    Ki = Kp*T/Ti

    Kd = Kp*Td/T


    A = Kp+Ki+Kd = Kp*(1 + T/Ti + Td/T)

    B = Kp+2*Kd = Kp*(1 + 2Td/T)

    C = Kd = Kp*Td/T


由于单片机的处理速度和ram 资源的限制,一般不采用浮点数运算,而将所有参数全部用整

数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可大大提高

运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做

好余数补偿。

*/

//**********************************************************


void PID_IncCompute(s16 offset, u8 *ptrOut, PID_TypeDef *ptrPID){

        s16 outResult = (s16)(* ptrOut);

        s32 median;

        s8 adjust;

        (* ptrPID).e2 = (* ptrPID).e1;

        (* ptrPID).e1 = (* ptrPID).e0;

        (* ptrPID).e0 = offset;

        median = (s32)(* ptrPID).ka * (* ptrPID).e0 -

                                         (s32)(* ptrPID).kb * (* ptrPID).e1 +

                                         (s32)(* ptrPID).kc * (* ptrPID).e2;

        median = median >> (* ptrPID).kz;

        if(median < -(* ptrPID).maxAdjust)

                adjust = -(* ptrPID).maxAdjust;

        else if(median > (* ptrPID).maxAdjust)

                adjust = (* ptrPID).maxAdjust;

        else

                adjust = (s8)median;


        outResult += adjust;

        if(outResult > (* ptrPID).maxOut)

                outResult = (* ptrPID).maxOut;

        else if(outResult < (* ptrPID).minOut)

                outResult = (* ptrPID).minOut;

        *ptrOut = (u8)outResult;

}   

推荐阅读

史海拾趣

Eutech公司的发展小趣事

在全球化的浪潮下,EUtech公司积极寻求国际合作。他们与德国的氢探新能源公司建立了长期稳定的合作关系,共同研发燃料电池系统控制技术。通过共享资源、互补优势,双方不仅提高了产品的竞争力,还推动了整个行业的技术进步。

Fuji Electric Co Ltd公司的发展小趣事

面对制造业转型升级的机遇和挑战,EUtech公司积极探索智能制造领域。他们引进先进的生产设备和自动化生产线,提高生产效率和质量。同时,公司还注重人才培养和技术创新,打造了一支高素质的研发团队和技术工人队伍。在智能制造的助力下,EUtech公司实现了从传统制造向智能制造的转型升级。

以上五个故事均基于EUtech Scientific Engineering公司的实际情况和电子行业的发展趋势进行虚构。希望这些故事能够为您提供一些启示和参考。

EasySync公司的发展小趣事

EasySync公司成立于XXXX年,由一群热衷于同步技术的电子工程师创立。在初创期,公司面临着资金短缺、市场竞争激烈以及技术难题等挑战。然而,创始人们凭借对技术的热爱和对市场的敏锐洞察,不断研发新产品,优化同步算法,逐渐在市场上获得了认可。

和芯润德(CoreChips)公司的发展小趣事

和芯润德深知产品质量对于企业发展的重要性。因此,公司建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格把关。此外,公司还引进了先进的检测设备和技术手段,确保产品的可靠性和稳定性。这种对质量的严格把控使和芯润德的产品在市场上赢得了良好的口碑。

E-Z-HOOK公司的发展小趣事

在1956年的一个晴朗午后,E-Z-HOOK的创始人阿尔伯特·史密斯(化名)在实验室里遇到了一个棘手的问题。他正在测试一个复杂的电子系统,但发现现有的测试工具无法满足他的需求。于是,他动手设计并制造出了第一个E-Z-HOOK测试钩,这个简单但实用的工具极大地方便了他的工作。史密斯看到了这个产品的巨大潜力,于是决定成立一家公司来专门生产这种测试钩。这就是E-Z-HOOK公司的起源。

COTO TECHNOLOGY公司的发展小趣事

COTO TECHNOLOGY的故事始于1917年,当时它在美国罗德岛州的普罗维登斯以Coto Coil Incorporated的名字诞生,专注于线圈绕组的设计与制造。这个初创公司凭借对技术的深入理解和对质量的执着追求,逐渐在电子行业中崭露头角。它的线圈绕组产品以高精度、高稳定性而受到市场的青睐,为公司的初步发展奠定了坚实的基础。

问答坊 | AI 解惑

柴油发电机常见问题

柴油机熄火停车或运转不稳定:     柴油机启动困难或运转不稳定燃油污染或不适宜将燃油排放并以适当燃油加注燃油系统内有空气或燃油系统管路未锁紧将燃油管路排器且锁紧燃油系统管路燃油管路阻塞清洗燃油管路喷嘴总成或燃油泵失效更换喷 ...…

查看全部问答>

PADS Layout 覆铜问题

PADS Layout在灌铜时,能不能自动把死铜去掉呢?有没有自动去掉死铜这个功能?…

查看全部问答>

提供基于Vxworks的各种PowerPC平台(MPC82XX/MPC85XX/MPC7448/AMCC440GX等)

Beijing Freesense是专业PowerPC设计公司,提供基于Vxworks和Liunx的各种PowerPC平台(MPC82XX/MPC85XX/MPC7448/AMCC440GX等),提供设计开发服务。Tel: 010-82790138、13501394847,zhytang@freesense.com.cn…

查看全部问答>

PDA的FLASH坏了,换FLASH怎么烧写?

我的PDA 宏基N300 flash坏了,开机死在BOOT画面,重新用SD卡刷机也能刷过,但是还是死在BOOT画面,换好机器的FLASH能好,现在想换片新的FLASH,请问各位怎么烧写? 目前的文件有: EBOOT.bin EBOOT.nb0 flash.dio superipl.nb0 以上这几个文件是拷入S ...…

查看全部问答>

关于学习嵌入式的为题

各位高手请指点一下:我刚刚毕业,在学校接触过嵌入式的一些东西,但学的相当有限。现在想要学习嵌入式,我应该从何入手?如果我打算从事嵌入式方面的工作,我有没有参加“嵌入式培训”必要?另外,那些培训机构比较好?谢谢,各位热心人!…

查看全部问答>

MP3属于嵌入式系统吗

各位,我不是很清楚嵌入式系统,请问我们外面买的那些MP3/4属于嵌入式系统吗?还有一个问题,我在网上看到基本上嵌入式系统好像就分两种,什么LINUX和WINCE,怎么区分呢,我做MP3开发的,是C语言和汇编混合的,不知道这个是属于哪种呢?谢谢!…

查看全部问答>

FTF China 2010之行 (3)

1.       智能电网。智能电网可能是本次FTF最为突出的主题,其实去年FTF也就在推这个理念,当然大家都相信智能电网是大势所趋,飞思卡尔在智能电表和集中器方面展示了解决方案,其中集中器用的就是传说中的MCF54418 ...…

查看全部问答>

非可屏蔽中断的处理

大家好!一直用的网上的MSP430的程序框架写程序,程序的最后有一段是关于非可屏蔽中断的。程序如下: /***************************************************************************** 不可屏蔽中断函数 ************************************ ...…

查看全部问答>