2、pwm.c
#include "pwm.h"
void pwm_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//PB0定时器3的通道4
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
//配置,PB0的GPIO模式推挽复用输出模式
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//定时器配置,产生频率,50Hz-60Hz 100Hz
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//72MHz/7200=10000
TIM_TimeBaseInitStructure.TIM_Period = 10000/100-1; //计数范围0-99
TIM_TimeBaseInitStructure.TIM_ClockDivision =0;
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
//重映射先关掉JTAG引脚,先作为普通IO口
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
//GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//重映射
//
/*
PWM1模式配置:TIM3的通道3配置
CNT:计数值
CCR:比较值
REF:输出引脚参考电平
PWM模式1 :向上计数:CNT<CCR,REF置有效电平,CNT>=CCR时,REF置无效电平
向下计数:CNT>CCR,REF置无效电平,CNT<=CCR时,REF置有效电平
PWM模式2 :向上计数:CNT<CCR,REF置无效电平,CNT>=CCR时,REF置有效电平
向下计数:CNT>CCR,REF置有效电平,CNT<=CCR时,REF置无效电平
*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1 ;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//PWM输出使能
TIM_OCInitStructure.TIM_Pulse = CCR;//设置比较值,比较值决定占空比 值的范围由计数值决定
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High ;//有效电平为高电平
TIM_OC4Init(TIM3, &TIM_OCInitStructure);//0-50-99,0-55的值为高电平,>55的为低电平
//使能预装载寄存器
TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
//使能自动重装载寄存器
TIM_ARRPreloadConfig(TIM3,ENABLE);
//使能TIM3计数
TIM_Cmd(TIM3,ENABLE);
}
|