OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 一步一步学习自平衡小车

共8条 1/1 1 跳转至

一步一步学习自平衡小车

菜鸟
2015-06-03 21:50:27    评分

自平衡小车是一个很好的学习课题,这次比赛是个极好的机会。论坛里后不少是在校的学生,都是为了学习参与进来。我打算写些有助于学习帖子,从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

Ex1-LED.rar


工程2:基于串口的调度台

小车控制板上从J3引出了TTL电平的UART,可以通过USB转TTL串口的接口板与PC相连。这样就可以用PC上的超级终端/PuTTY一类的工具对小车进行控制。控制命令大家可以自由发挥。

这个工程建立了调度台的基本框架。控制命令的例子后续跟上。

Ex2-UART-Console.rar


工程3:电机控制


一,        电机的驱动

我们这里要讨论的是直流电机。直流电机的工作非常简单,在其两个电极上加上规定的的额定电压,电机就转动起来。反转输入电压的极性,电机就向相反的方向转动。

由于直流电机的转子/定子都是由线圈构造而成,需要很大的电流才能推动,因此电源或者驱动源要具备足够的推动能力。CPUIO引脚无法提供足够的电流,所以需要通过一个驱动电路实现对直流电机的驱动。常见的直流电机驱动芯片有很多种,例如L294/N298。本小车采用的是TB6612。无论哪一种,其基本原理都是相同的。驱动电路的核心是一组桥式开关,如图 1所示。由于4个开关和电机构成的电路很像字母H,这个电路被称作H桥。



电机接在开关桥的中间,通过控制四个开关的通断,就可以实现对电机的正转,反转的控制。 2说明了电机转动的关系。 1给出了所有的开关组合,显然电源短路的情况是要避免的。


TB6612是一个双H桥电机驱动集成电路。它内部集成了两组H桥,可以同时控制两个电机。对于每一组H桥,它有4个输入控制信号:IN1,IN2,PWMStandby。他们的逻辑关系由表 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源。分别使用定时器的比较寄存器34CCR3/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: 电机转速的测量 (转到这里)




院士
2015-06-04 09:12:01    评分
2楼
资源已通过,这是要开辟教程系列喽~~

菜鸟
2015-06-12 22:43:40    评分
3楼

学习了



助工
2015-06-12 23:57:11    评分
4楼

大赞  不错  值得学习


院士
2015-06-15 09:19:44    评分
5楼
后续呢

助工
2015-08-17 08:09:28    评分
6楼

为何我下载源程序后,放入工程文件会出现头文件无法加入的情况?



菜鸟
2015-12-21 14:21:12    评分
7楼
感觉不算特别详细呀!因为像我这样小白的人很多,所以希望能详细点,更方便学习。不过还是谢谢啦!

菜鸟
2016-07-08 00:13:34    评分
8楼
收藏了!

共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]