打印
[其他ST产品]

stm32直流电机PID控制hal库(Cubemx)

[复制链接]
1274|78
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 花间一壶酒sd 于 2023-10-27 01:19 编辑

前言
本人才疏学浅、文笔浅薄,对于pid调节和Cubemx的使用大多都是末学肤受,请您斧正!

这次我们使用的电机驱动芯片是TB213A;
我采用的芯片是stm32f401,使用的电机为MG513P10 12V,还需要20kΩ和33kΩ的电阻后面会说到。
本文使用的是Cubemx生成的基于hal库的开发,暂未采用Freertos操作系统。

一、进行pwm输出和相关引脚的配置
1.PWM输出配置
PWM的频率大概是10KHZ,CK_CNT=TIMXCLK/(PSC+1)。所以我们将预分配系数为0,arr寄存器的值为8400-1;

对“auto-reload preload”的设定值的一个提示:
auto-reload preload=Disable:自动重载寄存器写入新值后,该计数值立刻生效,作为当前计数周期的溢出值。
auto-reload preload=Enable:自动重载寄存器写入新值后,存放在预装载寄存器中,该值不会马上生效,计数器按照原来旧的溢出值进行计数。当计数溢出后,该计数值才会生效(由预装载寄存器转入影子寄存器),开始新的计数周期
一般而言:预装载功能在多个定时器同时输出信号时比较有用,可以确保多个定时器的输出信号在同一个时刻变化,实现同步输出。单个定时器使用时,一般不开启预装载功能。


版权声明:本文为CSDN博主「林叔叔336」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_59953808/article/details/128431703

使用特权

评论回复
沙发
花间一壶酒sd|  楼主 | 2023-10-27 01:04 | 只看该作者
2.电机控制引脚配置
对于定时器而言除了红色位置需要修改以外其他地方不需要修改。(其他基础配置不做解析)。
TB213A需要两个引脚来控制电机的正反转以及停止所以我们在定义两个gpio为输出:
(为了方便我们使用user label)

使用特权

评论回复
板凳
花间一壶酒sd|  楼主 | 2023-10-27 01:04 | 只看该作者

使用特权

评论回复
地板
花间一壶酒sd|  楼主 | 2023-10-27 01:04 | 只看该作者
TB213A还有一个STBY引脚他需要使能高电平,直接接入单片机的vcc+即可。

使用特权

评论回复
5
花间一壶酒sd|  楼主 | 2023-10-27 01:05 | 只看该作者
用户代码文件编写
我们在MDK_ARM文件夹下创建一个user的文件夹(我们会在这个文件夹中加入自己写的相关文件),并在次文件夹下分别创建moto.c moto.h文件,打开工程并将文件添加在keil文件中(这里不在赘述如何添加)
在文件中我们找到89行:添加如下代码

使用特权

评论回复
6
花间一壶酒sd|  楼主 | 2023-10-27 01:05 | 只看该作者

使用特权

评论回复
7
花间一壶酒sd|  楼主 | 2023-10-27 01:05 | 只看该作者
并在moto.c中写入控制正反转的函数:

使用特权

评论回复
8
花间一壶酒sd|  楼主 | 2023-10-27 01:05 | 只看该作者
在主函数中开启pwm以及确定正反转就可以了

使用特权

评论回复
9
花间一壶酒sd|  楼主 | 2023-10-27 01:05 | 只看该作者
通过encoder来获取当前转速
stm32芯片有硬件编码器功能,所以得到转速很方便。得到转速有几种方法:
常用的编码器测速方法一般有三种:M 法、T 法和M/T 法。

M 法:又叫做频率测量法。这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。设编码器单圈总脉冲数为C,在时间T0 内,统计到的编码器脉冲数为M0,则转速n 的计算公式为:N=M0/(C*T0)
公式中的编码器单圈总脉冲数C 是常数,所以转速n 跟M0 成正比。这就使得在高速测量时M0变大,可以获得较好的测量精度和平稳性,但是如果速度很低,低到每个T0 内只有少数几个脉冲,此时算出的速度误差就会比较大,并且很不稳定。也有一些方法可以改善M 法在低速测量的准确性,上一节提到的增量式编码器倍频技术就是其中一种,比如原本捕获到的脉冲M0 只有4 个,经过4 倍频后,相同电机状态M0 变成了16 个,也就提升了低速下的测量精度。

使用特权

评论回复
10
花间一壶酒sd|  楼主 | 2023-10-27 01:08 | 只看该作者
T 法:又叫做周期测量法。这种方法是建立一个已知频率的高频脉冲并对其计数,计数时间由捕获到的编码器相邻两个脉冲的间隔时间TE 决定,计数值为M1。设编码器单圈总脉冲数为C,高频脉冲的频率为F0,则转速n 的计算公式为:

使用特权

评论回复
11
花间一壶酒sd|  楼主 | 2023-10-27 01:08 | 只看该作者
公式中的编码器单圈总脉冲数C 和高频脉冲频率F0 是常数,所以转速n 跟M1 成反比。从公式可以看出,在电机高转速的时候,编码器脉冲间隔时间TE 很小,使得测量周期内的高频脉冲计数值M1 也变得很少,导致测量误差变大,而在低转速时,TE 足够大,测量周期内的M1 也足够多,所以T 法和M 法刚好相反,更适合测量低速。

使用特权

评论回复
12
花间一壶酒sd|  楼主 | 2023-10-27 01:09 | 只看该作者
M/T 法:这种方法综合了M 法和T 法各自的优势,既测量编码器脉冲数又测量一定时间内的高频脉冲数。在一个相对固定的时间内,计数编码器脉冲数M0,并计数一个已知频率为F0 的高频脉冲,计数值为M1,计算速度值。设编码器单圈总脉冲数为C,则转速n 的计算公式为:

使用特权

评论回复
13
花间一壶酒sd|  楼主 | 2023-10-27 01:09 | 只看该作者
由于M/T 法公式中的F0 和C 是常数,所以转速n 就只受M0 和M1 的影响。电机高速时,M0 增大,M1 减小,相当于M 法,低速时,M1 增大,M0 减小,相当于T 法。

使用特权

评论回复
14
花间一壶酒sd|  楼主 | 2023-10-27 01:09 | 只看该作者
编码器encouder配置

使用特权

评论回复
15
花间一壶酒sd|  楼主 | 2023-10-27 01:09 | 只看该作者
如图所示我们打开一个新的定时器(因为stm32是不允许同一个定时器又用到pwm输出功能和编码器功能,所以开一个新的定时器,我用的是TIM4),我们开启encoder mode,然后选择四倍频,滤波我们填写10。

使用特权

评论回复
16
花间一壶酒sd|  楼主 | 2023-10-27 01:10 | 只看该作者
霍尔编码器会输出两路方波信号,如果只在通道A的上升沿计数,那就是1倍频;通道A的上升、下降沿计数,那就是2倍频;如果在通道A、B的上升、下降沿计数,那就是4倍频。
使用倍频可以最大程度地利用两路信号,提高测速的灵敏度

使用特权

评论回复
17
花间一壶酒sd|  楼主 | 2023-10-27 01:10 | 只看该作者
定时器中断配置
我们还需再打开一个定时器用来计时间隔

使用特权

评论回复
18
花间一壶酒sd|  楼主 | 2023-10-27 01:10 | 只看该作者
这里我们这样配置是为了每10ms(及100HZ)检测速度;并且要打开中断(NVIC)

使用特权

评论回复
19
花间一壶酒sd|  楼主 | 2023-10-27 01:10 | 只看该作者
串口发送配置
由于我们现在需要通过串口打印出相应的代码,所以我们加入usart

使用特权

评论回复
20
花间一壶酒sd|  楼主 | 2023-10-27 01:10 | 只看该作者
霍尔编码器输出说明
在本实验中由于霍尔编码器的输出的高电平为5v为了保护单片机我们这里使用一个及其简单的分压电路即可。(一个33kΩ另一个20kΩ)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

1129

帖子

2

粉丝