STM32单片机产生PWM信号
1、开发环境
目标单片机 : STM32F407VET6芯片,系统时钟高达168Mhz
开发平台:KEIL 5
编写程序借助ST公司的标准函数库,不过现在已经不更新这个写函数库了,大部分开发都STM32CubeMX软件直接生成代码使用。但旧的东西(标准函数库)仍然能够使用。
2、目标
PWM称为脉冲宽度调制,可通过修改占空比来控制LED灯的亮度(呼吸灯)
占空比:指在一个脉冲循环的周期内,通电时间相对于总时间所占的比例
配置单片机寄存器来产生PWM
使PA1引脚产生方波,
3、代码
pwm.c文件代码
//TIM5 PWM部分初始化
//PWM输出初始化
//@arr:自动重装值
//@psc:时钟预分频数 单片机168MHz经过系统时钟2分频,PWM外设时钟84MHz/(84-1+1)=1MHz 1us
//功能:由PA1产生占空比50%的方波
void TIM5_PWM_Init(u32 arr,u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //TIM5时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA时钟
GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5); //GPIOA1复用为定时器5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //GPIOA1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA1
TIM_TimeBaseStructure.TIM_Prescaler=psc; //16bit定时器分频 84Mhz/84 = 1MHz
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 1us * 500= 0.5ms溢出时间
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; // 时钟跳动1/168MHz
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化定时器5
//初始化TIM5 Channe2
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC2Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM5 2OC1
TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM5在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM5,ENABLE);//ARPE使能
TIM_Cmd(TIM5, ENABLE); //使能TIM5
TIM_SetCompare2(TIM5,arr/2); //修改比较值,修改占空比50%
}
void main(void)
{
TIM5_PWM_Init(1000-1,84-1); //arr=200 5KHz arr=1000 1Kh
while(1)
{
/*什么也不做*/
}
}