51单片机控制伺服电机:软件模拟PWM及精度提升方法
- 时间:
- 浏览:75
- 来源:中国微特电机网
在单片机的应用里头大家肯定会对咋样去控制伺服电机感兴趣。可实际上,51 单片机很多都不带 pwm,得靠软件模拟。有些代码来驱动那多路伺服电路的时候,还怪麻烦!到底怎样才更方便地解决这个问题,咱们一起来扒一扒相关情况
51 单片机 PWM 状况
51 单片机,大部分普通款是不带 pwm 的。就只有那几款加强版才带着。但要用 51 来控制伺服电机的时候在多数情形之下就得采用软件模拟 pwm 。打个比方,在一些小型的智能模型项目里,就会因为没有现成的 pwm 功能,搞得得另外想办法产生所需波形。
有些朋友处理这个问题,就看了市面上好些的代码。有的代码采用的是延时办法让 pwm 波输出,还有一些代码用的是定时器来实现这个功能。可要是碰到那种多路伺服电路驱动要求的时候咧,使用这些既有的代码就有麻烦。比如想要几个伺服电机同时工作配合的项目,代码应付起来就费劲。
定时器 0 提醒机制
下面这个代码,采用的是定时器 0 这种方法产生每 0.5ms 一回的提醒程序处于大循环里边,可以通过调用 DJ()函数从而把值返还给伺服电机信号引脚。而且 DJ()函数还能够把旋转角度给定好。
像定时器 0 每 0.5ms 触发一次,20ms 之后就要把定时器置 0 再重新计数。举个例子,做一个小型机器人手臂运动控制项目的时候,定时器以这种固定时间的中断,就能稳定驱动电机每个时间间隔所要求的动作。
角度限制与精度提升
不过,由于定时器被设定成每 0.5ms 中断一次,就造成旋转角度是受限的。目前啊只能是 -45,-90,0,45,90,这样有限的几个角度。比如说,我们在摆造型的智能展览物里,如果用这个程序驱动伺服电机,就只能摆出几个死板的姿势。
要是想让精度提上去那得设置定时器的初值,接着改变函数的 num 值才行。就像要控制机器人的肢体去操作精密仪器,需要更精准复杂角度的时候,就得这么慢慢调整。
代码示例解析
这里代码先把引脚定义好了,将 DJ1 和 DJ2 定义在了 P3^6 和 P3^7。随后是函数、定时器中断这两方面的初始化工作。其中定时器 0 设置成为工作方式 1。总的程序设定完定时器 0 初始化之后,进入到了主循环当中。在中断函数 timer()里,定时达到 0.5ms 就中断,而且还能把返回值赋给对应的引脚。
例如说在一些 DIY 创客的多电机控制小车上,就可以根据这个代码来设定、调整每个电机相应的角度和运行逻辑。
程序完善方向
写代码的朋友时间太紧,还没对程序的可靠性进行测试,不过人家按经验讲一般没啥问题。以后等有空闲时间,打算接着给程序完善一下,加上能把舵机旋转速度进行控制的功能。假如要让小车灵活转向,能加速或者匀速拐弯,就需要很好地控制舵机电机的速度。
要是在机器人开发项目当中咧,添加速度控制功能就好比机器人有了变速齿轮,能让机器人做事和运动的时候更加灵活、到位。
专业驱动板建议
要是您去着手弄机器人设计制造这些事单片机 驱动 电机,建议您买一块专业的驱动板用专业驱动板来做调试工作的话,那可直观又方便,能大大减少不必要的琐碎事。就比如大学团队做的全功能智能服务机器人项目,使用专业驱动板后单片机 驱动 电机,能快速调试每个关节角度和动作,省去很多代码上的折腾与测试。
大家觉得这个 51 单片机控制伺服电机的代码有没有用处?你们觉得添加速度控制功能难不难哩?
猜你喜欢