电机FOC控制(二)STM32 CUBEMX 配置三相PWM互补输出

本文详细介绍了如何使用STM32CUBEMX配置STM32G431MCU的TIMER1进行PWM互补输出,包括APB2外设频率设置、TIMER1参数配置,以及程序代码的添加和死区功能验证。
摘要由CSDN通过智能技术生成


前言

本文在电机FOC控制(一)STM32 CUBEMX RCC配置基础上,继续讲述如何对STM32G431 MCU使用STM32 CUBEMX进行 PWM互补输出配置,并且验证输出波形。此工程采用STM32G431高级定时TIMER1进行PWM互补输出设定,并带有死区和刹车功能。


一、STM32 CUBEMX 配置STM32G431 MCU的基本设定。

1、配置APB2外设频率。

根据STM32G431手册,TIMER1隶属于APB2时钟总线,故对APB2时钟进行设定,设定STM32G431的外设总线APB2为最高运行频率170MHz。

STM32G431说明手册:
在这里插入图片描述
STM32 CUBEMX时钟配置:
在这里插入图片描述

2、配置STM32G431 TIMER1的设定。

Timer1基本模式设定说明如下:
在这里插入图片描述
Slave Mode : 此项是配置Timer1为从定时器模式,计数器开始计数触发条件由主定时器触发,此工程配置为Disable,不使用从定时器模式,不需要别的定时器触发,具体可参考说明手册。
Trigger Source: 与Slave Mode 配合使用,指定Timer1计数器触发计数由哪路信号输入,配置为Disable,具体可参考说明手册。
Clock Source: 此配置是选取Timer1的时钟源,配置为内部时钟,由APB2产生,一个脉冲来了,计数器加减1。
Channel1: 设定为PWM Generation CH1 CH1N 互补输出模式。
Channel2: 设定为PWM Generation CH2 CH2N 互补输出模式。
Channel3: 设定为PWM Generation CH3 CH3N 互补输出模式。
Channel4: 设定为PWM Generation No Output,没有引脚输出。
Active Break Input: 使能刹车功能,并且选择PA6为刹车输入引脚。

Timer1配置参数设定说明如下:
在这里插入图片描述
Prescaler: 对Timer1进行预分频设定,设定为(1-1),即** Timer1的运行频率为APB2频率/1 = 170MHz/1 = 170MHz。
Count Mode: 设定为中心对齐模式1,模式:每来一个时钟脉冲,计数器由0开始做加法计数到最高点,然后开始做减法,计数到0。
Dithering: PWM抖动模式,这个可以Disable,此工程没有用到。
Counter Period: 计数周期,决定计数的最高点。目前设定PWM频率为16KHz,所以,170MHz/16KHz = 10625,由于是中心对齐模式,其计数的最高点为:10625/2 - 1 = 5312 - 1;这个PWM频率则为16KHz。
CKD: 这个不是对时钟频率进行分割,而是对输入捕获功能下,数字滤波器的频率进行分割,滤除一些噪声,这个选项不用管。
RCR: 重复计数功能,这个功能本质就是设置TIMER1定时器溢出多少次再产生一个更新中断,在PWM频率很高,ADC采样和进行计算时间不够的情况下可以设定这个数值,以满足要求,此工程采用16KHz,并且STM32G431计算速度还不错,不需要理会。
Auto-reload preload: 用于控制PWM模块在计数器溢出时是否自动加载已预先加载的值。开启:计数器在溢出时会自动加载已预先加载的值。禁用:计数器在溢出时不会自动加载已预先加载的值。

Matser/Slave Mode: 设定为Disable,不使用主从模式。
Trigger Event Selection TRGO: 选择TRGO信号的事件源,当事件源满足条件时,就会产生一个触发输出,可以将该输出信号连接到其他定时器或外设的启动输入端,以实现多个定时器或外设同步工作。本工程选择由Channel4比较信号触发ADC信号采样。
Trigger Event Selection TRGO2: 此工程未采用,随意设置,选择复位信号,作为触发信号,当复位产生时,TRGO2输出触发信号。

Break state: 刹车功能开启,设定:ENABLE。
Break polarity: 刹车判定极性:LOW。当刹车输入信号为低电平时候,触发刹车功能。
Break_IO mode selection: 如设定为Input,break引脚只可作为输入;若设定为Bidirectional,break引脚既可以作为刹车输入信号,也可以作为产生刹车后的输出信号。本工程只作为刹车输入信号,设定为input即可。
Digital Input Polarity: 输入极性是否反向,High:正常逻辑。Low:反向逻辑。

其他刹车功能设定说明如下:
在这里插入图片描述
其他刹车功能采用默认值。
Break2功能不开启。

刹车后状态及死区设定说明如下:
在这里插入图片描述
Automatic Output State: 刹车信号失效后,互补的 PWM 是否要自动恢复输出,设定Disable,不恢复输出。
OSSR: 若互补通道有一个使能,一个禁用(CCxE=1,CCxNE=0),则使能的端口正常输出PWM波,禁用的端口的状态与OSSR相关。
OSSI: 使能后,PWM Generation ChannelX配置里面的CH_IDLE_STATE和CHN_IDLE_STATE的状态才有效,用于设定刹车后的管脚输出状态。OSSI不使能,刹车后的管脚输出半高阻态,这时候CH_12IDLE_STATE和CHN_IDLE_STATE的设置无任何效果。
Lock Configuration: 使能代码配置Lock保护级别(Lock Level 3的保护级别最高)后,在下次重启前相关输出配置不能被修改。
DeadTime Preload: 死区时间预加载使能,一般设置为Enable。
Dead Time: 死区时间的设置,此项设置为20。
Asymmetrical DeadTime: 死区时间对称使能。设置为不使能Disable。

设定PWM Channel1、Channel2、Channel3互补输出设定都相同,其说明如下:
在这里插入图片描述
Mode: 设定为PWM mode 1,模式1表示当计数值Counter小于CCR时,PWM波输出有效电平;模式2表示当计数值Counter大于CCR时,PWM输出有效电平。
Pulse: 这里就是设置CCR寄存器的值。为PWM周期的1/4,占空比为50%,更改此值,可以更改PWM波形占空比。
Output compare preload: CCR寄存器的预装载使能,使能寄存器缓冲。
Fast Mode: 快速输出管脚电平,此工程不使能。
CH Polarity:
设定CH有效电平的极性,HIGH是高电平有效,LOW是低电平有效。PWM波形和这个设定有关系。
CHN Polarity:
设定CHN有效电平的极性,HIGH是高电平有效,LOW是低电平有效。PWM波形和这个设定有关系。
本工程开发板采用Fortior Tech(峰岹)FD2103S预驱芯片,时序逻辑图如下所示,故CH Polarity:High;CHN Polarity:Low。

在这里插入图片描述
CH Idle State: 当PWM不输出或者空闲时的状态,SET为高电平,RESET为低电平。
CHN Idle State: 当PWM不输出或者空闲时的状态,SET为高电平,RESET为低电平。

设定PWM Channel4,其说明如下:

在这里插入图片描述
Mode: 设定为PWM mode 2,当计数值Counter大于CCR时,PWM输出有效电平,与PWM mode 1相反。
Pulse: 设定在脉冲宽度,进行信号输出。

3、输出工程文件

检查工程文件名称和存放目录,没有问题,点击Generate Code。
在这里插入图片描述


二、添加程序代码。

1、程序添加LL库。

LL库是对HAL库的补充。其存放的目录在HAL库文件夹中。
在这里插入图片描述

2、添加运行代码。

在main.h文件中,增加语句:

  #include "stm32g4xx_ll_bus.h"
  #include "stm32g4xx_ll_rcc.h"
  #include "stm32g4xx_ll_system.h"
  #include "stm32g4xx_ll_adc.h"
  #include "stm32g4xx_ll_tim.h"
  #include "stm32g4xx_ll_gpio.h"
  #include "stm32g4xx_ll_usart.h"
  #include "stm32g4xx_ll_dac.h"
  #include "stm32g4xx_ll_dma.h"
  #include "stm32g4xx_ll_comp.h"
  #include "stm32g4xx_ll_opamp.h"
  #include "stm32g4xx_ll_cordic.h"

在main.c文件中增加以下语句:

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
	
	LL_TIM_EnableCounter(TIM1);
  /* Enable PWM channel */
  LL_TIM_CC_EnableChannel(TIM1, TIMxCCER_MASK_CH123);
	
  /* Main PWM Output Enable */
  TIM1->BDTR |= LL_TIM_OSSI_ENABLE;
  LL_TIM_EnableAllOutputs(TIM1);
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		LED_RUN();
		
  }
  /* USER CODE END 3 */
}

三、验证波形

1、查看输入输出波形

本工程开发板采用Fortior Tech(峰岹)FD2103S预驱芯片,所以输入端为同高同低,输出则为高低互补输出,通过示波器观察波形及验证。
由STM32G431引脚输入FD2103S逻辑端波形:

在这里插入图片描述
FD2103S输出到MOS管栅极波形:

在这里插入图片描述

2、查看死区功能和时间:

PWM信号输入波形:
在这里插入图片描述
MOS栅极端电压波形:
在这里插入图片描述


总结

本工程成功通过STM32 CUBEMX 实现了基于STM32G431 MCU的三相PWM带有死区的互补输出。

  • 48
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值