搜档网
当前位置:搜档网 › stm32高级定时器pwm

stm32高级定时器pwm

#include "stm32f10x_rcc.h"
#include "stm32f10x_nvic.h"
#include "stm32f10x_map.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"

void RCC_Configuration_PWM_TIM1()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_TIM1, ENABLE);
}

void GPIO_Configuration_PWM_TIM1()
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PIN A8
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; //pin b13
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //设置为复用浮空输出
GPIO_Init(GPIOB,&GPIO_InitStructure);

}


void TIM_Configuration_PWM_TIM1(short ratio)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

TIM_TimeBaseStructure.TIM_Period = 999; //自动重装载计数器的值
TIM_TimeBaseStructure.TIM_Prescaler = 71; //分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;// 采样分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复寄存器,用于自动更新pwm占空比

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);


TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_Pulse=1000 * ((float)ratio / 100); //设置占空比时间
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //设置输出极性
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //使能该通道输出
//下面几个参数是高级定时器才会用到,通用定时器不用配置
TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_Low; //设置互补端输出极性
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;//使能互补端输出
TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; //死区后输出状态
TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;//死区后互补端输出状态

TIM_OC1Init(TIM1,&TIM_OCInitStructure); //按照指定参数初始化


//死区和刹车功能配置,高级定时器才有的,通用定时器不用配置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;//运行模式下输出选择
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;//空闲模式下输出选择
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //锁定设置
TIM_BDTRInitStructure.TIM_DeadTime = 0X90; //死区时间设置
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable; //刹车功能使能
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;//刹车输入极性
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//自动输出使能

TIM_BDTRConfig(

TIM1,&TIM_BDTRInitStructure);


TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIMx在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能ARR预装载缓冲器
TIM_Cmd(TIM1,ENABLE); //打开TIM2
TIM_CtrlPWMOutputs(TIM1, ENABLE); //pwm输出使能,一定要记得打开
}


/*TIM_OC1PreloadConfig(),TIM_ARRPreloadConfig();这两个函数控制的是ccr1和arr的预装载使能,
使能和失能的区别就是:使能的时候这两个寄存器的读写需要等待有更新事件发生时才能被改变
(比如计数溢出就是更新时间)。
失能的时候可以直接进行读写而没有延迟。
另外在运行当中想要改变pwm的频率和占空比调用:TIM_SetAutoreload()
TIM_SetCompare1()这两个函数就可以了。*/

void PWM_Init_TIM1()
{
RCC_Configuration_PWM_TIM1();
GPIO_Configuration_PWM_TIM1();
TIM_Configuration_PWM_TIM1(80);
}


相关主题