文章目录

前言一、STM32 CUBEMX 配置STM32G431 MCU的基本设定。1、配置APB2外设频率。2、配置STM32G431 TIMER1的设定。3、输出工程文件

二、添加程序代码。1、程序添加LL库。2、添加运行代码。

三、验证波形1、查看输入输出波形2、查看死区功能和时间:

总结

前言

本文在电机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带有死区的互补输出。

精彩文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: