自平衡小车是一个很好的学习课题,这次比赛是个极好的机会。论坛里后不少是在校的学生,都是为了学习参与进来。我打算写些有助于学习帖子,从STM32F到小车,希望能帮到需要的童鞋。一步一步接近目标。我发帖子的频度不高,不要催哦。
今天先发最简单的工程代码,就是点亮LED。
贴子中的代码遵循下面的规则:
1. 尽量使用ST提供的标准库,即STM32F10x_StdPeriph_Driver,版本是V3.5.0
2. 工程目录结构: 在硬盘中建立一个练习的目录(比如D:\Exercise\), 然后下面建立如下目录。其中Ex开头的目录就是每次不断增加的学习工程。drivers目录下存放各种设备的驱动,也会不断更新。每次有新工程发布的时候,只要将发布的打包文件解压,拷贝到Exercise目录中即可。
D:\Exercise\
\CMSIS
\drivers
\STM32F10x_StdPeriph_Driver
\Ex1-LED
\Ex2-Timer-Timing
3. 所有工程代码在本论坛的小车控制板上运行。
走起...第一个工程
工程1:最简单的LED
工程2:基于串口的调度台
小车控制板上从J3引出了TTL电平的UART,可以通过USB转TTL串口的接口板与PC相连。这样就可以用PC上的超级终端/PuTTY一类的工具对小车进行控制。控制命令大家可以自由发挥。
这个工程建立了调度台的基本框架。控制命令的例子后续跟上。
工程3:电机控制
一, 电机的驱动
我们这里要讨论的是直流电机。直流电机的工作非常简单,在其两个电极上加上规定的的额定电压,电机就转动起来。反转输入电压的极性,电机就向相反的方向转动。
由于直流电机的转子/定子都是由线圈构造而成,需要很大的电流才能推动,因此电源或者驱动源要具备足够的推动能力。CPU的IO引脚无法提供足够的电流,所以需要通过一个驱动电路实现对直流电机的驱动。常见的直流电机驱动芯片有很多种,例如L294/N298。本小车采用的是TB6612。无论哪一种,其基本原理都是相同的。驱动电路的核心是一组桥式开关,如图 1所示。由于4个开关和电机构成的电路很像字母H,这个电路被称作H桥。
电机接在开关桥的中间,通过控制四个开关的通断,就可以实现对电机的正转,反转的控制。 图 2说明了电机转动的关系。 表 1给出了所有的开关组合,显然电源短路的情况是要避免的。
TB6612是一个双H桥电机驱动集成电路。它内部集成了两组H桥,可以同时控制两个电机。对于每一组H桥,它有4个输入控制信号:IN1,IN2,PWM和Standby。他们的逻辑关系由表 2给出。
这张表格告诉我们,
1. STBY引脚控制着驱动芯片的工作,它是作用就是使能,高电平有效。
2. IN1/IN2配合控制电机的转动方向。
3. 在转动时,PWM端上的低电平信号会导致电机的短暂制动(不是停止!),因此PWM端上不同占空比的信号可以用来调节电机的转速。
如果要让电机停止转动(处于制动状态),IN1/IN2必须都处于低电平。
二, PWM信号的产生
STM32F的任何一个通用定时器(General Timer)都可以工作在PWM模式下,并且可以将产生的PWM信号从外部引脚输出。(STM32F通用定时器的完整描述另文讲述)。
在PWM模式下,定时器可以输出一个占空比可变的方波信号。其频率由TIMx_ARR(这里的x表示某个定时器)寄存器的值决定,占空比则由TIMx_CCRx寄存器决定。
图 3给出了简化的PWM模式下的定时器框图。每个定时器有4个比较/捕获寄存器(CCRy,这里的y表示定时器其中某一个CCR),可以提供4路独立的PWM信号,即OCyREF。在PWM1和PWM2模式下,变化的计数器不断与CCRy进行比较。假设计数器采用加计数方式,当计数器的值TIMx_CNT小于TIMx_CCRy时,PWM信号保持高电平。当TIMx_CNT不断增加,直到大于TIMx_CCRy时,PWM变成低电平。TIMx_CNT继续增加,当达到TIMx_ARR预设的值后,复位返回0值。
显然,从TIMx_CHy引脚输出的PWM信号的占空比,即高电平由TIMx_CCRy决定,其周期/频率由TIMx_ARR决定。
实际编程时要稍微复杂一些。首先要设定定时器工作在PWM模式下(例如PWM1),并且以加计数方式进行计数操作,然后设定PWM采用边缘对齐方式。最后选择适当的工作数据,即PWM频率和占空比。
三,代码说明
文件motor.c是电机控制的驱动程序。根据电路图,小车的两个电机的控制引脚分别为:
电机1: 驱动引脚为PB12/PB13, PWM控制引脚为PB0;
电机2: 驱动引脚为PB14/PB15, PWM控制引脚为PB1;
两个电机共用一个定时器,通用定时器TIMER3,作为PWM源。分别使用定时器的比较寄存器3和4(CCR3/CCR4)作为占空比的控制。定时器工作在PWM1模式下,PWM信号的频率为20KHz(72MHz/3600)。
为使用motor.c,你需要在相应的.c文件中包含motor.h。如下的电机控制函数足以应付一般的应用。
1. 函数void Init_Motor(void);
初始化电机驱动的各个引脚和TIMER3。在使用电机前调用。
2. 函数void Motor_Stop(void);
电机制动函数。
3. 函数void Set_Motor_Speed(int16_t LSpeed, int16_t RSpeed);
电机速度控制函数。输入变量是左右电机的转速,即PWM的占空比。需要注意的是,当电机的负载不同的时候,同样的PWM占空比并不意味着相同的转速。占空比保持不变的情况下,负载越大转速越低。
工程代码: Ex3-Motor.rar
工程4: 电机转速的测量 (转到这里)