STM32PWM小结

PWM:通俗的讲,就是对高地电平持续时间的控制。

 

              图1

 

 

如上图所示,当计数值<CCR时,被判定为低电平。当,CCR<计数值<ARR时,被判定为高电平。

 

第一步,先初始化PWM的时基函数  HAL_TIM_PWM_Init(&tim3_handler);这个函数的入口参数tim3_handler是个指针,又回到了TIM_HandleTypeDef这个结构体,把Instance和Init进行相关的初始化。

第二步,配置完初始化函数之后,接下来就是配置通道函数。HAL_TIM_PWM_ConfigChannel(&tim3_handler,&TIM3_OC_Handler,TIM_CHANNEL_4);

第三步:使能定时器,相当于启动定时器。HAL_TIM_PWM_Start(&tim3_handler,TIM_CHANNEL_4);

三个步骤可以放到一个函数中,进行书写。

void TIM3_PWM_Init()
{
    
    tim3_handler.Instance = TIM3;
    tim3_handler.Init.CounterMode = TIM_COUNTERMODE_UP;
    tim3_handler.Init.Prescaler = 90-1;
    tim3_handler.Init.Period = 500-1;    //可理解为自动装载值,ARR.
    HAL_TIM_PWM_Init(&tim3_handler);
    
    TIM3_OC_Handler.OCMode = TIM_OCMODE_PWM1;
    TIM3_OC_Handler.OCPolarity = TIM_OCPOLARITY_LOW;
    TIM3_OC_Handler.Pulse = 250;
    HAL_TIM_PWM_ConfigChannel(&tim3_handler,&TIM3_OC_Handler,TIM_CHANNEL_4);
    HAL_TIM_PWM_Start(&tim3_handler,TIM_CHANNEL_4);
}
void TIM_SetCompare(u32 compare)
{
    TIM3->CCR4 = compare;
}

 

定时器时钟和通道IO口时钟可以在回调函数中进行。HAL_TIM_PWM_MspInit

 

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM3 )
    {    
        __HAL_RCC_TIM3_CLK_ENABLE();
        __HAL_RCC_GPIOB_CLK_ENABLE();
        GPIO_InitTypeDef GPIO_Initure;
        GPIO_Initure.Pin=GPIO_PIN_1;            //PA9
        GPIO_Initure.Mode=GPIO_MODE_AF_PP;        //复用推挽输出
        GPIO_Initure.Pull=GPIO_PULLUP;            //上拉
        GPIO_Initure.Speed=GPIO_SPEED_FAST;        //高速
        GPIO_Initure.Alternate=GPIO_AF2_TIM3;    //复用为USART1
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);           //初始化PB1
    }
}

 

PWM的相关配置已经完毕,就可以写主函数了

 

int main(void)
{
    u8 dir=1;
    u16 led0pwmval=0;  
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED 
    KEY_Init();                     //初始化按键
    TIM3_PWM_Init();
    
    while(1)
    {    
        delay_ms(10);         
        if(dir)led0pwmval++;                //dir==1 led0pwmval递增
        else led0pwmval--;                //dir==0 led0pwmval递减 
        if(led0pwmval>300)dir=0;            //led0pwmval到达300后,方向为递减
        if(led0pwmval==0)dir=1;            //led0pwmval递减到0后,方向改为递增
        TIM_SetCompare(led0pwmval);    //修改比较值,修改占空比
    
    }
}

主函数中前面的初始化和按键,LED的初始化差不多

主要是while大循环里面的语句。可以看到dir这个关键的变量,起着灯光亮度由亮变暗,暗变亮的作用。

   TIM_SetCompare(led0pwmval);    //修改比较值,修改占空比这个函数正好和图1是相对应的,
                                                                                                                          2019-10-14
                                                                                                                            21:49:58
posted @ 2019-10-14 21:50  DY_木子  阅读(919)  评论(0编辑  收藏  举报