MCU:stm32f429zgt6,使用HAL库开发,由于HAL库封装完善,所以将本工程移植到别的mcu平台是十分轻松的,懂其逻辑,其实移植到相关得硬件平台都是比较快速的。
步骤1:打开stm32cubeMX,设置外部时钟晶振。
默认设置为MCU运行的最高频率,STM32F429ZGT6的主频为180MHz,其他芯片照葫芦画瓢就ok
设置为stlink烧录模式,防止烧录一次后,芯片神秘锁住,如果被锁住,就在掉电状态下,按住boot按键,然后再上电,即可烧录。
接下来打开定时器的编码器模式,编码器模式的作用:主要是实现对电机旋转,使其电机所带的编码器的模块输出的脉冲值进行捕获技术,包括后面的位置环也是依靠编码器来实现的,通过单位时间内记录的脉冲数值的多少来实现对电机的测速。
Encoder Mode 设置为Encoder Mode Tl1 and Tl2,作用可以理解为获取更多的编码器值,从而提高精度。
Input Filter 设置为10,可以看情况设置,作用主要是对获取的脉冲值进行滤波,提高数据的稳定性
其他参数可以默认。
设置PWM,控制电机。
打开TIM3,设置通道1为pwm输出通道。
设置PWM参数,主要涉及一下几个参数。
Prescaler 分频系数 180-1
Counter Period 重装载值 2000-1
autu-relad perload 自动重装 Enable
Pulse 占空比 0
pwm 的计算
机器周期:TIM3的频率为90MHz / 45 = 2MHz = 0.5us
pwm周期:0.5us * 重装载值:2000 = 1ms -= 1KHz
占空比习惯于在软件中自行设置,所以这里默认为0。
打开一下TIM6 ,设置它为周期为1ms。当然,如果你想直接让他作为pid计算的频率,也可以设置为20ms。
计算公式和上面的PMW差不多。
TIM6的时钟频率为90MHz / 主分频值 90 = 1us 。 1us * 重装载值 1000 = 1ms。
记得打开TIM6 的中断,否则后续的PID计算将不能正常进行。
接下来就是打开串口1,将数据显示上报到电脑上位机
设置两个GPIO,用于控制电机的正反转
外设到这里就基本上初始化完成啦。
点击左上角的GENERATE CODE 就可以生成相应得KEIL代码啦。
接下来就是相关的代码编辑了。
先对其进行初始化,由于代码已经有了注释,所以在这里就不在进行赘述了。
接下来在tim6的中断回调函数中进行20ms一次的PID计算。
本文章的代码开源,如果代码中有上面问题希望大家可以多多担待,欢迎大家在评论区中讨论。=
说明:从开源中来到开源中去,感谢其他数不清的开源博主的奉献精神,本文章借鉴了很多开源文章,本人只是为了大家更加快速的可以在代码中实现速度环PID,如有侵权,麻烦告知,本人一定配合原作者的意愿进行修改。