STM32-PWM输出

    脉冲宽度调制,简称PWM。是一种利用数字信号来进行模拟信号的输出,拥有多种模式。主要的原理就是利用数字信号的高低电平的周期性变化来改变输出电压的平均值。从而达到模拟信号的输出模式。主要引用于电机调速,调光灯电路控制中。
    在STM32中拥有多路PWM信号。每一个定时器的输出引脚都可以设置成相应的PWM信号的输出。PWM信号主要的参数有两个,周期的占空比。周期主要是由对应的定时器来确定。占空比就是PWM输出高电平的时间。假设现在定时的周期为2MS,在2MS中通过设置其中1MS引脚输出高电平。这样就可以说这个PWM的占空比为50%。
    在程序运行中可以使用TIM_SetCompare1()来改变相应的占空比。这样就可以实现灵活的控制PWM信号的输出。

#include "Time.h"
#include "stm32f10x.h"

void TIM4_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruc; 
    TIM_TimeBaseInitTypeDef TIM_struct;
    TIM_OCInitTypeDef TIM_ocinit;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);        //打开TIM4的时钟

    GPIO_InitStruc.GPIO_Mode=GPIO_Mode_AF_PP;                         
    GPIO_InitStruc.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8| GPIO_Pin_9;
    GPIO_InitStruc.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStruc);                                               //初始化PWM信号的输出引脚


    GPIO_InitStruc.GPIO_Mode=GPIO_Mode_Out_PP;                         
    GPIO_InitStruc.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStruc.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruc);   

    TIM_struct.TIM_Period=999;                                                          //设置定时器周期 72/72*1000 为1MS
    TIM_struct.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_struct.TIM_ClockDivision=TIM_CKD_DIV1 ;
    TIM_struct.TIM_Prescaler=71;                                                        //定时器72分频

    TIM_TimeBaseInit(TIM4,&TIM_struct);
    //TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);

    TIM_ocinit.TIM_OCMode=TIM_OCMode_PWM1;                                  //设置PWM模式为1
    TIM_ocinit.TIM_Pulse=200;                                                               //设置PWM初始占空比
    TIM_ocinit.TIM_OutputState=TIM_OutputState_Enable;          //使能pWM输出使能
    TIM_ocinit.TIM_OCPolarity=TIM_OCPolarity_High;                  //设置PWM信号极性

    TIM_OC1Init(TIM4,&TIM_ocinit);
    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

    TIM_OC2Init(TIM4,&TIM_ocinit);
    TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);

    TIM_OC3Init(TIM4,&TIM_ocinit);
    TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

    TIM_OC4Init(TIM4,&TIM_ocinit);
    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);

    TIM_Cmd(TIM4,ENABLE);
}
void TIM_PWM_Con(u16 DR1,u16 DR2,u16 DR3,u16 DR4)
{
    TIM_SetCompare1(TIM4,DR1);                                      //改变PWM的占空比
    TIM_SetCompare2(TIM4,DR2);
    TIM_SetCompare3(TIM4,DR3);
    TIM_SetCompare4(TIM4,DR4);
}

你可能感兴趣的:(STM32)