写在前面的话:
这是我收藏的一个典型的PID处理程序,包含了最常用的PID算法的基本架构,没有包含输入输出处理部分。适合新手了解PID结构,入门学习用。
注意:
使用不同的MCU的时候,需要进行相应的简化和改写。而且由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算。而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算。这样可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余数补偿就好了。
废话不多说,下面上程序
- #include
- #include
- #include
- #include
- struct PID {
- unsigned int SetPoint; // 设定目标 Desired Value
- unsigned int Proportion; // 比例常数 Proportional Const
- unsigned int Integral; // 积分常数 Integral Const
- unsigned int Derivative; // 微分常数 Derivative Const
- unsigned int LastError; // Error[-1]
- unsigned int PrevError; // Error[-2]
- unsigned int SumError; // Sums of Errors
- };
- struct PID spid; // PID Control Structure
- unsigned int rout; // PID Response (Output)
- unsigned int rin; // PID Feedback (Input)
- ***it data1=P1^0;
- ***it clk=P1^1;
- ***it plus=P2^0;
- ***it subs=P2^1;
- ***it stop=P2^2;
- ***it output=P3^4;
- ***it DQ=P3^3;
- unsigned char flag,flag_1=0;
- unsigned char high_time,low_time,count=0;//占空比调节参数
- unsigned char set_temper=35;
- unsigned char temper;
- unsigned char i;
- unsigned char j=0;
- unsigned int s;
- /***********************************************************
- 延时子程序,延时时间以12M晶振为准,延时时间为30us×time
- ***********************************************************/
- void delay(unsigned char time)
- {
- unsigned char m,n;
- for(n=0;n
复制代码
|