发 帖  
原厂入驻New
PID电机调速控制器制作经验分享!
1021 PID 电机 编码器
分享
去年比赛培训的时候做的一个小东西,现在整理了出来和大家分享。
本设计采用STC12C5A60S2单片机作为主控芯片实现了PID电机调速控制器。传感器采用欧姆龙的200线编码器电机驱动模块采用L298N,使用LM2596来对电机供电。设计中的重点是电机转速的获取和基于PID的电机控制算法的实现。
   
[C] 纯文本查看 复制代码
//******************频率测量函数*****************void hight_frequency(){h_count=0;      //脉冲计数初值为0EX0=1;      //INT0中断允许,开始计数TR1=1;      //启动定时器1while(EX0);      //等待外部中断0关闭TR1=0;      //关T1中断h_count=(h_count-1)*50;   //得到实际频率,因为定时器计数的是20ms的个数所以此处乘50,即为1sSpeed=h_count/200;   //获取电机转速,此处采用200线编码器IF((Speed>300)||(Speed<0))Speed=0;SpeedTable[0]=0x30+(Speed/100);           SpeedTable[1]=0x30+(Speed%100/10);           SpeedTable[2]=0x30+(Speed%10);               SpeedTable[3]=0x20; }[C] 纯文本查看 复制代码
/*****INT0中断函数***/                                                                                                 void Int0_Routine(void) interrupt 0 {h_count++;                //高频计数脉冲加1}
[C] 纯文本查看 复制代码
//**************内部定时器T1中断******void Timer1_Routine() interrupt 3{TH1=0xb1;TL1=0xe0;        //重装初值EX0=0;        //20ms定时结束,停止计数}[C] 纯文本查看 复制代码
//**********PID算法******long int PID(int setpoint,int achieved){long int result,TempResult;en=setpoint-achieved;ErrorNum=p*en-i*(en-en1)+d*(en1-en2);TempResult=(long int)(ErrorNum/20);result=TempResult;en2=en1;en1=en;return result;}

                                                                          STC12C5A60S2主控板

                                                                             焊接完成后的主控板

                                     传感器和电机连接部分,直接上胶枪,简单粗暴!

                                                    运行中的12864显示结果




PID测速.zip (113.09 KB )
0
2019-8-20 12:37:10   1 评论 分享淘帖 邀请回答

相关问题

1 条评论
49个回答
2019-8-20 23:07:50 评论

举报

2019-8-20 23:25:34 评论

举报

以后争取做出更好的作品回报论坛的网友们
2019-8-20 23:41:04 评论

举报

PID算法:
 ErrorNum=p*en-i*(en-en1)+d*(en1-en2);
这个公式是可以很灵活的使用是吗 和之前在网上看到的公式不一样啊 既不是增量也不是位置式 
自己没有用过PID 希望楼主解释一下
2019-8-20 23:47:41 1 评论

举报

1 条评论
好东西,最近一直想做这么个玩意。
2019-8-21 00:04:36 评论

举报

这个是最简单的增量式PID。
2019-8-21 00:21:31 评论

举报

这个最多也就验证一下PID的原理,过几天可能会研究研究模糊控制。
2019-8-21 00:39:43 评论

举报

 
不要说我较针儿哈 增量式不应该是ErrorNum=p*(en-en1)+i*en+d*(en-2*en1+en2)吗
2019-8-21 00:50:47 1 评论

举报

1 条评论
unsigned char&nbspID(signed char x)
 {
 float y;
  y=kp*(x-x1)+ki*x+kd*(x-2.0*x1+x2)+22;
这个比较简单的。
2019-8-21 01:27:12 1 评论

举报

1 条评论
请教下这位哥哈  你这P I D 这三个参数是怎么整定的呢
2019-8-21 01:46:11 评论

举报

2019-8-21 01:59:10 评论

举报

设计这么酷,整理后来参加我们的经验设计分享活动吧 
投稿文章将会在爱板网首页展示哦,还有机会获得智能奖品 
http://www.eeboard.com/zhengwen
2019-8-21 02:08:00 评论

举报

楼主你好,TempResult=(longint)(ErrorNum/20);  这里为什么要除以20  有点不太理解
2019-8-21 02:21:46 评论

举报

楼主你好,TempResult=(longint)(ErrorNum/20);  这里为什么要除以20  有点不太理解
2019-8-21 02:29:59 评论

举报

 为了缩小计算出来的误差而已,你可以试着把这个值改打或改小
2019-8-21 02:42:10 评论

举报

2019-8-21 02:56:28 评论

举报

只有小组成员才能发言,加入小组>>

123下一页

954个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表