STM32
直播中

杨福林

8年用户 1590经验值
私信 关注
[问答]

STM32F030K6 4路PWM只有1路正常,其它3路没PWM波形为什么?

              (一) 先贴出能工作的PWM初始化程序,如下
void tiM14_Init()
{        
        RCC->AHBENR|=1<<17;                   //使能PORTA时钟   
        GPIOA->MODER   = 0X68AAA6F5 ;     //PA4/TIM14-CH1复用功能输出
        GPIOA->OTYPER  = 0X00000000;  
        GPIOA->OSPEEDR = 0X00000000;  
        GPIOA->PUPDR   = 0X25000000;  
        GPIOA->AFR[0]  =0XFFF0FFFF;;       //清除PA4原来的设置
        GPIOA->AFR[0] |=1<<18;                 //设置PA4为AF4

        RCC->APB1ENR|=1<<8;                  //TIM14时钟使能
        TIM14->PSC=0;                               //预分频器1分频
        TIM14->ARR=240;                          //设置频率(200K)
        TIM14->CCR1 =72;                         //设置占空比   
        TIM14->EGR |= 1;                           //产生一次更新事件  
        TIM14->CCMR1|=6<<4;                 //CH1 PWM1模式  
        TIM14->CCMR1|=1<<3;                 //CH1预装载使能   
        TIM14->CCER|=1<<0;                   //OC1输出使?高电平有效有效  
        TIM14->CR1=0x0080;                    //ARPE使能
       TIM14->CR1|=0x01;                        //使能定时器14
}


(二) 不能工作的第1路PWM(TIMI-CH1/PA8)初始化程序,如下
void TIM1_Init()
{   
       RCC->AHBENR|=1<<17;                //使能PORTA时钟
     
      GPIOA->MODER   = 0X68AAA6F5 ;
      GPIOA->OTYPER  = 0X00000000;  
      GPIOA->OSPEEDR = 0X00000000;  
      GPIOA->PUPDR   = 0X25000000;  
      GPIOA->AFR[0]  =0XFFFFF0FF;;      //清除PA8原来的设置
      GPIOA->AFR[0] |=1<<9;                  //设置PA8为AF2

      RCC->APB2ENR|=1<<11;               //TIM1时钟使能
     TIM1->PSC=47;                               //预分频器48分频
     TIM1->ARR=1000;                           //设置频率
     TIM1->CCR1 =500;                          //设置占空比   
     TIM1->CCMR1|=7<<4;                    //CH1 PWM2模式  
     TIM1->CCMR1|=1<<3;                     //CH1预装载使能   
     TIM1->CCER|=1<<0;                       //OC1输出使能   
     TIM1->CR1|=1<<7;                         //ARPE使能
     TIM1->EGR |= 1;                              //产生一次更新事件
     TIM1->CR1|=0x01;                          //使能定时器1
     TIM1->BDTR |=1<<15;
}


(三) 不能工作的第2路PWM(TIM3-CH1/PB4)初始化程序,如下
void TIM3_Init()
{   
        RCC->APB1ENR|=1<<1;                   //TIM3时钟使能
        RCC->AHBENR|=1<<18;                   //使能PORTB时钟
        GPIOB->MODER   = 0X55551655;     //PB4复用功能输出   
        GPIOB->OTYPER  = 0X00000000;     //推挽输出
        GPIOB->OSPEEDR = 0X00000000;    //低速
        GPIOB->PUPDR   = 0X00004000;      //除了PB7带上拉,其它脚则无上拉/下拉

         GPIOB->AFR[0]  =0XFFFFFF0F;        //清除PB4原来的设置
         GPIOB->AFR[0] |=1<<4;                  //设置PB4为AF1

         TIM3->PSC=47;                               //预分频器48分频
         TIM3->ARR=1000;                          //设置频率
         TIM3->EGR |= 1;                             //产生一次更新事件
         TIM3->CCR1 =500;                         //设置占空比

         TIM3->CCMR1|=7<<4;                   //CH1 PWM2模式  
         TIM3->CCMR1|=1<<3;                   //CH1预装载使能   
         TIM3->CCER|=1<<0;                     //OC1输出使能,高电平有效   
      
          TIM3->CR1|=1<<7;                     //ARPE使能
          TIM3->CR1|=0x01;                      //使能定时器3
   }

(三) 不能工作的第3路PWM(TIM16-CH1/PA6)初始化程序,如下
void TIM16_Init()
{            
        RCC->AHBENR|=1<<17;                   //使能PORTA时钟
        GPIOA->MODER   = 0X68AAA6F5 ;     //PA6复用功能输出
        GPIOA->OTYPER  = 0X00000000;  
        GPIOA->OSPEEDR = 0X00000000;  
        GPIOA->PUPDR   = 0X25000000;
      
        GPIOA->AFR[0]  =0XFF0FFFFF;;       //清除PA6原来的设置
        GPIOA->AFR[0] |=1<<20;                //设置PA6为AF5
        GPIOA->AFR[0] |=1<<22;

        RCC->APB2ENR|=1<<17;               //TIM16时钟使能
        TIM16->PSC=47;                             //预分频器48分频
        TIM16->ARR=1000;                        //设置频率
        TIM16->CCR1 =170;                       //设置占空比   
        TIM16->EGR |= 1;                           //产生一次更新事件  
        TIM16->CCMR1|=6<<4;                 //CH1 PWM1模式  
         TIM16->CCMR1|=1<<3;                //CH1预装载使能   
         TIM16->CCER|=1<<0;                   //OC1输出使能   
         TIM16->CR1=0x0080;                   //ARPE使能
         TIM16->CR1|=0x01;                      //使能定时器16

}
PCLK=HCLK=48MHZ.
查了很久,上面4路PWM设置内容几乎一样的,为何只有1路能功作,而其他3路则一直是低电平,没PWM波形输出,难道还有别的开关控制?



回帖(1)

石玉兰

2024-5-17 18:02:36
在STM32F030K6中,如果只有一路PWM正常工作,而其他三路没有PWM波形,可能有以下几个原因:

1. 定时器配置问题:请确保您为每个PWM通道配置了正确的定时器。在您的代码示例中,您只初始化了TIM14。请检查其他PWM通道是否也已正确配置。

2. GPIO配置问题:确保您为每个PWM通道配置了正确的GPIO。在您的代码示例中,GPIOA的MODER寄存器被设置为0X68AAA6F5。请检查其他PWM通道的GPIO配置是否正确。

3. PWM通道使能问题:确保您为每个PWM通道使能了输出。在您的代码示例中,没有显示如何使能PWM通道。通常,您需要设置定时器的CCER寄存器来使能PWM通道。

4. PWM占空比设置问题:请检查您的PWM占空比设置是否正确。如果占空比设置不正确,可能会导致PWM波形不正常。

5. 定时器时钟问题:请确保您的定时器时钟设置正确。如果时钟设置不正确,可能会导致PWM波形不正常。

为了解决这个问题,您可以尝试以下步骤:

1. 检查所有PWM通道的定时器配置,确保它们都已正确初始化。

2. 检查所有PWM通道的GPIO配置,确保它们都已正确设置。

3. 使能所有PWM通道的输出。例如,对于TIM14,您可以使用以下代码使能PWM通道:

```c
TIM14->CCER |= TIM_CCER_CC1E;
```

4. 设置正确的PWM占空比。例如,对于TIM14的通道1,您可以使用以下代码设置占空比:

```c
TIM14->CCR1 = 1000; // 假设定时器时钟为1MHz,占空比为1ms
```

5. 确保定时器时钟设置正确。您可以检查RCC配置代码,确保时钟设置正确。

通过以上步骤,您应该能够找到问题所在并解决它。如果问题仍然存在,请仔细检查您的硬件连接,以确保没有其他问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分