#include "stm32f10x.h"
#include "PID.h"
int Speed_PID (int16_t target ,int16_t change) //差速PID控制器
{
float KP=0.405,KI=0.66,KD=0.62;
float Bias,Pwm,jifen;
static float Last_Bias;
Bias=target-change; //计算偏差
jifen+=Bias; //求出偏差的积分
Pwm=KP*Bias+KI*jifen+KD*(Bias-Last_Bias); //位置式PID控制器
Last_Bias=Bias; //保存上一次偏差
if(Pwm>2000) Pwm=2000;
if(Pwm<-2000) Pwm=-2000;
//if(target==0&&change==0)Pwm=0;
return Pwm; //返回PWM值
}
pid.h文件- #ifndef __PID_H
- #define __PID_H
- #include "stm32f10x.h"
- int Speed_PID (int16_t target ,int16_t change) ;
- #endif
复制代码
注意PID的调用一定不能放在主循环里面,因为主循环的周期会随着代码量增加而变
我是放在中断里面。
int main(void)
{
OLED_Init();
Motor_Init();
//hongwai_Init();
TIM1_Init(1000,72); //定时中断初始化
Encoder_Init_TIM4( ); //编码器初始化
Encoder_Init_TIM3( );
/*显示静态字符串*/
OLED_ShowString(1, 1, "Time:"); //1行1列显示字符串Num:
OLED_ShowString(1, 8, ":");
OLED_ShowString(1, 11, ":");
OLED_ShowString(2, 1, "Speed:"); //1行1列显示字符串Speed:
OLED_ShowString(3, 1, "path:"); //1行1列显示字符串Speed:
OLED_ShowString(3, 11, "."); //1行1列显示字符串Speed:
//Car_go();
while (1)
{
OLED_ShowNum(1,12, miao, 2); //不断刷新显示Num变量
OLED_ShowNum(1, 9, fen, 2);
OLED_ShowNum(1, 6, shi, 2);
OLED_ShowSignedNum(2, 7, Speed2, 4); //不断刷新显示编码器测得的最新速度
OLED_ShowSignedNum(2, 12, Speed1,4); //不断刷新显示编码器测得的最新速度
Car_go();
OLED_ShowNum(3, 6, M, 5); //不断刷新显示编码器测得的最新速度
OLED_ShowNum(3, 12, CM, 2); //不断刷新显示编码器测得的最新速度
OLED_ShowNum(4,1,sensor[0],1);
OLED_ShowNum(4,2,sensor[1],1);
OLED_ShowNum(4,3,sensor[2],1);
OLED_ShowNum(4,4,sensor[3],1);
OLED_ShowSignedNum(4, 6, OUTPUT2,5);
Speed1 = Encoder_Get_TIM4( );
Speed2= Encoder_Get_TIM3( );
//read_sensor();
if(yan == 0)
{
yan = Control();
}
//Car_leftstop();
//Car_rightstop( );
}
}
void TIM1_UP_IRQHandler(void)
{
static int8_t cnt = 0;
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{ //判断是否是TIM1的更新事件触发的中断
{
//if(yan == 0)
cnt++;
if(cnt == 100)
{
cnt = 0;
miao++; //Num变量自增,用于测试定时中断
if(miao>=60){miao=0;fen++;}
if(fen>=60){fen=0;shi++;}
}
OUTPUT2=Speed_PID (Speed2,Speed1); //将差速PID控制器输出的PWM值赋值给
TIM_ClearITPendingBit(TIM1, TIM_IT_Update ); //清除TIMx更新中断标志
/*写入执行的操作*/
}
}
}
|