目录
一.
1.硬件组成
2.模块分析
1.TB6612电机驱动模块
2.直流减速电机
3.电源稳压模块
二.接线
三.代码思路讲解(详见源码)
四.STM32cubmx配置
1.系统基础配置:(重要)
2.电机旋转方向引脚配置
3.TIM1每10ms触发一次的定时器中断
4.TIM4输出pwm
5.TIM3四倍频读取编码器电机脉冲
6.串口1配置
五.源码链接
六.总结
本例程采用了HAL库进行项目开发(主要使用软件CubexMX和keil5),主控使用STM32F1.3c8t6,文章末尾会有代码开源,欢迎各位对文章进行指正和探讨。
最后附有源码地址。
STM32f103c8t6单片机,TB6612电机驱动,稳压模块,直流电机(带霍尔编码器), 12v电池。
1.模块可以驱动两路电机,AO1AO2,BO1BO2各连接一路
2.STBY接高电平,TB6612使能能够驱动电机,STBY接低电平,电机全部停止
3.VM:接12v以内电源
4.VCC:接5v电源
5.GND:接电源负极
6.PWMA和PWMB负责结束PWM来控制电机速度
7.AIN1AIN2和BIN1BIN2用来控制电机正反转,下面是驱动逻辑
1.电机线+和电机线-连接TB6612输出AO或者BO
2.编码器GND和编码器5V连接负极电源和电源5v用来给霍尔编码器供电用于在电机工作时测量电机脉冲.
3.编码器A相,编码器B相。测量电机的旋转速度以及选装方向,这里使用定时器的编码器模式读取AB相发出的脉冲
4.我的型号的电机线数为13减速比为30,也就是电机旋转一圈会发送13 * 30 = 390个脉冲,普通的直流电机一般情况下都是这个脉冲(以商品实际信息为主)
我这里面使用的电池电压为12v这里使用降压模块将12v降压为5v给TB6612供电
这里展示驱动一个编码器电机的示例。大家一定要认真接线,看清楚每一根线的作用,不要随便接线,一不小心就会冒香气(烧毁电机驱动或单片机)
注意这里是我实际的接线,大家可以根据自己单片机的引脚资源合理进行分配。(注意单片机需要与电池共GND来同步电平标准)
TB6612 |
C8T6 |
---|---|
STBY | 高电平(+3.3V) |
AIN1 | PA3 |
AIN2 | PA4 |
PWMA |
PB8 (TIM4-CH3) |
AO1 | 电机电源+ |
AO2 | 电机电源- |
VM | 12V |
VCC | 3.3V |
GND | 和单片机共地 |
编码器
编码器的A、B相 | C8T6 |
---|---|
A相 | PA7 (TIM3-CH1) |
B相 | PA6 (TIM3-CH2) |
1.定时器串口初始化等外设初始化
2.根据设定的期望脉冲通过每10ms触发一次的定时器中断来调用增量式pid函数来根据期望脉冲来调整输出的pwm,直到单片机读取到的脉冲和期望脉冲一致。
初次进行实验时,我对pid期望速度有所疑问。具体疑问是单片机读取到的是电机发送过来的脉冲,我了解到可以使用M法测速将电机转速计算出来,但是无法将转速与pwm进行联系,后来我直接将期望速度改成了期望脉冲,根据期望脉冲的差值来控制pwm,直到达到我想要的效果。
RCC:
SYS:
clock configuration
配置只有电机回车即可
首先设置配置AIN1--PA3, AIN2-PA4的输出引脚:
和TB6612的真值表做对比,电机反转(这里让电机正转或者反转都行)
配置过程:
开启定时器中断
使用TIM4的CH3输出pwm对应PB8引脚
我这里因为没有使用串口接收数据,只是作为发送数据使用,因此没有开启串口中断
到此基本配置已经完成,可以使用STM32cubmx生成代码了。
VOFA上位机查看数据:第一个数字为期望脉冲,第二个为实际脉冲,第三个为输出pwm,第四个为转速
链接:https://pan.baidu.com/s/1Ex-7BXWQoUminx9GFN6wjA
提取码:etqp
这是我第一个基于pid的应用,最初做起来一脸迷茫,只知道原理,却不知道从哪里进行下手不知道如何将pid应用到实践中去,经过读过网上许多大佬的源码和博客,逐渐有了一定理解。