STM32F407配置定时器生成PWM

本文详细介绍了如何在STM32F407上使用STM32CubeMX的HAL库配置定时器进行六步换相,包括定时器的基础配置、时钟源、输出比较模式、主从模式、输出比较通道以及死区时间的设置,以实现直流无刷电机驱动所需的PWM波形。内容深入浅出,适合对STM32定时器感兴趣的读者。
摘要由CSDN通过智能技术生成

STM32系列定时器六步换相配置



前言

在用STM32F407做直流无刷电机驱动器,使用STM32CubeMX生成的HAL库编写。先使用六步换相进行电路板的功能性实验,需要配置STM32定时器输出可靠的PWM波形,并用逻辑分析仪采样观察波形效果。


一、定时器基础配置

定时器的基础配置需要调用HAL_TIM_Base_Init()函数,具体的配置代码如下:

htim1.Instance = TIM1;    //指定需要配置的定时器
htim1.Init.Prescaler = 1;    //定时器的预分频系数
htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3;    //定时器的计数模式,中央对齐模式3
htim1.Init.Period = 4199;    //定时器计数周期值
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;    //定时器分频因子
htim1.Init.RepetitionCounter = 0;    //配置重复计数器寄存器TIMx_RCR
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;    //计数达到指定值后,定时器是否自动重装载计数值
HAL_TIM_Base_Init(&htim1);    //基础配置函数调用

1.Prescaler

定时器的预分频系数,指定定时器的预分频寄存器TIMx_PSC的数值。定时器获得时钟线的时钟之前,将通过该数值对时钟进行分频。例如,定时器从时钟线上获得的时钟为频率为84MHz,Prescaler = 1,则定时器实际时钟频率为84MHz / (1 + 1) = 42MHz。

2.CounterMode

配置TIMx_CR1寄存器的DIR位和CMS[1:0]位,指定定时器的计数模式,共有五种模式,分别是:

模式特征
边沿对齐模式计数器根据方向位 (DIR) 递增计数或递减计数
中心对齐模式1交替递增和递减计数,只在递减计数时可触发中断,DIR寄存器位只读
中心对齐模式2交替递增和递减计数,只在递增计数时可触发中断,DIR寄存器位只读
中心对齐模式3交替递增和递减计数,在递增计数、递减计数时可触发中断,DIR寄存器位只读

3.Period

指定自动重装载寄存器TIMx_ARR的数值,通过这个数值指定PWM的时钟周期。
依据公式:
T= (Period + 1) * (Prescaler + 1) / TIMx_CLK
若Period = 4199,则按照Prescaler = 1计算PWM的时钟周期,得到一个周期的时间
T = (1 + 1) * (4199 + 1) / 84MHz = 0.1ms

4.ClockDivision

指定寄存器TIMx_CR1的CKD[1:0]为的数值,这两个位用于配置定时器时钟(CK_INT)频率和死区发生器以及数字滤波器(ETR、TIx)所使用的死区及采样频率(tDTS)之间的分频比。
ClockDivision的配置

5.RepetitionCounter

配置RCR寄存器(TIMx_RCR),按照手册的说法,这个寄存器在“使能预装载寄存器时,用户可通过这些位设置比较寄存器的更新频率(即,从预装载寄存器向活动寄存器周期性传输数据);使能更新中断时,也可设置更新中断的生成速率。”
https://blog.csdn.net/u010632165/article/details/103880254
根据这篇博客的说法,这个寄存器可以理解为延迟产生更新时间UEV。

二、小内容函数

1.定时器时钟源配置函数

使用STM32单片机内部时钟:

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);

定时器可用的时钟源很多,后面有机会研究研究,下面把可以用的时钟源列在这里:

模式说明
TIM_CLOCKSOURCE_ETRMODE2/!< External clock source mode 2/
TIM_CLOCKSOURCE_INTERNAL/*!< Internal clock source */
TIM_CLOCKSOURCE_ITR0/*!< External clock source mode 1 (ITR0) */
TIM_CLOCKSOURCE_ITR1/*!< External clock source mode 1 (ITR1) */
TIM_CLOCKSOURCE_ITR2/*!< External clock source mode 1 (ITR2) */
TIM_CLOCKSOURCE_ITR3/*!< External clock source mode 1 (ITR3) */
TIM_CLOCKSOURCE_TI1ED/*!< External clock source mode 1 (TTI1FP1 + edge detect.) */
TIM_CLOCKSOURCE_TI1/*!< External clock source mode 1 (TTI1FP1) */
TIM_CLOCKSOURCE_TI2/*!< External clock source mode 1 (TTI2FP2) */
TIM_CLOCKSOURCE_ETRMODE1/*!< External clock source mode 1 (ETRF) */

2.输出比较模式配置函数

代码如下(示例):

HAL_TIM_OC_Init(&htim1);

这个函数调用的参数,是定时器基础配置参数。函数内容主要也是定时器基础功能配置,和上面涉及的函数HAL_TIM_Base_Init(&htim1);功能类似。

3.主从模式配置函数

sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);

主从模式配置函数中指针类型的结构体变量sMasterConfig有两个参数:
1、MasterOutputTrigger
定时器出发输出(TRGO)选择,这是定时器TIM1作为主定时器,向其他定时器发送信号时的信号源选择参数。可以选择量有:

模式说明
TIM_TRGO_RESET/*!< TIMx_EGR.UG bit is used as trigger output (TRGO) */
TIM_TRGO_ENABLE/*!< TIMx_CR1.CEN bit is used as trigger output (TRGO) */
TIM_TRGO_UPDATE/*!< Update event is used as trigger output (TRGO) */
TIM_TRGO_OC1/*!< Capture or a compare match 1 is used as trigger output (TRGO) */
TIM_TRGO_OC1REF/*!< OC1REF signal is used as trigger output (TRGO) */
TIM_TRGO_OC2REF/*!< OC2REF signal is used as trigger output(TRGO) */
TIM_TRGO_OC3REF/*!< OC3REF signal is used as trigger output(TRGO) */
TIM_TRGO_OC4REF/*!< OC4REF signal is used as trigger output(TRGO) */
2、MasterSlaveMode
定时器主从模式选择,主要配置TIMx_SMCR寄存器的MSM位。

三、输出比较函数

为了输出六路PWM信号,需要配置六个通道输出互补的PWM,这里使用下面的配置函数:

sConfigOC.OCMode = TIM_OCMODE_PWM1;   //配置PWM输出模式
sConfigOC.Pulse = 840;   //配置相应通道的CCR寄存器
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;  //配置OCx的输出极性
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;  //配置OCxN的输出极性
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;   //配置快速响应模式
sConfigOC.OCIdleState = TIM_OCIDLESTATE_SET;  //配置OCx的空闲状态
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_SET;  //配置OCxN的空闲状态
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3);

PWM模式1:递增计数,计数器CNT<CCRx时,OCxREF为有效状态,CNT>ARR时,OCxREF为无效状态;
PWM模式2:递增计数,计数器CNT<CCRx时,OCxREF为无效状态,CNT>ARR时,OCxREF为有效状态;


OCPolarity 和OCNPolarity
CC1通道配置为输出时
配置TIMx_CCER的CCxNP位,以CC1NP为例:
CC1NP=1:OC1N低电平为有效电平;
CC1NP=0:OC1N高电平为有效电平;
配置TIMx_CCER的CCxP位,以CC1P为例:
CC1P=1:OC1低电平为有效电平;
CC1P=0:OC1高电平为有效电平;


OCFastMode:配置TIMx_CCMR1的OCxFE位,用于加快出发输入事件对CC输出的影响;


OCIdleState 和OCNIdleState
配置TIMx_CR2寄存器的OISx和OISxN位,以OIS1和OIS1N为例:
OIS1N配置OC1N的输出空闲状态:
OIS1N=0:当MOE=0时,经过死区时间后OC1N=0;
OIS1N=1:当MOE=0时,经过死区时间后OC1N=1;

OIS1配置OC1的输出空闲状态:
OIS1=0:当MOE=0时,(如果OC1N有效,则经过死区时间后)OC1=0;
OIS1=1:当MOE=0时,(如果OC1N有效,则经过死区时间后)OC1=1;

MOE位:TIMx_BDTR的MOE位,用于配置主输出使能;
MOE=0:OC和OC1N输出静止,或强制为空闲状态;
MOE=1:如果OCx和OCxN的相应是使能位(TIMx_CCER 寄存器中的 CCxE 和 CCxNE 位)均置
1,则使能OCx和OCxN的输出


四、死区配置函数

该函数中所有参数都是配置定时器的短路和死区寄存器(TIMx_BDTR)中的位;

sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0x02;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;
HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);

OffStateRunMode :OSSR位,一般为1
运行模式下的关闭状态选择
OSSR = 0:处于无效状态时,禁止 OC/OCN 输出(OC/OCN 使能输出信号=0)。
OSSR = 1:处于无效状态时,一旦 CCxE=1 或 CCxNE=1,便使能 OC/OCN 输出并将其设为无效电
平。然后设置 OC/OCN 使能输出信号=1
OffStateIDLEMode :OSSI位,一般为1
空闲模式下的关闭状态选择
0:处于无效状态时,禁止 OC/OCN 输出(OC/OCN 使能输出信号=0)。
1:处于无效状态时,一旦 CCxE=1 或 CCxNE=1,便将 OC/OCN 输出首先强制为其空闲电
平。然后设置 OC/OCN 使能输出信号=1
LockLevel :锁定配置,分为四个等级,锁定状态越来越高
DeadTime:DTG[7:0]位配置,配置死区发生器
BreakState:BKE位,断路使能,BKE=0:禁止断路输入,BKE=1:使能断路输入
BreakPolarity:BKP位:断路极性配置,BKP=0:断路输入BRK为低电平有效,BKP=1:断路输入BRK高电平有效;
AutomaticOutput:AOE位,AOE=0:MOE只能由软件配置,AOE=1:MOE可以由软件配置,也可在发生下一更新事件时自动置1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值