打印
[其他ST产品]

六步换向、FOC,STM32cubemx从零开始搭建BLDC六步换相代码、FOC代码

[复制链接]
1886|39
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
、前言
用作备忘录,也希望能帮助正在入门摸索的朋友少走弯路,从外设开始,到开环,到闭环。
参考文章代码:正点原子、野火、硬石,三家文档几乎一样。(个人感觉原子文档写的好)
1 个人经验
刚开始学无刷电机控制时是直接去看的FOC,网上理论一大堆,看了几天,理论大概明白了,想去实践编程,发现都是大多都是电机库,或者一些别人的完整代码,没有步骤教学。经过一顿摸索,我的结论是把理论化为单片机代码实际去控制电机的过程,某种程度上比学习理论更困难。
我个人做一些单片机小项目的习惯是从头开始做。从一个空白工程开始,一个外设一个外设的调,调通一个测试一个,要用的所有外设调完再去加入控制代码,由开环到闭环,一步一步的来。直接用别人写好的一套代码总感觉心里没底。
对于无刷电机控制,我的步骤是这样的:1调霍尔传感器,2调PWM,3调开环控制,4调闭环
2 软硬件介绍
软件:STM32cubemx+keil5
硬件:网上买的一块无刷电机驱动板,芯片是STM32G070。要注意的是我的电机是BLDC,2对极,间隔60度安装的霍尔传感器。所以我现在实现的都是 基于霍尔传感器的开闭环控制。暂时没整过基于编码器的、基于无感的。
一、六步换相
六步换向用到的单片机外设:(根据个人板子引脚要做一些修改)
TIM3:选择霍尔传感器模式,用于获取3个霍尔值。
TIM1:通道123,普通PWM模式,用于驱动半桥电路的3个上半桥。(因为我这边用的是HPWM-LON的控制。)
普通IO:3个,推挽输出,用于驱动半桥电路的3个下半桥。
USART2:用于调试用。
RTC:用于闭环控制。(这个用RTC中断可能不太合适,但是暂时这样…)
代码整体的调用流程:
开环:电机转动换相时,触发霍尔中断,在霍尔中断回调函数里读取当前的相位值,然后根据相位值进行换相。
闭环:在开环的基础上,再开一个定时器,在里边做PID运算,更改占空比设定值。
六步换向-开环控制代码:https://github.com/wyfroom/BLDC_LiuBu_KaiHuan_hall
六步换向-闭环控制代码:

使用特权

评论回复
评论
甲虫666 2024-1-30 16:36 回复TA
———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/weixin_44029896/article/details/128006602 
沙发
甲虫666|  楼主 | 2024-1-30 16:36 | 只看该作者
新建cubemx工程

使用特权

评论回复
板凳
甲虫666|  楼主 | 2024-1-30 16:37 | 只看该作者
2 工程基础配置
(1)RCC时钟配置
选择时钟源,我这块板子只有外部8M晶振。

使用特权

评论回复
地板
甲虫666|  楼主 | 2024-1-30 16:37 | 只看该作者
手动输入最大时钟频率,然后回车。我这块板子是64M。

使用特权

评论回复
5
甲虫666|  楼主 | 2024-1-30 16:37 | 只看该作者
(2)SYS 调试接口
我的下载器是SWD两根线的,所以我选这个。

使用特权

评论回复
6
甲虫666|  楼主 | 2024-1-30 16:37 | 只看该作者
(3)工程设置,生成MDK工程

使用特权

评论回复
7
甲虫666|  楼主 | 2024-1-30 16:37 | 只看该作者

使用特权

评论回复
8
甲虫666|  楼主 | 2024-1-30 16:38 | 只看该作者
点击生成代码

使用特权

评论回复
9
甲虫666|  楼主 | 2024-1-30 16:38 | 只看该作者
3 串口
这快板子没显示屏,调试中串口还是很有必要。
我这块板子是串口2,看好引脚,串口自动配置的引脚不一定是板子上的。比如我这块板子,就不是这两引脚。

使用特权

评论回复
10
甲虫666|  楼主 | 2024-1-30 16:38 | 只看该作者
(1)cubemx配置

使用特权

评论回复
11
甲虫666|  楼主 | 2024-1-30 16:38 | 只看该作者
(2)printf重映射
添加如下代码到工程的 usart.c 文件中的 /* USER CODE BEGIN 0 / 和 / USER CODE END 0 */之间。
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
    //具体哪个串口可以更改huart1为其它串口
    HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1 , 0xffff);
    return ch;
}

使用特权

评论回复
12
甲虫666|  楼主 | 2024-1-30 16:39 | 只看该作者
在main.c里添加头文件 #include <stdio.h>

使用特权

评论回复
13
甲虫666|  楼主 | 2024-1-30 16:39 | 只看该作者
之前忘记说了,这个printf重映射要在keil里也设置一下,不然一使用printf单片机就会卡死。

使用特权

评论回复
14
甲虫666|  楼主 | 2024-1-30 16:39 | 只看该作者
(3)测试
在main的while里加入如下代码
printf("hello\r\n");
HAL_Delay(1000);

使用特权

评论回复
15
甲虫666|  楼主 | 2024-1-30 16:39 | 只看该作者

使用特权

评论回复
16
甲虫666|  楼主 | 2024-1-30 16:39 | 只看该作者

使用特权

评论回复
17
甲虫666|  楼主 | 2024-1-30 16:39 | 只看该作者
4 霍尔传感器
(1)Cubemx配置
32定时器有一种霍尔模式,专门为无刷电机霍尔控制整的叭。

使用特权

评论回复
18
甲虫666|  楼主 | 2024-1-30 16:40 | 只看该作者
打开定时器中断

使用特权

评论回复
19
甲虫666|  楼主 | 2024-1-30 16:40 | 只看该作者
更改引脚名称(可选),为了编程方便

使用特权

评论回复
20
甲虫666|  楼主 | 2024-1-30 16:40 | 只看该作者
(2)初始化启动
在main中加入下面启动代码。

__HAL_TIM_ENABLE_IT(&htim3,TIM_IT_TRIGGER);  //触发:有某个信号触发。
__HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE);   //更新:有某个寄存器被更新。
HAL_TIMEx_HallSensor_Start_IT(&htim3);

使用特权

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

本版积分规则

8

主题

135

帖子

0

粉丝