f103 hal库中PWM的使用方法

    技术2022-07-11  89

    1.初始化复用管脚

    void BEEP_Init() { GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_TIM4_CLK_ENABLE(); //使能定时器1 __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOA时钟 GPIO_Initure.Pin=GPIO_PIN_9; //PB9 他有对应的TIM和通道,PWM4_CH4 GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速 HAL_GPIO_Init(GPIOB,&GPIO_Initure); }

    2.初始化并设置对应的PWM

    占空比为100/500 = 20%

    void PWM_Init() { TIM_HandleTypeDef TIM4_Handler; //定时器句柄 TIM4_Handler.Instance=TIM4; //定时器1 TIM4_Handler.Init.Prescaler=72-1; //定时器分频 TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数模式 TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //分频 TIM4_Handler.Init.Period=500-1; //自动重装载值 HAL_TIM_PWM_Init(&TIM4_Handler); //初始化PWM TIM_OC_InitTypeDef TIM4_CH4Handler; //定时器1通道1句柄 TIM4_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1 TIM4_CH4Handler.Pulse=100-1; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50% TIM4_CH4Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高 HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CH4Handler,TIM_CHANNEL_4);//配置TIM1通道1 HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_4); //开启PWM通道1 }

    3.编写TIM_SetTIM4Compare1()函数

    此函数可以直接调用修改TIM4_CH4Handler.Pulse的参数

    void TIM_SetTIM4Compare1(uint32_t compare) { TIM4->CCR4=compare; //第x通道要用CCRx }

    4.整份代码

    #include "beep.h" void BEEP_Init() { GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_TIM4_CLK_ENABLE(); //使能定时器1 __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOA时钟 GPIO_Initure.Pin=GPIO_PIN_9; //PB9 他有对应的TIM和通道,PWM4_CH4 GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速 HAL_GPIO_Init(GPIOB,&GPIO_Initure); } void PWM_Init() { TIM_HandleTypeDef TIM4_Handler; //定时器句柄 TIM4_Handler.Instance=TIM4; //定时器1 TIM4_Handler.Init.Prescaler=72-1; //定时器分频 TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数模式 TIM4_Handler.Init.Period=500-1; //自动重装载值 HAL_TIM_PWM_Init(&TIM4_Handler); //初始化PWM TIM_OC_InitTypeDef TIM4_CH4Handler; //定时器1通道1句柄 TIM4_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1 TIM4_CH4Handler.Pulse=1-1; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50% TIM4_CH4Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高 HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CH4Handler,TIM_CHANNEL_4);//配置TIM1通道1 HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_4);//开启PWM通道1 } void TIM_SetTIM4Compare1(uint32_t compare) { TIM4->CCR4=compare; //第几通道要用CCRx }

    在main.c中直接调用即可

    BEEP_Init(); PWM_Init(); TIM_SetTIM4Compare1(250);
    Processed: 0.012, SQL: 9