同一个定时器可以在不同的通道输出不同频率的PWM吗

[复制链接]
4812|9
 楼主| Thefantasy 发表于 2015-9-24 14:55 | 显示全部楼层 |阅读模式
同一个定时器可以在不同的通道输出不同频率的PWM吗,应该怎么设置呢
葫芦娃75 发表于 2015-9-24 23:13 | 显示全部楼层
是可以的,给你个代码看看
  1. #include "stm32f10x.h"
  2. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  3. TIM_OCInitTypeDef TIM_OCInitStructure;
  4. uint16_t CCR1_Val = 250;
  5. uint16_t CCR2_Val = 500;
  6. uint16_t CCR3_Val = 750;
  7. uint16_t CCR4_Val = 0;
  8. uint16_t PrescalerValue = 0;

  9. voidRCC_Configuration(void);                //时钟配置
  10. voidGPIO_Configuration(void);            //管脚配置
  11. void Delay (__IO uint32_tnCount);         //延时函数

  12. int main(void)
  13. {

  14. RCC_Configuration();
  15. GPIO_Configuration();
  16. PrescalerValue = (uint16_t) (SystemCoreClock /24000000) - 1;
  17. TIM_TimeBaseStructure.TIM_Period =1000;                                 //周期
  18. TIM_TimeBaseStructure.TIM_Prescaler =PrescalerValue;             //分频
  19. TIM_TimeBaseStructure.TIM_ClockDivision =0;                            //时钟分割
  20. TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;
  21.                //计数模式
  22. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                  //初始TIM3

  23. /*************************** 通道1 ********************************/
  24. TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM2;    //PWM2
  25. TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;   //PWM功能使能
  26. TIM_OCInitStructure.TIM_Pulse =CCR1_Val;                           //写比较值(占空比
  27. TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_Low;   //置高
  28. TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  29. TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  30. /****************************** 通道2 ******************************/
  31. /* PWM1 Mode configuration: Channel2 */
  32. TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;
  33. TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
  34. TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;
  35. TIM_OC2Init(TIM3, &TIM_OCInitStructure);
  36. TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  37. /******************************* 通道3 *********************************/
  38. /* PWM1 Mode configuration: Channel3 */
  39. TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;
  40. TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
  41. TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  42. TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

  43. /****************************** 通道4 *********************************/
  44. /* PWM1 Mode configuration: Channel4 */
  45. TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;
  46. TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
  47. TIM_OC4Init(TIM3, &TIM_OCInitStructure);
  48. TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
  49. TIM_ARRPreloadConfig(TIM3,ENABLE);                       //
  50. TIM_Cmd(TIM3,ENABLE);                                         //使能计数
  51. while (1)
  52. {
  53. CCR4_Val++;
  54. if(CCR4_Val==1000)CCR4_Val=0;
  55. TIM_SetCompare4(TIM3,CCR4_Val);                        //占空比调节
风中的雨down 发表于 2015-9-25 09:37 | 显示全部楼层
除非不断地进行软件干预,否则单个通用定时器不可以单独输出几路不同频率的PWM波形。
低八度的声线 发表于 2015-9-26 08:27 | 显示全部楼层
可以设置输出 几路频率一样,占空比不同的PWM
北方小榕树 发表于 2015-9-26 23:13 | 显示全部楼层
用比较模式时可以的
柠檬酸 发表于 2015-9-27 19:06 | 显示全部楼层
利用改变定时器输出比较通道的捕获值,当输出通道捕获值产生中断时,在中断中将捕获值改变,这时, 输出的I/O会产生一个电平翻转,利用这种办法,实现不同频率的PWM输出。
风吹小浪 发表于 2015-9-28 08:40 | 显示全部楼层
可以使用定时器的比较输出模式,然后在中断中调节各个通道的比较值
我的期待 发表于 2015-9-28 17:31 | 显示全部楼层
 楼主| Thefantasy 发表于 2015-10-24 09:49 | 显示全部楼层
我的期待 发表于 2015-9-28 17:31
可以看看这个文档
http://wenku.baidu.com/link?url=9yI65ExQVUOY4HCaBT-89YRLO6KkInr2R-DCxc5Fua7ioumlEcJ ...

谢谢,我看看去。
 楼主| Thefantasy 发表于 2015-10-24 09:49 | 显示全部楼层
柠檬酸 发表于 2015-9-27 19:06
利用改变定时器输出比较通道的捕获值,当输出通道捕获值产生中断时,在中断中将捕获值改变,这时, 输出的I ...

这也是一个很好的办法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

298

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部