赞
踩
整理的该代码可以实现LED灯由亮到暗再由暗到亮的循环过程,PWM经常应用在呼吸灯和小车转速中(此代码可以直接烧录到STM32F03C8T6中)
pwm.C代码
#include "pwm.h" //TIM2 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //*****此处的要设置成跟灯一样的引脚 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 //设置该引脚为复用输出功能,输出TIM2 CH2的PWM脉冲波形 GPIOA1 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6; //TIM2_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO //初始化TIM2 //**********所有的TIM2改成相应的TIMX TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM2 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高(高电平为有效电平) //**************此处是通道,OC2是通道2 TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM2 OC2 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIM2 }
PWM.h代码:
#ifndef _PWM_H_
#define _PWM_H_
#include "sys.h"
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif
main.C代码:
#include "stm32f10x.h" #include <stdio.h> #include "sys.h" #include "led.h" #include "pwm.h" /* 如果要更改别的引脚,首先要找到该引脚是属于哪个定时器的哪个通道 然后去到PWM.C里进行替换更改。 注:在STM32F103C8T6中的 PA7是TIM3-CH2 PA6是TIM3-CH1 */ int main(void) { u16 led0pwmval=0; u8 dir=1; delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//初始化中断向量分组为2:2 uart_init(115200);//初始化串口1的波特率为115200.(使用printf一定要初始化) LED_Init();//LED初始化 TIM3_PWM_Init(500-1,72-1); //不分频。PWM频率=1000000/500=2Khz,一个周期2khz,频率低时看见LED闪烁,并不断变亮,高频时看不见闪烁。 while(1) { delay_ms(10); //延时是为了呼吸灯的呼吸现象更明显 if(dir) led0pwmval++;//LED亮度不断加 else led0pwmval--;//LED亮度不断减 if(led0pwmval>400)//LED有效电平为0-400 dir=0; if(led0pwmval==50) dir=1; TIM_SetCompare1(TIM3,led0pwmval); //设置占空比,通道二,led0pwmval为CCR2,不断移动CCR2,实现占空比调制 //TIM_SetCompare2是通道2,如果是别的通道要改这里!!! } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。