stm32RCT6+TB6600驱动器+57电机+增量编码器读取速度值

买的硬石家的步进电机,给的资料都是基于自家开发板的,但是我手头的是Alientek家的stm32,型号是F103RCT6,硬石家的F1-Pro型号是stm32F103ZET6,代码资料当然不能直接用,要参考自己的板子的MCU分布和管脚映射,在把代码原理理解清楚的基础上进行修改。之前玩过一点点单片机,但是没有系统地学过,坑也踩了一些,姑且把这个当做记录贴吧。

拿到器材首先进行硬件连接,比较简单不赘述。

店家给的资料都是基于自家板子的,具体有F1-Mini,F1-Pro, F4-Pro,且官方例程都是基于HAL库的,Alientek的MiniStm32给的官方例程也有HAL库版本的,经过对比发现,F1-Pro版本和我的板子固件库是一致的,所以我的代码都是基于F1-Pro的资料做的修改,修改的范围就是main文件,实验用到的相关硬件驱动文件和中断文件(这个千万不要忘啊,血的教训,别说!别问!妈蛋!)

简单分析一下工程结构

核心的硬件驱动文件就是这三个,第一个用来从串口输出速度值,第二个用来驱动电机旋转,第三个用来接收编码器的信号并处理。

在每个硬件驱动文件代码中都首先定义一个结构体,或者说一个handler,可以将它理解为一个接口,在主函数中可以方便调用。

其实整个过程中最核心的一点就是根据自己板子的硬件端口去修改代码中的相应引脚,其中,部分端口或定时器是有限制的,不能随随便便指定一个。比如驱动步进电机旋转的脉冲信号,它一定要是用中断方式进行输出的,而不是在主程序的循环中进行简单的高低电平赋值,因为我们在电机转动的过程中要测速,如果把旋转的代码写在主函数中,那么在测速的时候旋转一定会停下来的,所以这个方法是行不通的。

在该代码中用的是高级定时器的比较输出模式,这里就有一个限制,我们只能使用TIM1或者TIM8定时器,4个通道都可以,代码中很多处都用到了通道值,且比较分散,所以如果想要更改,千万要细致一点,不要漏掉,再有一个办法就是用宏定义的方式,这也是官方给的程序不好的一点,在通道值这里没有给宏定义而是直接手动赋值,导致在修改的过程中很容易遗漏。

还有一个比较坑的是不要在驱动板和开发板正常连接且都在工作的情况下给开发板烧写代码,这样会造成定时器引脚的损坏(也可能不只是定时器引脚),具体原因我也不清楚,我这样操作了两次把两个高级定时器都烧坏了,我哭哭。可能是烧写过程中引脚和驱动器连接,电平值过高的问题。

如果刚拿到硬件,想测试一下硬件的好坏但又对代码不熟悉,可以直接用LED灯的例程,将LED灯的引脚接到驱动器的pul端,其实驱动器的方向和使能引脚悬空也是可以的,在主函数中将LED灯引脚循环写入高低电平,测试电机是否旋转,如果旋转的话说明驱动板和电机都没有问题,转速的调节可以通过引脚输出脉冲的频率来进行调节,这个过程中需要注意,输出脉冲的频率不能过低,正常情况下一秒钟内输出的脉冲会翻转上万次,所以在高低电平时分别延时30us左右都是可以的。

在移植代码的过程中一定不要忘了中断服务函数,程序都进不了中断还运行个p!我已经被自己的粗心程度彻底折服了。

串口驱动文件不用更改,两个板子的串口端口都是A9和A10,读取编码器的话用的是普通定时器,这个随意性比较大,但是需要注意代码中通道和引脚的一致性。

折腾了一番,做硬件,要么有钱,直接买个配套的新板子,要么有技术,调各种bug不在话下,分分钟解决。如果不满足以上这两种情况,一定要慎重啊啊啊啊!不说了我去哭会。

玩笑归玩笑,其实做硬件还是很考验基本功的,如果对原理和机制比较清楚的话,做起来当然会顺利很多,所以还是要多进行模块化系统化的学习。

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(stm32RCT6+TB6600驱动器+57电机+增量编码器读取速度值)