微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求救,STM32 通用定时器产生多通道PWM输出,会相互影响,怎么办?

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

时间:10-02 整理:3721RD 点击:
求救,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_PWMModeInit
  34. ** 描述: PWM输出模式配置;
  35. **      设置PWM工作频率,计数模式,占空比
  36. **
  37. ** 输入: 无
  38. ** 输出: 无
  39. ********************************************************************************/
  40. void vLight_PWMModeInit(void)
  41. {
  42.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  43.   TIM_OCInitTypeDef  TIM_OCInitStructure;
  44.   //TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  45.   
  46.   //定时器工作在单脉冲下
  47.   TIM_DeInit(CH1_CH4_PWM);
  48.   
  49.   TIM_TimeBaseStructure.TIM_Period = PWM_Freq;                //计数值,即定时周期
  50.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                    //预分频,不分频为72MHz
  51.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_div1;     //时钟分频系数
  52.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
  53.   TIM_TimeBaseInit(CH1_CH4_PWM,&TIM_TimeBaseStructure);
  54.         
  55.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  56.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;           //在向上计数
  57.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  58.         /*配置通道1*/
  59.   TIM_OCInitStructure.TIM_Pulse = 0;
  60.         TIM_OC4Init(CH1_CH4_PWM,&TIM_OCInitStructure);
  61.   TIM_OC4PreloadConfig(CH1_CH4_PWM,TIM_OCPreload_Enable);
  62.         /*配置通道2*/
  63.   TIM_OCInitStructure.TIM_Pulse = 0;
  64.         TIM_OC3Init(CH1_CH4_PWM,&TIM_OCInitStructure);
  65.   TIM_OC3PreloadConfig(CH1_CH4_PWM,TIM_OCPreload_Enable);
  66.         /*配置通道3*/
  67.   TIM_OCInitStructure.TIM_Pulse = 0;
  68.         TIM_OC2Init(CH1_CH4_PWM,&TIM_OCInitStructure);
  69.   TIM_OC2PreloadConfig(CH1_CH4_PWM,TIM_OCPreload_Enable);
  70.         /*配置通道4*/
  71.   TIM_OCInitStructure.TIM_Pulse = 0;
  72.         TIM_OC1Init(CH1_CH4_PWM,&TIM_OCInitStructure);
  73.   TIM_OC1PreloadConfig(CH1_CH4_PWM,TIM_OCPreload_Enable);

  74.         TIM_ARRPreloadConfig(CH1_CH4_PWM,ENABLE);
  75.   TIM_Cmd(CH1_CH4_PWM,ENABLE);//先不使能能TIM
  76.         
  77.         //定时器工作在单脉冲下
  78.   TIM_DeInit(CH5_CH8_PWM);
  79.   
  80.   TIM_TimeBaseStructure.TIM_Period = PWM_Freq;                //计数值,即定时周期
  81.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                    //预分频,不分频为72MHz
  82.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_div1;     //时钟分频系数
  83.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
  84.   TIM_TimeBaseInit(CH5_CH8_PWM,&TIM_TimeBaseStructure);

  85.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  86.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;           //在向上计数
  87.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  88.         
  89.         /*配置通道5*/
  90.   TIM_OCInitStructure.TIM_Pulse = 0;
  91.         TIM_OC4Init(CH5_CH8_PWM,&TIM_OCInitStructure);
  92.   TIM_OC4PreloadConfig(CH5_CH8_PWM,TIM_OCPreload_Enable);
  93.         /*配置通道6*/
  94.   TIM_OCInitStructure.TIM_Pulse = 0;
  95.         TIM_OC3Init(CH5_CH8_PWM,&TIM_OCInitStructure);
  96.   TIM_OC3PreloadConfig(CH5_CH8_PWM,TIM_OCPreload_Enable);
  97.         /*配置通道7*/
  98.   TIM_OCInitStructure.TIM_Pulse = 0;
  99.         TIM_OC2Init(CH5_CH8_PWM,&TIM_OCInitStructure);
  100.   TIM_OC2PreloadConfig(CH5_CH8_PWM,TIM_OCPreload_Enable);
  101.         /*配置通道8*/
  102.   TIM_OCInitStructure.TIM_Pulse = 0;
  103.         TIM_OC1Init(CH5_CH8_PWM,&TIM_OCInitStructure);
  104.   TIM_OC2PreloadConfig(CH5_CH8_PWM,TIM_OCPreload_Enable);
  105.         
  106.         TIM_ARRPreloadConfig(CH5_CH8_PWM,ENABLE);
  107.   TIM_Cmd(CH5_CH8_PWM,ENABLE);//先不使能能TIM

  108. }
  109. /*******************************************************************************
  110. ** 名称: vLight_PWMModeInit
  111. ** 描述: PWM输出模式配置;
  112. **      设置PWM工作频率,计数模式,占空比
  113. **
  114. ** 输入: 无
  115. ** 输出: 无
  116. ********************************************************************************/
  117. void vLight_SetPWM(uint8_t uCH,uint16_t uCycle)
  118. {
  119.         switch(uCH)
  120.         {
  121.                 case _CH1:
  122.                 {
  123.                         TIM_SetCompare4(CH1_CH4_PWM,uCycle);
  124.                         break;
  125.                 }
  126.                 case _CH2:
  127.                 {
  128.                         TIM_SetCompare3(CH1_CH4_PWM,uCycle);
  129.                         break;
  130.                 }
  131.                 case _CH3:
  132.                 {
  133.                         TIM_SetCompare2(CH1_CH4_PWM,uCycle);
  134.                         break;
  135.                 }
  136.                 case _CH4:
  137.                 {
  138.                         TIM_SetCompare1(CH1_CH4_PWM,uCycle);
  139.                         break;
  140.                 }
  141.                 case _CH5:
  142.                 {
  143.                         TIM_SetCompare4(CH5_CH8_PWM,uCycle);
  144.                         break;
  145.                 }
  146.                 case _CH6:
  147.                 {
  148.                         TIM_SetCompare3(CH5_CH8_PWM,uCycle);
  149.                         break;
  150.                 }
  151.                 case _CH7:
  152.                 {
  153.                         TIM_SetCompare2(CH5_CH8_PWM,uCycle);
  154.                         break;
  155.                 }
  156.                 case _CH8:
  157.                 {
  158.                         TIM_SetCompare1(CH5_CH8_PWM,uCycle);
  159.                         break;
  160.                 }
  161.                 default:  break;
  162.         }
  163. }

复制代码


我用stm32f103c8t6输出16路PWM,没有相互影响。你输出的pwm对频率有没有要求,你试着把分频系数调一下,降低频率再试试

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top