- #include "sys.h"
- #include "delay.h"
- #include "led.h"
- #include "lcd.h"
- #include "pid.h"
- #include "exti.h"
- #include "key.h"
- #include "timer.h"
- #include "motor.h"
- #include "pid.h"
- #include "usart.h"
- struct PID pid;
- extern u32 LL,RR,S_L,S_R,TT,speed_lcd,set_speed;
- extern int pwm_i,pwm_j,wk_up;;
- float KP=0.5;//控制比例
- float KI=0.1;//积分系数
- float KD=0.0;//微分系数
-
- void key_scanf(void) //按键PWM调节
- {
- if(KEY0==0) //KEY_0 ->KI
- {
- delay_ms(10); //消抖
- if(KEY0==0)
- {
- if(wk_up!=3) KD+=0.01;
- if(wk_up==3) KD-=0.01;
-
- if(KD<=0) KD=0.00;
- }
- }
-
- if(KEY1==0) //KEY_1 ->KD
- {
- delay_ms(10); //消抖
- if(KEY1==0)
- {
- if(wk_up!=2) KI+=0.01;
- if(wk_up==2) KI-=0.01;
- if(KI<=0) KI=0.00;
- }
- }
-
-
- if(KEY2==0) //KEY_2 ->KP
- {
- delay_ms(10); //消抖
- if(KEY2==0)
- {
- if(wk_up!=1) KP+=0.01;
- if(wk_up==1) KP-=0.01;
-
- if(KP<=0) KP=0.00;
- }
- }
-
-
- if(WK_UP==1) //KEY_2 ->KP
- {
- delay_ms(10); //消抖
- if(WK_UP==1)
- {
- wk_up+=1;
- if(wk_up==4) wk_up=0;
- }
- }
- }
- void PID_Init(void)
- {
- pid.limit=0.0;//限幅
-
- pid.e_current=0.0;//当前偏差
- pid.e_his=0.0;//历史偏差总和
- pid.e_last=0.0;//上次偏差
- pid.e_llast=0.0;//上上次偏差
-
- pid.target_out=0.0;//目标输出
- pid.real_out=0.0;
- }
- //算法数据实现
- float PID_Data(float set_speed)
- {
- float out_speed;
- pid.real_out=(float)LL;
- pid.target_out=set_speed;//设定的速度值给target_out处理
-
- pid.e_current=pid.target_out-pid.real_out;//计算当前误差 real_out需要外部调入
- //pid.e_his+=pid.e_current;//重复调用记录开机以来的历史误差
-
- out_speed=KP*(pid.e_current-pid.e_last)+KI*pid.e_current+KD*(pid.e_current-2*pid.e_last+pid.e_llast);//计算公式
- pid.real_out=pid.real_out+out_speed;//叠加再输出
-
- pid.e_llast=pid.e_last;//为下次数据处理准备;
- pid.e_last=pid.e_current;//为下次数据处理准备;
-
- return out_speed;//输出目标调节PWM值
- }
复制代码- #include "sys.h"
- #include "delay.h"
- #include "led.h"
- #include "lcd.h"
- #include "pid.h"
- #include "exti.h"
- #include "key.h"
- #include "timer.h"
- #include "motor.h"
- #include "pid.h"
- #include "usart.h"
- u32 LL=0,RR=0,S_L=0,S_R=0,TT=0,speed_lcd,mo_dir=0,set_speed_ms_lcd=0;
- u32 temp2=0,temp3=0,temp1=0,temp=0;
- float R_T=0.0,speed=0.0,SPEED=0.0,set_speed_ms=0.0;
- extern float speed,temp5,temp7,Duty,KP,KI,KD;
- extern int adc5,adc7,set_speed,temp_P,temp_I,temp_D,temp_PP,temp_II,temp_DD,pwm_i,pwm_j,wk_up;
- extern struct PID pid;
- void motor_set(void)
- {
-
- TIM_SetCompare1(TIM4,1000); //修改比较值,修改占空比 PB6
- TIM_SetCompare3(TIM4,1000); //修改比较值,修改占空比 PA1 电机正 L and R 前进
- TIM_SetCompare2(TIM4,pwm_i); //修改比较值,修改占空比 PB7
- TIM_SetCompare4(TIM4,pwm_i); //修改比较值,修改占空比 PA5 电机负 L and R 后退
-
- /*
- TIM_SetCompare3(TIM3,PID_Data(i)); //修改比较值,修改占空比 PA1 电机正 L and R 前进
- TIM_SetCompare2(TIM3,PID_Data(1000-i)); //修改比较值,修改占空比 PA5 电机负 L and R 后退
- */
- }
- void motor_reset(void)
- {
-
- TIM_SetCompare1(TIM4,1);
- TIM_SetCompare3(TIM4,1);
-
- TIM_SetCompare2(TIM4,1);
- TIM_SetCompare4(TIM4,1); //停车不动
- }
- void lcd_show(void)
- {
- POINT_COLOR=BLACK;
-
- LCD_ShowString(0,0,100,24,24,"pwm_i ->:");
- LCD_ShowxNum(150,0,pwm_i,3,24,0); LCD_ShowxNum(200,0,pwm_j,3,24,0);//显示i,j
-
- LCD_ShowString(0,24,100,24,24,"LL value:");
- LCD_ShowxNum(150,24,LL,7,24,0);
- LCD_ShowString(0,48,100,24,24,"RR value:");
- LCD_ShowxNum(150,48,RR,7,24,0); //显示左右编码器的值
-
- LCD_ShowString(0,72,200,24,24,"Speed_L :");//显示出计算过的速度
- LCD_ShowString(126,72,100,24,24," . ");
- temp=speed_lcd/100;
- temp1=speed_lcd%1000;
- LCD_ShowxNum(126,72,temp,1,24,0);
- LCD_ShowxNum(150,72,temp1,2,24,0);
- LCD_ShowString(174,72,100,24,24,"(m/s)");
-
- LCD_ShowString(0,96,200,24,24,"Speed_R :");
- LCD_ShowxNum(150,96,S_R,7,24,0);
-
- LCD_ShowString(0,120,100,24,24,"TT value :");
- LCD_ShowxNum(150,120,TT,7,24,0);
-
- LCD_ShowString(0,255,200,24,24,"set_LL :");
- LCD_ShowxNum(150,255,set_speed,7,24,0);
- LCD_ShowString(0,279,200,24,24,"set_speed:");//显示出计算过的速度
- LCD_ShowString(126,279,100,24,24," . ");
- temp2=set_speed_ms_lcd/100;
- temp3=set_speed_ms_lcd%1000;
- LCD_ShowxNum(126,279,temp2,1,24,0);
- LCD_ShowxNum(150,279,temp3,2,24,0);
- LCD_ShowString(174,279,100,24,24,"(m/s)");
-
- LCD_ShowString(0,144,260,24,24,"WK_UP :");
- LCD_ShowxNum(198,144,wk_up,1,24,0);
-
- LCD_ShowString(0,168,260,24,24,"KEY_2 P:");
- LCD_ShowString(174,168,100,24,24," . ");
- temp_P=(int)100*KP;
- temp_PP=temp_P/100;
- temp_P=temp_P%100;
- LCD_ShowxNum(174,168,temp_PP,1,24,0);
- LCD_ShowxNum(198,168,temp_P,2,24,0);
-
- LCD_ShowString(0,192,260,24,24,"KEY_1 I:");
- LCD_ShowString(174,192,100,24,24," . ");
- temp_I=(int)100*KI;
- temp_II=temp_I/100;
- temp_I=temp_I%100;
- LCD_ShowxNum(174,192,temp_II,1,24,0);
- LCD_ShowxNum(198,192,temp_I,2,24,0);
-
- LCD_ShowString(0,216,260,24,24,"KEY_0 D:");
- LCD_ShowString(174,216,100,24,24," . ");
- temp_D=(int)100*KD;
- temp_DD=temp_D/100;
- temp_D=temp_D%100;
- LCD_ShowxNum(174,216,temp_DD,1,24,0);
- LCD_ShowxNum(198,216,temp_D,2,24,0);
- // v777=(int)(temp7*1000);
- // v7=(v777/1000);
- // v77=v7%1000;
- // LCD_ShowxNum(174,216,v7,1,24,0);
- // LCD_ShowxNum(198,216,v77,2,24,0);
-
- }
复制代码
全部资料51hei下载地址:
PID任务二.rar
(531.32 KB, 下载次数: 63)
|