‘壹’ 单片机如何控制电机转速
利用单片机的定时器TIMER_A(TA)中断产生脉冲信号,通过在响应的中断程序中实现步进电机步数和圈数的准确计数,通过PWM实现转速控制。
可以利用P10端口的中断关闭TA中断程序,并推入堆栈,停止电机;P11中断则开启TA中断,堆栈推入程序计器(PC),开启电机。
P31端口输出高电平由PMM8713的U/D端口控制电机的转向;P3.0~P37端口接8279的8个数据接口。
单片机扫描到矩阵键盘有键按下时,利用P2端口的中断设置TA,控制启停、调速和转向等,同时单片机反馈给8279控制LED管显示转速和转向。
(1)单片机控制转速pid扩展阅读
1、单片机所接收到控制命令暂存在RXBUFFER中,与存储在片内Flash的中断程序的入口地址相比较,相同就进入中断,实现步进电机的控制。
2、当P1.0中为高电平时,其内部三极管导通,使电机转动。当P1.0为低电平时,内部三极管截止,电路断开,电机停止转动。所以在程序中可以利用P1.0口输出PWM波来控制电机的转速。
‘贰’ 51单片机实现电动机的PID恒速控制。
这是倒立摆系统的PID控制函数的一部分,你看看有没有思路
/****************************************************************/
//定义结构体
/****************************************************************/
struct may_PID{
signed long Proportion; //比例 ;调节系数
signed long Integral; //积分 ;调节系数
signed long Derivative; //微分 ;调节系数
signed long SetPoint; //设定值 ;定值
signed long SumError; //偏差积分
signed long PrevError; //之前偏差值
}PID/*此处可放结构体变量名*/;
struct may_PID *pp; //定义结构体类型指针
//pp=malloc(sizeof(struct may_PID)); //为指针变量分配安全的地址空间;sizeof:其为计算字节长度函数
/*****************************************************************/
/**************************PTD函数**************************************/
signed long PIDCalc(signed long NextPoint/*当前值*/ )
{
signed long dError;
Error = pp->SetPoint - NextPoint;//当前偏差
pp->SumError+=Error; //积分
dError=Error-pp->PrevError;//当前微分=当前偏差-之前偏差
pp->PrevError=Error; //把当前偏差赋予之前偏差变量,使其充当下次取样的之前偏差
return (long)(pp->Proportion *Error //比例项
+pp->Integral*pp->SumError //积分项
+pp->Derivative*dError); //微分项
}
/*****************************************************************************/
‘叁’ 求一个51/52单片机pid温控电机代码,主要就是利用获取的温度和预设温度来控制电机转速(pwm)
没错啊,pid的核心就算参数,做试验来定.
‘肆’ pic单片机pid控制算法参数整定
我这有51的
#include <stdlib.h>
#include "global_varible.h"
/****************************************************************************
* 模块名: PID
* 描述: PID调节子程序
* 采用PID-PD算法。在偏差绝对值大于△e时,用PD算法,以改善动态品质。
* 当偏差绝对值小于△e时,用PID算法,提高稳定精度。
* PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]
*============================================================================
* 入口: 无
* 出口: 无
* 改变: PID_T_Run=加热时间控制
*****************************************************************************/
void PID_Math(void)
{
signed long ee1; //偏差一阶
//signed long ee2; //偏差二阶
signed long d_out; //积分输出
if(!Flag_PID_T_OK)
return;
Flag_PID_T_OK=0;
Temp_Set=3700; //温度控制设定值37.00度
PID_e0 = Temp_Set-Temp_Now; //本次偏差
ee1 = PID_e0-PID_e1; //计算一阶偏差
//ee2 = PID_e0-2*PID_e1+PID_e2; //计算二阶偏差
if(ee1 > 500) //一阶偏差的限制范围
ee1 = 500;
if(ee1 < -500)
ee1 = -500;
PID_e_SUM += PID_e0; //偏差之和
if(PID_e_SUM > 200) //积分最多累计的温差
PID_e_SUM = 200;
if(PID_e_SUM < -200)
PID_e_SUM = -200;
PID_Out = PID_kp*PID_e0+PID_kd*ee1; //计算PID比例和微分输出
if(abs(PID_e0) < 200) //如果温度相差小于1.5度则计入PID积分输出
{
if(abs(PID_e0) > 100) //如果温度相差大于1度时积分累计限制
{
if(PID_e_SUM > 100)
PID_e_SUM = 100;
if(PID_e_SUM < -100)
PID_e_SUM = -100;
}
d_out = PID_ki*PID_e_SUM; //积分输出
if(PID_e0 < -5) //当前温度高于设定温度0.5度时积分累计限制
{
if(PID_e_SUM > 150)
PID_e_SUM = 150;
if(PID_e_SUM > 0) //当前温度高于设定温度0.5度时削弱积分正输出
d_out >>= 1;
}
PID_Out += d_out; //PID比例,积分和微分输出
}
else
PID_e_SUM=0;
PID_Out/=100; //恢复被PID_Out系数放大的倍数
if(PID_Out > 200)
PID_Out=200;
if(PID_Out<0)
PID_Out=0;
if(PID_e0 > 300) //当前温度比设定温度低3度则全速加热
PID_Out=200;
if(PID_e0 < -20) //当前温度高于设定温度0.2度则关闭加热
PID_Out=0;
Hot_T_Run=PID_Out; //加热时间控制输出
PID_e2 = PID_e1; //保存上次偏差
PID_e1 = PID_e0; //保存当前偏差
}
////////////////////////////////////////////////////////////void PID_Math() end.
‘伍’ 单片机PID控制问题
首先弄清楚PID是一种控制算法!!!
1,“如果用单片机恒温可以使温度到达预定值就停止加热,低了就加热,用一个温度传感器反馈,这样算是一个自动控制吗”你这是控制系统,但是效果会非常差,尤其是对于温度控制这种大惯性系统,达到预定值就停止加热,但是由于惯性,温度肯定会继续上升,电炉烧水的时候,水开了,断电之后水还要沸腾一定时间的(沸腾是很消耗能量的,由此可见如果是加热的话温度上升更严重,你也可以自己用温度计试试看);“低了就加热”是同样的道理。如果系统对控制精度有要求,你这样做肯定达不到要求。PID是一种控制算法,相对于其他控制算法来说算是最简单的了。PID能够做到在温度快要达到设定值的时候降低加热功率,让温度上升速度变慢,最终稳定在设定值。如果用你的直接控制,温度会在设定值上下振荡,永远不会停在设定值。
2,一般的控制系统都需要加反馈,以构成闭环控制系统,相对的还有开环控制系统。开环控制系统,举个例子,就是你加热的时候事先计算好大约需要多少热量,然后考虑一下环境影响,计算出加热时间,然后控制加热系统按照你这个时间加热。你觉得这样的系统能够稳定工作吗?环境稍稍有变动就挂了!开环控制系统的特点就是很容易受到环境的影响;闭环控制系统就稳定很多,你用1L水可用,2L水也行,500W电能用,1000W电炉也能用,这就是闭环的优点。
因此,大多数的控制系统都是闭环的,开环很少单独使用,即使用到了也是有闭环的。开环其实也是有优点的,开环在控制系统里面叫做前馈(跟反馈对应的),比如你的系统里面电源电压上升了,加热速度肯定会变快,如果你对电源电压采样,将采样的结果输入到闭环里面,对闭环做一个轻微的修正,控制的精度会更好,这就是开环的优势,它是超前的,能够预知结果(根据地源电压提高就能知道需要降低输出功率了)。
说完这些,你应该明白了,反馈是必需的(前馈也可以要,但是不是必需的),PID不能被取代(除非你用其它更复杂的控制算法)。
‘陆’ 单片机如何写PID程序
具体如下:
1、如果加入D抖动的特别厉害,试试只用PI控制。
2、还有PID参数都是一步一步调出来的,我建议你做个上位机,就是个简单的VB串口程序,用来设置PID参数
3、然后在单片机这边弄个串口接收程序,这里就是个简单的串口程序,人人都会,把接收到的PID存储在缓冲区里。
4、然后单片机程序直接调用。单片机带EEPROM的话,当接收到改变的PID参数时,存储这些参数。去STC官网下你的单片机资料,上面有EEPROM测试程序,直接套用。
‘柒’ 如何在单片机中实现pid自整定
仪表的PID实际上就是一个控制系统,其中P表示为比例带,它对检测到的变化信号进行放大作用,再经过仪表输出去控制被测介质的物理量,比如压力、温度、流量以及液位等;I表示积分作用,因为比例调节P虽然对被测信号的变化能得出即时的响应,但存在着静压现象,提高积分作用可以使变化响应信号能消除静差;D表示微分作用,对于一些响应变化很迟缓的对象,如温度,在进行控制时为了加快控制效果,可引入微分调节量,起到超前调节的作用,也就是说是超调。
对于PID参数的整定是一个实验的过程,因为不同的对象条件有不同的调节规律,在整定时向将I和D关闭,比例带放在100%,这时比例带P的放大倍数是1,逐渐减少比例带,也就增加放大倍数,加入测量的变化信号,检查输出和控制对象是否有振荡现象。所谓的振荡现象,举个例子,对某个压力的控制,当压力高时,控制阀门打开一点进行释放,当压力低时就关闭阀门。当对这个控制系统进行PID参数调整时,先关闭I和D,设定某个P值后对控制系统加一个压力升高的变化信号,这时如果P值过小时,即其放大倍数增大,使得其输出信号过量增大,导致阀门开的过大,造成压力下降过快,因为检测到压力因为过低,使得控制输出信号朝相反的方向变化,即输出信号过量减小,使得阀门有被关闭,这时压力有很快上升,这个现象就是振荡现象。为了避免在调节中出现振荡现象,一般是小范围的调整比例带P参数。等调整到压力增高时,阀门稍微开一点,压力稳定,压力降低时,阀门稍微关一点,保持压力稳定,这就算是可以了。这时再增加一点积分I参数,使得比例调节存在的静差得到消除。微分D一般是不使用。
PL/C
‘捌’ 用单片机做PID算法控制问题
1.可以直接套用PID公式,无论增量还是绝对的。PID算法是根据误差来控制的算法,不依赖系统的模型,故不用算系统的传递函数。有的书提到传递函数,一般是用于理论建模仿真,从而直接用Matlab一类的仿真软件进行PID参数调试。得到的参数可以为实际应用提供一定参考价值。
2.PID参数整定有一套原则。首先要了解各个参数的作用。具体的整定方法,随便找本自控原理的书都会提到,我不太记得了,大致是有一个倍数关系。但实际操作,一般不会是用这个数,是需要根据系统的反应,改变各个参数来试的。尽信书不如无书啊~
另外,不同系统的参数肯定不一样。就算同一个系统,稍微有一些改变,可能最好的那组参数就会变化。因此衍生了很多先进PID算法,如神经PID、专家PID、模糊PID等等。
‘玖’ PLC的PID控制和单片机的PID控制哪个好
重点不明确。业务员需要知道的是元器件的功能。
工业电气,分为保护电器和控制电器。其中保护电器有断路器和熔断器。断路器,如每个家挺里都有的总闸,一旦电路出现短路了就跳闸,可重复保护。熔断器和断路器一样,起到保护作用,但是熔断器里面是容芯,烧坏了就没用了,只能保护一次,但胜在价格便宜,一般用于控制电路。
控制电器有接触器,中间继电器是时间继电器。电机启动电流和运行电流大,需要接触器来实现通断三相电。有些信号需要多次利用,就需要中间继电器来扩展触头。时间继电器就好比闹钟,设定好时间,时间一到就动作,用在需要对时间进行延迟的地方。
pid就是反馈信号的控制,目的是为了实现输出信号的跟随性和稳定性。所谓跟随性,就是我将设定的值变了,那么输出值就会程柔性的曲线变化,不会造成冲击性的信号。所谓的稳定性,就是如果中间环节出了问题,也不影响输出。比如对一电机的控制,设定为2000转。电机的负载突然加大,如果没有pid控制,将转速的测量值反馈回去,那么电机转速势必降低;如果有了pid控制,那么控制会自行增大输出频率,来提高电机转速,使其依然维持在2000转。
plc,和单片机一样,将有硬件电器元件控制的逻辑搬进程序里,实现软件逻辑运算.plc抗干扰能力强,编程简单,性价比高。单片机价格便宜,但抗干扰能力差