一、背景
前面已完成了硬件激活、编程环境选择、软件框架构建,并且基于软件框架尝试了基于 RTOS 编程,为在此软硬件环境下学习单片机编程做了充分的准备。
从本篇开始,开始以其为载体,一步步完善其功能、性能,并基于其具备的能力去完成一些有趣的任务,在这个过程中,逐步掌握用单片机解决实际问题的技能。
掌上单片机实验室实质是一个小车,小车可以衍生出丰富的学习素材。
首先,让其按照需要运动就涉及到很多内容,如:直流电机驱动、运动反馈、PID调速、堵转保护等,以及两轮差分驱动方式下的直线行走,需要用到很多单片机知识。
在这些完成后,还可以基于其可动性,去设计、完成一些有趣的任务,如按特定轨迹行走、避障、“搬运”物体等,这些又将蕴含很多学习素材,可以外延到更多的知识范畴。
可以说,小车是一道有丰富发挥空间的单片机学习应用题。
既然是小车,第一步就要使其按需运动,本篇就着手实现此功能。
二、需求
因小车是作为学习平台,考虑到学习成本,使用的是最便宜的130直流电机,性能较低,用 PWM 调功方式很难得到期望的转速,阻力稍有变化将会改变转速。为使小车能按需要行走,控制车轮转速是必须的。
而控制转速首先需要测速!同样由于成本原因,小车码盘是在轮毂上直接做的,只有60齿,分辨率太低,尤其是用于PID调速时,计算周期如果设计为20ms,最快时才几个脉冲,无法满足计算需求,因此需要通过算法提高测速分辨率。
综合而言,驱动小车运动的需求如下:
1、可以方便的驱动电机
2、可实现满足调速要求的测速
3、可控制车轮转速
4、可控制车轮行走距离
三、设计
3.1 驱动任务构思
前面虽然实现了电机的驱动,能让小车动起来,但那个只是为了硬件测试,功能设计比较简单。
此处要实现的驱动是为了满足后续小车的行为可控,能根据需要完成相应的轨迹运动,速度、距离可控,能完善、可靠的执行相应的操作命令,且易于和其它任务交互,协同实现期望的功能。
按面向对象的思路,拟将两个车轮的驱动作为对象,将小车运动的相关功能均纳入,以其为基础构建一个任务:驱动任务。
驱动任务应包含:
1)电机驱动
2)测速
3)调速
4)距离控制
5)左、右轮配合实现运动轨迹控制
6)电机驱动保护
7)当前电机工作状态反馈
上述功能的罗列顺序是基于相互依存关系的,按上述顺序实现各个功能,驱动任务应能满足需求。
因为要驱动两个电机,功能一样,故考虑使用类方式实现电机驱动相关功能,以简化编程。
3.2 电机驱动
电机驱动在前面做测试任务时已经完成,此处从实际使用角度再优化一下即可。
电机驱动电路支持电机的4个工作状态:前进、后退、惰行、刹车。
前进、后退不难理解,惰行和刹车需要说明一下:
&nb