微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > stm32多路PWM

stm32多路PWM

时间:10-02 整理:3721RD 点击:

  1. 在做多通道PWM输出的时候还是要注意很多问题的,由于我用的是STM32C8T6,定时器有4个,分别是一个高级控制定时器TIM1,和三个通用定时器。
  2. TIMER输出PWM实现步骤:
  3. 1.       设置RCC时钟;
  4. 2.       设置GPIO时钟;
  5. 3.       设置TIMx定时器的相关寄存器;
  6. 4.       设置TIMx定时器的PWM相关寄存器。
  7. 附上源码(以TIM2为例:两个通道)

  8. /*
  9. * 函数名:TIM2_GPIO_Config
  10. * 描述  :配置TIM3复用输出PWM时用到的I/O
  11. * 输入  :无
  12. * 输出  :无
  13. * 调用  :内部调用
  14. */
  15. static void TIM2_GPIO_Config(void)
  16. {
  17.   GPIO_InitTypeDef GPIO_InitStructure;

  18.         /* TIM3 clock enable */
  19.         //PCLK1经过2倍频后作为TIM3的时钟源等于36MHz
  20.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  21.   /* GPIOA and GPIOB clock enable */
  22.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

  23.   /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  24.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;
  25.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
  26.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  27.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  28. }


  29. static void TIM2_Mode_Config(void)
  30. {
  31.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  32.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  33.         /* PWM信号电平跳变值 */
  34.         u16 CCR1_Val = 251;        
  35.         u16 CCR2_Val = 251;


  36. /* -----------------------------------------------------------------------
  37.     TIM2 Configuration: generate 4 PWM signals with 4 different duty cycles:
  38.     TIM2CLK = 36 MHz, Prescaler = 0x0, TIM3 counter clock = 36 MHz
  39.     TIM2 ARR Register = 999 => TIM3 Frequency = TIM3 counter clock/(ARR + 1)
  40.     TIM2 Frequency = 36 KHz.
  41.     TIM2 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
  42.     TIM2 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
  43.     TIM2 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%
  44.     TIM2 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%
  45.   ----------------------------------------------------------------------- */

  46.   /* Time base configuration */                 
  47.   TIM_TimeBaseStructure.TIM_Period = 9999;       //当定时器从0计数到999,即为1000次,为一个定时周期
  48.   TIM_TimeBaseStructure.TIM_Prescaler = 144;            //设置预分频:不预分频,即为36MHz
  49.   TIM_TimeBaseStructure.TIM_ClockDivision = 0;        //设置时钟分频系数:不分频
  50.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式

  51.   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  52.   /* PWM1 Mode configuration: Channel1 */
  53.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
  54.         
  55.         
  56.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        
  57.   TIM_OCInitStructure.TIM_Pulse = CCR1_Val;           //设置跳变值,当计数器计数到这个值时,电平发生跳变
  58.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平
  59.   TIM_OC1Init(TIM2, &TIM_OCInitStructure);         //使能通道1
  60.   TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

  61.   /* PWM1 Mode configuration: Channel2 */
  62.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  63.   TIM_OCInitStructure.TIM_Pulse = CCR2_Val;          //设置通道2的电平跳变值,输出另外一个占空比的PWM
  64.   TIM_OC2Init(TIM2, &TIM_OCInitStructure);          //使能通道2
  65.   TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);


  66.   TIM_ARRPreloadConfig(TIM2, ENABLE);                         // 使能TIM2重载寄存器ARR

  67.   /* TIM2 enable counter */
  68.   TIM_Cmd(TIM2, ENABLE);                   //使能定时器2        
  69. }

  70. /*
  71. * 函数名:TIM2_Mode_Config
  72. * 描述  :TIM2 输出PWM信号初始化,只要调用这个函数
  73. *         TIM2的两个通道就会有PWM信号输出
  74. * 输入  :无
  75. * 输出  :无
  76. * 调用  :外部调用
  77. */
  78. void TIM2_PWM_Init(void)
  79. {
  80.         TIM2_GPIO_Config();
  81.         TIM2_Mode_Config();        
  82. }
  83. 在配置其他两个通用定时器时,配置几乎是相同的,但是在配置TIM1的时候需要加这个函数以使能TIM1的PWM输出
  84. TIM_CtrlPWMOutputs(TIM1, ENABLE);

复制代码

来自小组: 王奇

是的。同样的问题我在STM32F103RB上也遇到过,因为T1高级定时器。

1./* TIM3 clock enable */小编你用的是TIM2吧
2.TIM_TimeBaseStructure.TIM_Prescaler = 144;            //设置预分频:不预分频,即为36MHz
这里你分频了,不是36MHz

有点不是很清楚,怎么使能通道1和2的?
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);         //使能通道1
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
  /* PWM1 Mode configuration: Channel2 */
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;          //设置通道2的电平跳变值,输出另外一个占空比的PWM
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);          //使能通道2

虽然看不太懂,学习中。

小编辛苦了,十分感谢!

这个程序有点乱

这个程序有点乱

这个程序有点乱

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

网站地图

Top