分享

STM32F103学习笔记 (八) PWM输出

 贝天公馆 2016-09-06


脉冲宽度调制(PWM),是对脉冲宽度的控制。

STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定
时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4
路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出!
本实验是利用 TIM3 的通道 2,把通道 2 重映射到 PB5, 产生 PWM 来控制 DS0 的亮度。
TIM3_CH2 默认是接在 PA7上面的,而我们的 DS0 接在 PB5 上面,可以通过重映射功能,把 TIM3_CH2
映射到 PB5 上。
关于重映射,有一个TIM3的重映射表:


每个通道都是映射到固定的GPIO口上。
下面是关于time.c文件:
[csharp] view plain copy
  1. //TIM3 PWM 部分初始化  
  2. //PWM 输出初始化  
  3. //arr:自动重装值  
  4. //psc:时钟预分频数  
  5. void TIM3_PWM_Init(u16 arr,u16 psc)  
  6. {  
  7. GPIO_InitTypeDef GPIO_InitStructure;  
  8. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  9. TIM_OCInitTypeDef TIM_OCInitStructure;  
  10. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //①使能定时器 3 时钟  
  11. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|  
  12. RCC_APB2Periph_AFIO, ENABLE);  //①使能 GPIO 和 AFIO 复用功能时钟  
  13. GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //②重映射 TIM3_CH2->PB5  
  14. //设置该引脚为复用输出功能,输出 TIM3 CH2 的 PWM 脉冲波形 GPIOB.5  
  15. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  //TIM_CH2  
  16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出  
  17. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  18. GPIO_Init(GPIOB, &GPIO_InitStructure); //①初始化 GPIO  
  19. //初始化 TIM3  
  20. TIM_TimeBaseStructure.TIM_Period = arr;  //设置在自动重装载周期值  
  21. TIM_TimeBaseStructure.TIM_Prescaler =psc;  //设置预分频值  
  22. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim  
  23. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式  
  24. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //③初始化 TIMx  
  25. //初始化 TIM3 Channel2 PWM 模式  
  26. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2  
  27. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能  
  28. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高  
  29. TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //④初始化外设 TIM3 OC2  
  30. TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载寄存器  
  31. TIM_Cmd(TIM3, ENABLE);  //⑤使能 TIM3  
  32. }  
主函数:

[csharp] view plain copy
  1. int main(void)  
  2. {  
  3. u16 led0pwmval=0;  
  4. u8 dir=1;  
  5. delay_init();   //延时函数初始化   
  6. NVIC_Configuration();  //设置 NVIC 中断分组 2:2 位抢占优先级, 2 位响应优先级  
  7. uart_init(9600);  //串口初始化波特率为 9600  
  8. LED_Init();  //LED 端口初始化  
  9. TIM3_PWM_Init(899,0); //不分频,PWM 频率=72000/900=8Khz  
  10.  while(1)  
  11. {  
  12. delay_ms(10);  
  13. if(dir)led0pwmval++;  
  14. else led0pwmval--;  
  15. if(led0pwmval>300)dir=0;  
  16. if(led0pwmval==0)dir=1;  
  17. TIM_SetCompare2(TIM3,led0pwmval);   
  18. }  
  19. }  






    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多