STM32CubeMX配置TIM输出互补六路PWM

一、定义

1.1 PWM :

脉冲宽度调制模式可以生成一个信号,该信号频率由 TIMx_ARR 寄存器值决定,其占空比则由TIMx_CCRx 寄存器值决定。通过配置定时器和PWM通道的参数,用户可以精确地控制PWM信号的频率、分辨率、占空比等,实现对外围设备如电机、LED灯等的精准控制。STM32PWM还支持多种高级功能,如死区时间控制、相位补偿、互补输出等,进一步提升PWM信号的稳定性和效率。

1.2 时基单元

计数器寄存器 (TIMx_CNT):记录当前的时间数值
预分频器寄存器 (TIMx_PSC):调整定时器计数器的时钟频率。
自动重载寄存器 (TIMx_ARR):当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于’0’时,产生更新事件。更新事件也可以由软件产生。
捕获/比较寄存器(TIMx_CCRx):能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。

1.3 PWM模式

根据 TIMx_CR1 寄存器中的 CMS 位状态,定时器能够产生边沿对齐模式或中心对齐模式的 PWM 信号。
PWM 边沿对齐模式:位 6:5 CMS[1:0]:中心对齐模式选择 (Center-aligned mode selection)
00:边沿对齐模式。计数器根据方向位 (DIR) 递增计数或递减计数。
01:中心对齐模式 1。计数器交替进行递增计数和递减计数。仅当计数器递减计数时,配置
为输出的通道(TIMx_CCMRx 寄存器中的 CxS=00)的输出比较中断标志才置 1。
10:中心对齐模式 2。计数器交替进行递增计数和递减计数。仅当计数器递增计数时,配置
为输出的通道(TIMx_CCMRx 寄存器中的 CxS=00)的输出比较中断标志才置 1。
11:中心对齐模式 3。计数器交替进行递增计数和递减计数。当计数器递增计数或递减计数
时,配置为输出的通道(TIMx_CCMRx 寄存器中的 CxS=00)的输出比较中断标志都会置 1。
在这里插入图片描述
先判断CNT和CRR的关系,再看程序中 sConfigOC.OCPolarity 输出极性是什么高低电平有效。

1.4 死区时间计算

在这里插入图片描述
高级控制定时器可以输出两路互补信号,并管理输出的关断与接通瞬间。这段时间通常称为死区,用户必须根据与输出相连接的器件及其特性(电平转换器的固有延迟、开关器件产生的延迟…)来调整死区时间:
位 7:0 DTG[7:0]:配置死区发生器 (Dead-time generator setup)
此位域定义插入到互补输出之间的死区持续时间。DT 与该持续时间相对应。
DTG[7:5]=0xx => DT=DTG[7:0]x tdtg,其中 tdtg=tDTS。
DTG[7:5]=10x => DT=(64+DTG[5:0])xtdtg,其中 Tdtg=2xtDTS。
DTG[7:5]=110 => DT=(32+DTG[4:0])xtdtg,其中 Tdtg=8xtDTS。
DTG[7:5]=111 => DT=(32+DTG[4:0])xtdtg,其中 Tdtg=16xtDTS
在这里插入图片描述
死区DTG最大配置为FF(1111 1111):以0x54为例,CKD一分频
0x54 = 01010100
[7:5] = 010符合DT=DTG[7:0]xtdtg
DTG[7:0] = 84(01010100)
tdtg = tDTS = 1/168MHZ
DT = 84 X 1/168MHZ = 500ns

二、中心对称模式互补输出+中断功能

2.1 配置

在这里插入图片描述
在stm32cubemx左侧找到Timers:选中TIM1
Clock Soure配置为内部时钟:nternal Clock
PWM的互补输出要占用TIM1的三个通道:
通道1选择PWM Generation CH1 CH1N(CH1为PWM的输出通道,CH1N为PWM互补输出的通道)。
通道2选择PWM Generation CH2 CH2N(CH2为PWM的输出通道,CH2N为PWM互补输出的通道)。
通道3选择PWM Generation CH3 CH3N(CH3为PWM的输出通道,CH3N为PWM互补输出的通道)。
开启刹车功能
在这里插入图片描述
PSC:41
模式:中心对齐模式 1
ARR:125(中心对齐模式配置时ARR不用-1)
自动重装载:使能
BRK State:刹车使能
BRK Polaryity:刹车有效电平
死区时间:0X54
CH1:PWM1模式 CRR:25 占空比:20%
CH2:PWM1模式 CRR:50 占空比:40%
CH3:PWM1模式 CRR:75 占空比:60%

Tout = (ARR+1)X(PSC+1)/Ft = 160Mhz/(42x125) = 32KMhz
由于配置的是中心模式,上升+下降计数所以周期需要除以2:32/2=16KMhz
Tout是定时器溢出时间(PWM周期)、Ft是定时器的时钟源频率、ARR是自动重装载寄存器的值、PSC是预分频器寄存器的值

2.2 代码

tim.c:进入中断,
GPIO进行引脚电平反转,i++

#include "tim.h"

TIM_HandleTypeDef htim1;         
uint8_t i = 0;

void MX_TIM1_Init(void)
{
   
  TIM_ClockConfigTypeDef sClockSourceConfig = {
   0};
  TIM_MasterConfigTypeDef sMasterConfig = {
   0};
  TIM_OC_InitTypeDef sConfigOC = {
   0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {
   0};
  
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 41;                                    //分频值    
  htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;      //计数模式
  htim1.Init.Period = 125;                                      //自动重载值
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;            //分频因子,死区用
  htim1.Init.RepetitionCounter = 0;                             //重复计数值
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; //自动重载值,预重载
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
   
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
   
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  {
   
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
   
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;             //工作模式
  sConfigOC.Pulse = 25;                           //比较值
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;     //有效电平(H\L)
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;   //互补通道,设置一样会相反
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;      //关闭快速模式
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;  //设置空闲电平
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;//设置互补通道空闲电平
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
   
    Error_Handler();
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值