【stm32】的PWM外设|学习笔记

PWM简单理解就是生成PWM方波,主要可控的参数有周期,占空比,极性。

stm32内置PWM生成器,我想应该是用TIM加比较器来实现的吧,那么如何实现stm32输出PWM波呢?

一、得知道那些IO可以输出PWM,貌似带TIM的都能直接输出,这个可以在数据手册中查到。

我收头的板子要产生两路+12V/-12V的PWM,我打算用TIM5的CH1和CH4两个通道生成PWM,所以一路接PA0一路接PA3。

二、软件上要配置IO、TIM及比较器。

1.配置IO,mode = AF ,注意一定要开启AF功能GPIO_PinAFConfig();

    GPIO_InitTypeDef     GPIO_InitStructure;
   
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    GPIO_PinAFConfig(PWM_1_PERIPH, GPIO_PinSource0, GPIO_AF_TIM5);
    GPIO_PinAFConfig(PWM_1_PERIPH, GPIO_PinSource3, GPIO_AF_TIM5);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

2.配置TIM5参数,这里主要配置PWM的周期,这里其实配置的是TIM5的周期,也就意味着我的两路PWM是同频率的。这里主要使用到的是分频器Prescaler和倍频器Period两个寄存器,TIM5挂载在APB1上,即PCLK1的频率通过分频与倍频得到想要的PWM周期。

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); 
    TIM_TimeBaseStructure.TIM_Period = 30000;   //周期T=1/30M*30000=1ms
    TIM_TimeBaseStructure.TIM_Prescaler = 0;    //1+0=1分频  所以频率=30M/1=30M
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);

3.配置极性,占空比之类的参数。注意一定要初始化响应的通道,通道1就是TIM_OC1Init();通道4就是TIM_OC4Init();

    TIM_OCInitTypeDef  TIM_OCInitStructure;
    
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择定时器模式:TIM脉冲宽度调制模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
    TIM_OCInitStructure.TIM_Pulse = 3*percent;//占空比=3*percent/30000=percent/10000=(10000-Charger_Config_Infor.u16_CP_PWM)/10000
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出极性:TIM输出比较极性低
    TIM_OC1Init(TIM5, &TIM_OCInitStructure);//初始化外设TIMx_CHx
    TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);//使能TIMx在CCR2上的预装载寄存器
    TIM_ARRPreloadConfig(TIM5, ENABLE);//使能TIMx在ARR上的预装载寄存器
    TIM_Cmd(TIM5, ENABLE);//使能TIMx外设
原文地址:https://www.cnblogs.com/VergilYang/p/8555365.html