一、目的
在正点原子精英版上使用通用定时器TIM3产生PWM控制DS0的亮度。
二、分析
脉冲宽度调制(PWM),简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
本实验中利用TIM3的CH2输出来控制DS0的亮度,TIM3_CH2默认接在PA7上,而DS0接在PB5上,所以需要通过重映射功能将TIM3_CH2映射到PB5上。
三、程序设计
PWM设置初始化步骤:
(1)开启TIM3时钟以及复用功能时钟。
(2)配置GPIOB.5为复用推挽输出。
(3)设置TIM_CH2重映射到PB5。
(4)初始化TIM3。
(5)设置PWM模式。
(6)使能TIM3。
(7)使能预装载寄存器。
void TIM3_PWM_init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitSturct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSturct;
TIM_OCInitTypeDef TIM_OCInitSturct;
/*****************时钟使能*****************/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //使能GPIO和AFIO复用功能时钟
/****************配置GPIOB.5模式***************/
GPIO_InitSturct.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitSturct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitSturct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitSturct);
/****************设置TIM_CH2重映射到PB5*************/
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //TIM3部分重映射
/******************初始化TIM3*****************/
TIM_TimeBaseInitSturct.TIM_ClockDivision = TIM_CKD_DIV1; //
TIM_TimeBaseInitSturct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitSturct.TIM_Period = arr; //自动重装载值
TIM_TimeBaseInitSturct.TIM_Prescaler = psc; //预分频值
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitSturct);
/*****************设置PWM模式**************/
TIM_OCInitSturct.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitSturct.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
TIM_OCInitSturct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OC2Init(TIM3,&TIM_OCInitSturct); //初始化TIM3 OC2
/*****************使能TIM3***************/
TIM_Cmd(TIM3,ENABLE);
/******************使能预装载寄存器*************/
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
}
主函数
int main(void)
{
u16 led0_pwmval = 0; //pwm比较值
u8 dir = 1;
delay_init();
LED_init();
TIM3_PWM_init(899,0);
while(1)
{
delay_ms(10);
if(dir)
led0_pwmval++;
else
led0_pwmval--;
if(led0_pwmval > 300)
dir = 0;
if(led0_pwmval == 0)
dir = 1;
TIM_SetCompare2(TIM3,led0_pwmval);
}
}