蓝桥杯嵌入式PWM配置

1.cubemx配置:首先明确是哪个端口需要输出pwm波,找到对应的定时器(TIMx)和channel,设置Clock Source —— Internal Clock;PWM Generation – PWM Generation CHx;预分频器 80-1,计数周期1000-1,PWM pulse 50

2.tim.c中两个函数:
/**

@brief 设置PWM占空比

此函数用于设置TIM2的CH1通道的PWM占空比。占空比的范围为0%到100%。

  • @param Duty 占空比,范围为0.0到100.0。
    */
    void pwm_set_duty(float Duty)
    {
    //TIM2->CCR2:设置TIM2通道2的捕获/比较寄存器
    //(TIM2->ARR + 1):获取当前PWM周期的总"计数步数"
    //(Duty / 100.0f):将百分比转换为小数比例
    TIM2 → CCR2 = (TIM2 → ARR + 1) * (Duty / 100.0f);
    }

/**

@brief 设置PWM频率

此函数用于设置TIM2的PWM频率。频率的单位为Hz。

@param Frequency 频率,单位为Hz。
*/
void pwm_set_frequency(int Frequency)
{
// 获取定时器的时钟频率(假设TIM2使用的时钟频率为TIM2_CLK)
//TIM2->CCR2:设置TIM2通道2的捕获/比较寄存器
uint32_t TIM2_CLK = 80000000;

// 根据输入的频率计算自动重装载寄存器的值
uint32_t ARR_Value = (TIM2_CLK / Frequency) - 1;//ARR_Value + 1 就是新周期的总长度

// 设置自动重装载寄存器
TIM2 → CCR2 = ARR_Value;

// 更新捕获/比较寄存器CCR2,保持当前占空比不变
//TIM2->CCR2 / (TIM2->ARR + 1)
//TIM2->CCR2= 当前高电平时间
//TIM2->ARR + 1= 当前周期的总长度
TIM2->CCR2 = (ARR_Value + 1) * (TIM2->CCR2 / (float)(TIM2->ARR + 1));

//触发更新事件,刷新寄存器
TIM2->EGR = TIM_EGR_UG;
}
3.主函数中,按实际使用的定时器和通道:
HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_x);

1 个赞