STM32F103 PWM输出实验(HAL库)

Posted sovagxa&静默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103 PWM输出实验(HAL库)相关的知识,希望对你有一定的参考价值。

1、芯片输出PWM波形打码步骤

  1.0主函数

int main(void)
{     
    HAL_Init();                             //初始化HAL库    
    Stm32_Clock_Init(RCC_PLL_MUL9);       //设置时钟,72M
    delay_init(72);                       //初始化延时函数
    uart_init(115200);                    //初始化串口
    LED_Init();                            //初始化LED    
    TIM1_PWM_Init(20000,72);                //72分频,即1M 。 1000000/20000 = 50 Hz ,即20ms
       while(1)
    {
        TIM_SetTIM1Compare1(1500);
    } 
}

 

  1.1初始化输出PWM波形的定时器和IO口(例程使用定时器1的通道1,输出在PA8)

  

GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM1_CLK_ENABLE();            //使能定时器1
__HAL_RCC_GPIOA_CLK_ENABLE();            //开启GPIOA时钟        
GPIO_Initure.Pin=GPIO_PIN_8;               //PA8
GPIO_Initure.Mode=GPIO_MODE_AF_PP;      //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);     

  1.2初始化定时器1,HAL库中,使用定时器的 PWM 输出功能时, HAL 库为我们提供了一个独立的定时器初始化函数 HAL_TIM_PWM_Init ()

TIM_HandleTypeDef     TIM1_Handler;          //定时器句柄 
TIM1_Handler.Instance=TIM1;             //定时器1
TIM1_Handler.Init.Prescaler=psc;           //定时器分频
TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
TIM1_Handler.Init.Period=arr;              //自动重装载值
TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM1_Handler);           //初始化PWM

  1.3初始化通道并开启PWM

TIM_OC_InitTypeDef     TIM1_CH1Handler;    //定时器1通道1句柄
TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM1_CH1Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高  
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH1Handler,TIM_CHANNEL_1);
//配置TIM1通道1 HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_1);//开启PWM通道1

  1.4提供设置比较值的函数

//设置TIM1通道1的占空比
//compare:比较值
void TIM_SetTIM1Compare1(u32 compare)
{
    TIM1->CCR1=compare; 
} 

 

2、输出PWM原理及代码解释

  设置PWM周期和一个比较值,技术过程中比较值和计数值进行比较,判断输出有效电平还是无效电平,达到输出PWM波的目的。

  如图CRRx是比较值,ARR是重装值(达到该值重装为0)

 

  2.1时钟和IO口初始化略。

  2.2在定时器初始化中。

TIM1_Handler.Init.Prescaler=psc;           //定时器分频

 

   所述分频将时钟频率分为更小的频率,如STM32F103是设置72M的时钟频率,设置psc=72分频,得到1M时钟频率。

TIM1_Handler.Init.Period=arr;              //自动重装载值

 

  在设置arr=20000重装初值,由公式1M/20000=50Hz,即周期T=20ms 。

TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式

 

  设置计数方式为向上计数逐一增加从0到19999。此时得到的是20ms就重装初值的定时器。

  2.3在通道1初始化及PWM开启代码中

TIM1_CH1Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1

  选择的PWM模式:PWM模式1:计数值<比较值时输出有效电平,计数值>比较值输出无效电平。

TIM1_CH1Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%

  设置比较值,供计数值比较。

TIM1_CH1Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高

  设置有效电平是高电平还是低电平。

 

3、总结

  本文章主要讲述了HAL库输出PWM波形的代码编写,提供了改变比较值的函数,使用户可以动态的改变PWM并行占空比。

 

以上是关于STM32F103 PWM输出实验(HAL库)的主要内容,如果未能解决你的问题,请参考以下文章

基于霸道秉火的STM32F103ZET6嵌入式开发之------基于定时TIM3的PWM实验

创建STM32F103ZET6的HAL库工程

STM32F103定时器最多可以输出多少路PWM波

STM32F103五分钟入门系列(十五)输入捕获(精雕细琢-.-)

STM32F103ZET6 PWM输出

STM32F103 使用TIM3产生四路PWM