STM32 PWM的输出与Keil软件仿真

STM32 PWM的输出

脉冲宽度模式(PWM模式)可以用来产生一个由TIMx_ARR寄存器确定平率,由TIMx_CCRx寄存器确定占空比的信号。在STM32开发中,由于官方提供了较为完善的库函数,使得我们的开发工作变得相当的轻松,甚至可以在不需要太多了解硬件结构的条件下,完成我的开发工作,实现我们所需要的功能。在此,笔者也建议大家,在初学的时候尽量去熟悉固件库中提供的函数来调节PWM的频率和占空比,对底层寄存器的操作应尽量减少。

本文使用的STM32F103RB的芯片,输出通道是TIM2_CH2通道,STM32有较强的可移植性,如果读者的芯片类型跟我不一样,可以做适当的修改,完成自己的开发。

使用到的库函数有:
stm32f10x.h:用以系统的初始化,无论做什么开发,该库必须包含
stm32f10x_tim.h:TIM定时器库函数
stm32f10x_rcc.h:时钟配置库函数
stm32f10x_gpio.h:GPIO配置库函数

由以上的库函数可知,我们需要初始化的内容有TIM2定时器,时钟使能配置,GPIO的使能配置。

void RCC_Config(void);
void GPIO_Config(void);
void TIM_Config(void);

接下来就是编写各个函数的函数体,在这些内容里面,其实官方已经给出了示例,我们按照官方给的函数库进行配置,然后修改一下官方的一些变量属性即可。

RCC_Config函数体

void RCC_Config(void)
{
        //使能GPIOA,TIM2
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
}

GPIO_Config函数体

void GPIO_Config(void)
{
//GPIO的配置,官方库有给出需要配置的一些参数,如果忘记了,参照一下即可,我这里配置的是GPIOA_Pin_1
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
}

TIM_Config函数体
在配置函数体之前,先了解一下stm32的占空比以及频率是如何计算的
①频率:我们使用的APB1时钟源是72MHz的,在此我们不做分频,通过配置相关的参数来设置输入频率,计算方法:输入频率=APB1时钟/(预分频系数+1)=72000000Hz/360=200000Hz
②TIM_TImeBaseStructure.TIM_Period参数决定了输出PWM波形的频率,输出PWM波形的频率=定时器的输入频率/TIM_TImeBaseStructure.TIM_Period,本例程20000Hz/100=200Hz,即5ms一个周期
③配置占空比:占空比=配置占空比的值/ TIM_TImeBaseStructure.TIM_Period,以此计算来确定占空比,本案例的占空比为50/100=50%
④定时器使能

void TIM_Config(void)
{
        TIM_TimeBaseInitTypeDef TIM_TImeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;

    //配置TIM2的时钟输出频率,以及其它相关参数初始化
        TIM_TImeBaseStructure.TIM_Prescaler=360-1;//设置PWM的频率
        TIM_TImeBaseStructure.TIM_CounterMode=0;
        TIM_TImeBaseStructure.TIM_Period=100;
        TIM_TimeBaseInit(TIM2,&TIM_TImeBaseStructure);


    //设置PWM的输出方式
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
        TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;   
    //配置占空比
        TIM_OCInitStructure.TIM_Pulse=50;

        TIM_OC2Init(TIM2,&TIM_OCInitStructure);
        TIM_ForcedOC1Config(TIM2,TIM_ForcedAction_Active);
        TIM_Cmd(TIM2,ENABLE);
        TIM_CtrlPWMOutputs(TIM2,ENABLE);

}

由此,我们的整个PWM配置完成
Main函数

int main()
{
        RCC_Config();
        GPIO_Config();
        TIM_Config();
        while(1)
        {
                ;
        }
}

接下来,我们讲解一下,在Keil里面看我们的GPIOA_Pin_1引脚的输出频率,波形

Keil软件仿真

①配置调试工具
STM32 PWM的输出与Keil软件仿真_第1张图片

②打开调试,并设置并检测GPIO的输出引脚
这里写图片描述
STM32 PWM的输出与Keil软件仿真_第2张图片
STM32 PWM的输出与Keil软件仿真_第3张图片

③全速运行,观察示波器
STM32 PWM的输出与Keil软件仿真_第4张图片
STM32 PWM的输出与Keil软件仿真_第5张图片

STM32-PWM输出源码下载地址
STM32固件库3.5版本使用手册的中文翻译版

你可能感兴趣的:(stm32)