一、首先确保接线和硬件没问题,并确定控制逻辑
测试单片机-驱动板-电机连线是否接通:控制板IN1,IN2一个接3.3V一个接GND,ENA1接3.3V测左电机;控制板IN3,IN4一个接3.3V一个接GND,ENA2接3.3V测右电机。
在电机已经安装完毕的情况下,分别记录小车前进时驱动器IN1、IN2、IN3、IN4的逻辑电平,且使用IN1、IN2控制左电机,IN3、IN4控制右电机。
二、简单的介绍下定时器吧,无论是电机调速所需的PWM还是编码器(码盘)解码都需要定时器
STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。
划重点,为什么使用定时器?因为定时器的运行不占用CPU计算资源!
三、用单片机控制电机
1.1先用 TIM3的两个(因为有两个电机)通道CH1(PA6)、CH2(PA7)输出PWM 参考我的另一篇文章;
使用的电机驱动板控制逻辑:

1.2 另外使用4个引脚(PG0、1、2、4)进行输出控制,使两个轮子一正传一反转配置如下:

生成代码后需要在main.c开启PWM,下载代码后理想情况下差速底盘会原地转圈。

四、轮速里程计数学模型(两轮差速)
4.1 AB相编码器波形输出原理图 参考

4.2 结合我使用的硬件参数:基础脉冲11,减速比34,175rpm(转/s)。并且程序用4倍频解码(一个脉冲周期能捕获4个信号)

假设t时间内输出了y个信号,求电机转的圈数x: (1),则速率x':
(2);左右轮子的转速:
,
(3)
4.3 小车的速度及航迹推演:

将(2)(3)代入v和w的计算式,可消除t,得,
补充:y为利用滴答定时器(毫秒级)每隔一段时间t进行读取定时器的捕获值。
至于为啥用滴答而不使用TIM定时器,可参考chatGPT给出的回答


五、STM32工程源码
(待上传到gitee,后续更新链接)



![[SSD固态硬盘技术 19] 谁是数据的守护神? 盘内RAID1/RAID5图文详解_盘内数据冗余保护](https://img-blog.csdnimg.cn/img_convert/6f214260a60b403ea71d60d89e55bb6b.png)














