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)之间的分频比。
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