PWM模板子程序
// 启用 TIM2 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 启用 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置 GPIOA Pin 0 为复用推挽输出模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置 TIM2 为内部时钟模式
TIM_InternalClockConfig(TIM2);
// 配置 TIM2 时间基准
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 99; // 定时器周期 (ARR)
TIM_TimeBaseStructure.TIM_Prescaler = 719; // 定时器预分频器 (PSC)
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // 重复计数器
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 配置 TIM2 为 PWM 模式
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM1 模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
TIM_OCInitStructure.TIM_Pulse = 50; // 脉冲宽度 (CCR)
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
// 启用 TIM2 定时器
TIM_Cmd(TIM2, ENABLE);
注:如果想要改变PWM的占空比,可以写一个子函数来改变。
TIM_SetCompare1()
函数可以用来改变PWM的占空比。在STM32中,使用定时器的PWM模式时,可以通过改变比较寄存器的值来调整占空比。对于定时器的通道1,使用 TIM_SetCompare1()
函数来设置比较寄存器的值即可实现占空比的调节。
此时CCR的值已经不起作用了,给0即可。
子函数如下
// 设置 TIM2 的 PWM 占空比
void TIM2_PWM_Set_duty_cycle(uint16_t duty_cycle)
{
TIM_SetCompare1(TIM2, duty_cycle);
}
在主函数里调用即可
注:如果想要改变PWM的频率,可以写一个子函数来改变。
可以使用 TIM_PrescalerConfig()
函数来改变 PWM 的频率。
PWM 的频率与定时器的时钟频率和周期有关,而预分频器正是用来控制定时器的时钟频率的。通过调节定时器的预分频器的值,可以改变定时器的时钟频率,从而影响 PWM 的频率。
一般来说,PWM 的频率计算公式如下:
PWM频率=定时器时钟频率预分频器×(定时器周期+1)PWM频率=预分频器×(定时器周期+1)定时器时钟频率
因此,通过调整预分频器的值,可以改变 PWM 的频率。
子函数如下
// 设置TIM2定时器的PWM频率
void TIM2_PWM_Set_frequency(uint16_t Prescaler)
{
TIM_PrescalerConfig(TIM2, Prescaler, TIM_PSCReloadMode_Immediate);
}
在主函数里调用即可
注:
在PWM中,ARR(Auto-reload Register)、PSC(Prescaler)、CCR(Capture/Compare Register)是三个重要的寄存器,用于配置定时器的工作模式和PWM输出的参数。下面简要介绍一下它们的作用以及如何计算它们的值:
ARR(Auto-reload Register):ARR 寄存器设置了定时器的周期。它决定了 PWM 波形的周期长度。ARR 的值与定时器的时钟频率和所需的 PWM 周期相关。计算公式:PWM 周期 = ((ARR + 1) * (定时器时钟周期))
PSC(Prescaler):PSC 寄存器设置了定时器的预分频系数。它可以用来调整定时器的时钟频率,从而改变 PWM 的频率。计算公式:定时器时钟周期 = (定时器输入时钟频率) / (PSC + 1)
CCR(Capture/Compare Register):CCR 寄存器设置了 PWM 的占空比。CCR 的值与 PWM 波形的占空比相关。计算公式:PWM 占空比 = (CCR / (ARR + 1)) * 100%
下面是一个简单的示例,演示如何计算 ARR、PSC 和 CCR 的值来生成特定频率和占空比的 PWM 信号:
假设我们要生成一个 PWM 信号,频率为 1 kHz,占空比为 50%。假设定时器的输入时钟频率为 72 MHz。
首先计算 ARR 的值,根据所需的 PWM 周期计算:
PWM 周期 = 1 / 1 kHz = 1 ms
ARR = PWM 周期 * (定时器输入时钟频率) - 1 = 0.001 s * 72 MHz - 1 = 71999接下来计算 PSC 的值,以便将定时器的时钟频率调整为所需的 PWM 频率:
定时器时钟周期 = (72 MHz) / (PSC + 1)
PSC = (72 MHz / 1 kHz) - 1 = 71最后,根据所需的占空比计算 CCR 的值:
PWM 占空比 = 50%
CCR = (PWM 占空比 / 100%) * (ARR + 1) = 0.5 * (71999 + 1) = 36000
这样,我们就计算出了生成特定频率和占空比的 PWM 信号所需的 ARR、PSC 和 CCR 的值。