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

文章目录

  • 前言
  • 一、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带有死区的互补输出。

    作者:向上高远

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 CUBEMX配置三相PWM互补输出的电机FOC控制(二)

    发表评论