高级会员
- 积分
- 754
- 威望
- 368
- 贡献
- 170
- 兑换币
- 56
- 注册时间
- 2012-3-20
- 在线时间
- 157 小时
- 毕业学校
- bit
|
简单来说,pid就是通过定时中断,每隔一个周期进行一次速度改变,最终达到理想速度
把自己的方案贴上来,抛砖引玉
首先,PIT定时中断初始化,此处以20ms为例
- /********************定时中断初始化 PIT 初始化*******************************/
- void INIT_PIT(void) {
- PITCFLMT_PITE=0; //PIT is disabled (40Mbus clock)
- PITCE_PCE0=1; //PIT chanel_0 定时器 0 (共四个定时器)enabled
- PITLD0=9999; //1 毫秒 PIT Load Register
- PITMTLD0=79; //time-out period = (PITMTLD + 1) * (PITLD + 1) / fBUS
- PITMUX=0x00; //0 The corresponding 16-bit timer counts with micro time base 0
- PITINTE_PINTE0=1; //PIT Interrupt Enable Register
- PITCFLMT_PITE=1; //PIT is enabled
- }
复制代码
在中断函数中写下中断内容- /****************************定时中断进行 pid 计算******************************/
- #pragma CODE_SEG __NEAR_SEG NON_BANKED
- void interrupt 66 PIT0Interrupt(void)//测速的中断程序
- {
- CarSpeed=PACNT;//车速度值
- PITTF_PTF0=1; //定时器 1 标志位清零
- PACNT=0X0000;
- Speed_Ctrl(); //Speed_PID
- PWMDTY1=SpeedPWM;
- PITTF_PTF0=1; //定时器 1 标志位清零
- }
- #pragma CODE_SEG DEFUALT /**/
复制代码
再根据自己小车的实际情况 提供速度选择方案
- /************************速度控制**************************************/
- void Speed_Ctrl(void) {
- if(虚线)
- SpeedPWM=Speed_PID(Speed_Normal,CarSpeed);
- else
- SpeedPWM=Speed_PID(Speed_Bend,CarSpeed);
- }
复制代码
其中pid算法函数
- /****************************速度 PID*******************************/
- unsigned char Speed_PID(unsigned int ideal_speed,unsigned int pulse_count) //连个参数分别为理想速度和 实际速度
- {
- float temp;
- error=ideal_speed-pulse_count;
- temp=error/10+50*(error-pre_error)/100;
- SpeedPWM=SpeedPWM+(int)(temp);
- pre_error=error;
- if(SpeedPWM>200)
- SpeedPWM=200;
- if(SpeedPWM<=0)
- SpeedPWM=0;
- return SpeedPWM;
- }
复制代码
然后配合上位机绘图功能 ,空载和负载情况下分别测试,直到出现pid经典波形
方案比较简单,欢迎提出各种改进
AD:如果你需要上位机,可以移步http://item.taobao.com/item.htm?id=14478455287
|
|