查看: 120|回复: 2
收起左侧

STM32 通用定时器产生多通道PWM输出,会相互影响,怎么办????

[复制链接]
     

3

主题

14

帖子

42

积分

实习生

 楼主| 发表于 2017-7-9 15:44 | 显示全部楼层 |返回版面||阅读模式
STM32 通用定时器产生多通道PWM输出,会相互影响,怎么办????
  1. #define _CH1     1
  2. #define _CH2     2
  3. #define _CH3     3
  4. #define _CH4     4
  5. #define _CH5     5
  6. #define _CH6     6
  7. #define _CH7     7
  8. #define _CH8     8

  9. #define CH1_CH4_PWM_GPIO_CLK           RCC_APB2Periph_GPIOC
  10. #define CH1_CH4_PWM_CLK                RCC_APB1Periph_TIM3
  11. #define CH1_CH4_PWM                    TIM3
  12. #define CH1_PWM_GPIO_PORT              GPIOC
  13. #define CH1_PWM_PIN                    GPIO_Pin_9
  14. #define CH2_PWM_GPIO_PORT              GPIOC
  15. #define CH2_PWM_PIN                    GPIO_Pin_8
  16. #define CH3_PWM_GPIO_PORT              GPIOC
  17. #define CH3_PWM_PIN                    GPIO_Pin_7
  18. #define CH4_PWM_GPIO_PORT              GPIOC
  19. #define CH4_PWM_PIN                    GPIO_Pin_6

  20. #define CH5_CH8_PWM_GPIO_CLK           RCC_APB2Periph_GPIOB
  21. #define CH5_CH8_PWM_CLK                RCC_APB1Periph_TIM4
  22. #define CH5_CH8_PWM                    TIM4
  23. #define CH5_PWM_GPIO_PORT              GPIOB
  24. #define CH5_PWM_PIN                    GPIO_Pin_9
  25. #define CH6_PWM_GPIO_PORT              GPIOB
  26. #define CH6_PWM_PIN                    GPIO_Pin_8
  27. #define CH7_PWM_GPIO_PORT              GPIOB
  28. #define CH7_PWM_PIN                    GPIO_Pin_7
  29. #define CH8_PWM_GPIO_PORT              GPIOB
  30. #define CH8_PWM_PIN                    GPIO_Pin_6

  31. #define PWM_Freq                       (500 - 1)  

  32. /*******************************************************************************
  33. ** 名称: vLight_SetPWMInit
  34. ** 描述: 各通道PWM输出配置;
  35. **      开启外设时钟及配置输出模式
  36. **
  37. ** 输入: 无
  38. ** 输出: 无
  39. ********************************************************************************/

  40. void vLight_SetPWMConfig(void)
  41. {
  42.         /*PWM输出GPIO配置*/
  43.         vLight_PWMGpioInit();
  44.         /*PWM输出模式配置*/
  45.         vLight_PWMModeInit();
  46. }

  47. /*******************************************************************************
  48. ** 名称: vLight_PWMGpioInit
  49. ** 描述: PWM输出GPIO配置;
  50. **      开启外设时钟及配置输出模式
  51. **
  52. ** 输入: 无
  53. ** 输出: 无
  54. ********************************************************************************/

  55. void vLight_PWMGpioInit(void)
  56. {
  57.         GPIO_InitTypeDef GPIO_InitStructure;
  58.        
  59.         /*使能外设时钟*/
  60.   RCC_APB2PeriphClockCmd(CH1_CH4_PWM_GPIO_CLK| CH5_CH8_PWM_GPIO_CLK |\
  61.              RCC_APB2Periph_AFIO , ENABLE);
  62.   RCC_APB1PeriphClockCmd(CH1_CH4_PWM_CLK| CH5_CH8_PWM_CLK, ENABLE);
  63.         /*引脚重映*/
  64.         GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
  65.        
  66.         /*配置vLight_PWMGpio*/
  67.   GPIO_InitStructure.GPIO_Pin = CH1_PWM_PIN |CH2_PWM_PIN |CH3_PWM_PIN |CH4_PWM_PIN ;
  68.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  69.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  70.   GPIO_Init(CH1_PWM_GPIO_PORT, &GPIO_InitStructure);
  71.        
  72.         GPIO_InitStructure.GPIO_Pin = CH5_PWM_PIN |CH6_PWM_PIN |CH7_PWM_PIN |CH8_PWM_PIN ;
  73.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  74.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  75.   GPIO_Init(CH5_PWM_GPIO_PORT, &GPIO_InitStructure);
  76. }


  77. /*******************************************************************************
  78. ** 名称: vLight_PWMModeInit
  79. ** 描述: PWM输出模式配置;
  80. **      设置PWM工作频率,计数模式,占空比
  81. **
  82. ** 输入: 无
  83. ** 输出: 无
  84. ********************************************************************************/
  85. void vLight_PWMModeInit(void)
  86. {
  87.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  88.   TIM_OCInitTypeDef  TIM_OCInitStructure;
  89.   //TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  90.   
  91.   //定时器工作在单脉冲下
  92.   TIM_DeInit(CH1_CH4_PWM);
  93.   
  94.   TIM_TimeBaseStructure.TIM_Period = PWM_Freq;                //计数值,即定时周期
  95.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                    //预分频,不分频为72MHz
  96.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频系数
  97.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
  98.   TIM_TimeBaseInit(CH1_CH4_PWM,&TIM_TimeBaseStructure);
  99.        
  100.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  101.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;           //在向上计数
  102.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  103.         /*配置通道1*/
  104.   TIM_OCInitStructure.TIM_Pulse = 0;
  105.         TIM_OC4Init(CH1_CH4_PWM,&TIM_OCInitStructure);
  106.   TIM_OC4PreloadConfig(CH1_CH4_PWM,TIM_OCPreload_Enable);
  107.         /*配置通道2*/
  108.   TIM_OCInitStructure.TIM_Pulse = 0;
  109.         TIM_OC3Init(CH1_CH4_PWM,&TIM_OCInitStructure);
  110.   TIM_OC3PreloadConfig(CH1_CH4_PWM,TIM_OCPreload_Enable);
  111.         /*配置通道3*/
  112.   TIM_OCInitStructure.TIM_Pulse = 0;
  113.         TIM_OC2Init(CH1_CH4_PWM,&TIM_OCInitStructure);
  114.   TIM_OC2PreloadConfig(CH1_CH4_PWM,TIM_OCPreload_Enable);
  115.         /*配置通道4*/
  116.   TIM_OCInitStructure.TIM_Pulse = 0;
  117.         TIM_OC1Init(CH1_CH4_PWM,&TIM_OCInitStructure);
  118.   TIM_OC1PreloadConfig(CH1_CH4_PWM,TIM_OCPreload_Enable);

  119.         TIM_ARRPreloadConfig(CH1_CH4_PWM,ENABLE);
  120.   TIM_Cmd(CH1_CH4_PWM,ENABLE);//先不使能能TIM
  121.        
  122.         //定时器工作在单脉冲下
  123.   TIM_DeInit(CH5_CH8_PWM);
  124.   
  125.   TIM_TimeBaseStructure.TIM_Period = PWM_Freq;                //计数值,即定时周期
  126.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                    //预分频,不分频为72MHz
  127.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频系数
  128.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
  129.   TIM_TimeBaseInit(CH5_CH8_PWM,&TIM_TimeBaseStructure);

  130.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  131.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;           //在向上计数
  132.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  133.        
  134.         /*配置通道5*/
  135.   TIM_OCInitStructure.TIM_Pulse = 0;
  136.         TIM_OC4Init(CH5_CH8_PWM,&TIM_OCInitStructure);
  137.   TIM_OC4PreloadConfig(CH5_CH8_PWM,TIM_OCPreload_Enable);
  138.         /*配置通道6*/
  139.   TIM_OCInitStructure.TIM_Pulse = 0;
  140.         TIM_OC3Init(CH5_CH8_PWM,&TIM_OCInitStructure);
  141.   TIM_OC3PreloadConfig(CH5_CH8_PWM,TIM_OCPreload_Enable);
  142.         /*配置通道7*/
  143.   TIM_OCInitStructure.TIM_Pulse = 0;
  144.         TIM_OC2Init(CH5_CH8_PWM,&TIM_OCInitStructure);
  145.   TIM_OC2PreloadConfig(CH5_CH8_PWM,TIM_OCPreload_Enable);
  146.         /*配置通道8*/
  147.   TIM_OCInitStructure.TIM_Pulse = 0;
  148.         TIM_OC1Init(CH5_CH8_PWM,&TIM_OCInitStructure);
  149.   TIM_OC2PreloadConfig(CH5_CH8_PWM,TIM_OCPreload_Enable);
  150.        
  151.         TIM_ARRPreloadConfig(CH5_CH8_PWM,ENABLE);
  152.   TIM_Cmd(CH5_CH8_PWM,ENABLE);//先不使能能TIM

  153. }
  154. /*******************************************************************************
  155. ** 名称: vLight_PWMModeInit
  156. ** 描述: PWM输出模式配置;
  157. **      设置PWM工作频率,计数模式,占空比
  158. **
  159. ** 输入: 无
  160. ** 输出: 无
  161. ********************************************************************************/
  162. void vLight_SetPWM(uint8_t uCH,uint16_t uCycle)
  163. {
  164.         switch(uCH)
  165.         {
  166.                 case _CH1:
  167.                 {
  168.                         TIM_SetCompare4(CH1_CH4_PWM,uCycle);
  169.                         break;
  170.                 }
  171.                 case _CH2:
  172.                 {
  173.                         TIM_SetCompare3(CH1_CH4_PWM,uCycle);
  174.                         break;
  175.                 }
  176.                 case _CH3:
  177.                 {
  178.                         TIM_SetCompare2(CH1_CH4_PWM,uCycle);
  179.                         break;
  180.                 }
  181.                 case _CH4:
  182.                 {
  183.                         TIM_SetCompare1(CH1_CH4_PWM,uCycle);
  184.                         break;
  185.                 }
  186.                 case _CH5:
  187.                 {
  188.                         TIM_SetCompare4(CH5_CH8_PWM,uCycle);
  189.                         break;
  190.                 }
  191.                 case _CH6:
  192.                 {
  193.                         TIM_SetCompare3(CH5_CH8_PWM,uCycle);
  194.                         break;
  195.                 }
  196.                 case _CH7:
  197.                 {
  198.                         TIM_SetCompare2(CH5_CH8_PWM,uCycle);
  199.                         break;
  200.                 }
  201.                 case _CH8:
  202.                 {
  203.                         TIM_SetCompare1(CH5_CH8_PWM,uCycle);
  204.                         break;
  205.                 }
  206.                 default:  break;
  207.         }
  208. }
复制代码
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
     

327

主题

1万

帖子

4万

积分

版主

---------------------

发表于 2017-7-10 17:12 | 显示全部楼层 |返回版面
不知道你想产生什么样的信号, 别那一大堆毛病代码出来让人给你看病, 好么
欢迎进入 TI 模拟技术论坛

28

主题

244

帖子

743

积分

高级技术员

发表于 2017-7-13 10:32 | 显示全部楼层 |返回版面
不会吧。估计是你寄存器设置有问题。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

分享 快速回复 返回顶部 返回列表