目录
参考链接
STM32定时器基本原理_hurryddd的博客-CSDN博客_stm32定时器
一、原理
直接看图吧,清晰明了,CNT为计数器计数值,ARR为重装载寄存器的重装载值,CCRX为捕获比较(值)寄存器(x=1,2,3,4)设置的比较值。CNT<CCRx时输出低电平,CNT>CCRx时输出高电平
二、配置过程
在输入捕获配置中,除了要配置 选择要使用的定时器(TIM1~TIM5、TIM8),选择计时器的时钟源为内部时钟(CK_INT)、根据要定时的时间计算预分频系数(TIMx_PSC)、自动重装载值(TIMx_ARR)、内部时钟的分频系数以外,更重要的还需要配置:
TIMx_CCRx:捕获比较(值)寄存器(x=1,2,3,4),设置比较值。
TIMx_CCMRx:捕获/比较模式寄存器,设置 OC1M[2:0]位:对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】
PWM模式1:在向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
PWM模式2:在向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为有效电平,否则为无效电平
三、C语言示例程序
比如将Timer3的通道4配置成PWM输出
/* TIM3_CH4 泵PWM控制 init function */
void MX_TIM3_Init(void)
{
LL_TIM_InitTypeDef TIM_InitStruct = {0};
LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
/**TIM2 GPIO Configuration
PB1 ------> TIM3_CH4
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_1;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
LL_GPIO_AF_RemapPartial_TIM3();
/*TIM2*/
TIM_InitStruct.Prescaler = 71;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 49;
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
LL_TIM_Init(TIM3, &TIM_InitStruct);
LL_TIM_EnableARRPreload(TIM3);
/* TIM1 interrupt Init */
NVIC_EnableIRQ(TIM3_IRQn);
LL_TIM_SetCounter (TIM3, 0);
// LL_TIM_EnableIT_UPDATE (TIM3);
// LL_TIM_ClearFlag_UPDATE(TIM3);
LL_TIM_EnableCounter (TIM3);
/*PWM*/
LL_TIM_SetClockSource (TIM3, LL_TIM_CLOCKSOURCE_INTERNAL);
LL_TIM_OC_EnablePreload(TIM3, LL_TIM_CHANNEL_CH4);
TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM2;
TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_ENABLE;
TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.CompareValue = 35;
TIM_OC_InitStruct.OCPolarity = LL_TIM_OCIDLESTATE_LOW;
LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH4, &TIM_OC_InitStruct);
LL_TIM_OC_DisableFast (TIM3, LL_TIM_CHANNEL_CH4);
LL_TIM_SetTriggerOutput (TIM3, LL_TIM_TRGO_RESET);
LL_TIM_DisableMasterSlaveMode(TIM3);
}
/*
*设置PWM的频率和占空比
*ARR决定PWM频率,PULSE比较值决定PWM占空比
*频率 = TCCLK72M /(Autoreload + 1) * (Prescaler + 1) psc = 71
*Arr = 10^6 / 频率 - 1. 频率单位为KHZ,所以 Arr = 1000 / 频率 - 1
*
*比较值 0 - Arr 对应占空比 0 - 100%
*/
void Set_Timer3_PWM(uint16_t Freq, uint16_t Pulse)
{
uint16_t Arr = 0, CompareValue = 0;
Arr = 1000 / Freq - 1;
CompareValue = Arr * Pulse / 100;
LL_TIM_SetAutoReload(TIM3, Arr);
LL_TIM_OC_SetCompareCH4(TIM3, CompareValue);
}