首页 LMVE论坛 资讯 插画 时光机 我的社区 用户 搜索

[HAL库]HAL库 硬件PWM

无闻风
发表于 2019-06-27 14:06:07
0
150

使用cube mx配置好pwm参数

例如现在用定时器1的通道1输出一个pwm

这里是定时器频率 

GPIO设置

频率与占空比设置

频率等于定时器频率除于第一次分频再除于第二次分频

配置完成以后需要:

HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_n);//启动n通道的pwm

调节占空比和频率的方法: 

 freq(uint16_t) : 频率(Hz),函数内换算成配置值

void set_pwm_value(uint16_t freq,uint16_t duty)
{
    htim2.Init.Period = (1000000/freq)-1;
    if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

    TIM_OC_InitTypeDef sConfigOC;
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = ((100000/freq)-1)*duty;
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
    {
        _Error_Handler(__FILE__, __LINE__);
    }
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
}

占空比等于周期*高电平时间

使用寄存器法:

void Set_PWM_Value(uint16_t freq,int duty)
{
    TIM1->ARR = (uint32_t)((72000000/freq)-1);
    TIM1->CCR1 = (uint32_t)(((72000000/freq)-1)*(duty)/100);
}

寄存器法讲解:

72000000就是配给这是定时器的时钟

pwm输出的频率就等于 (72000000/pwm设定的频率)-1

占空比等于 pwm输出频率*占空比/100(这里duty=10占空比就是%10)

 

调试遇到的问题:

一开始定时器的时钟1000000的时候无法输出5%的占空比

经过计算这时候TIM1->CCR1的值只有0.9所有是没有输出的

解决方法就是定时器时钟加大 或者pwm频率减小

 

最后修改 2019-06-27 14:06:07
0
150
用户评论
一起折腾