weixin_42718387
EtaYang
采纳率100%
2019-12-23 17:19

菜鸡求教,stm32f103的板子,做两路pwm输出,结果有一路没反应。

10
已采纳

本菜鸡想用stm32103的板子控制两路舵机,就干脆直接在pwm程序上改了。我查了一下TIM3通道2的复用口的PB5,我就加一个通道1的复用口的PB4。

图片说明

但结果是原来的PB5口好用得很,但新加的PB4口毛用没有。求大神帮我解答,万分感谢!

void TIM3_PWM_Init(u16 arr,u16 psc)
{  
    //定义变量
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    //IO口配置
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  

    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 
    //使能PA4、PA5
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4|GPIO_Pin_5; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //定时器通用配置
    TIM_TimeBaseStructure.TIM_Period = arr; 
    TIM_TimeBaseStructure.TIM_Prescaler =psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

    //通道1配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);  
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  

    //通道2配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);  
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  

    TIM_Cmd(TIM3, ENABLE);  

}

 int main(void)
 {      
    u16 led0pwmval=0;
    u8 dir=1;   
    delay_init();            
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 

    LED_Init();             
    TIM3_PWM_Init(20000-1,72-1);    
  while(1)
    {
        TIM_SetCompare2(TIM3,20000-500);
        TIM_SetCompare1(TIM3,20000-500);
        delay_ms(1000); 
        TIM_SetCompare2(TIM3,20000-550);
        TIM_SetCompare1(TIM3,20000-550);
        delay_ms(1000);         
    }    
 }

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • u014799914 huhuren12 2年前

    IO口配置应该没有问题的,主要看下:
    1.你可以只开PB4一路试下,看行不行。
    2.你的PWM输出频率周期是多少?可以先把while(1)里面的内容去掉,将
    TIM_SetCompare2(TIM3,20000-500);
    TIM_SetCompare1(TIM3,20000-500);
    两行放到 TIM3_PWM_Init(20000-1,72-1); 下面试下,看看两路有没有波形
    3.如果还是都不行,可以参考我在stm32f105的板子上的4路PWM的代码,如下面所示

    u16 CCR1_Val = 500;
    u16 CCR2_Val = 375;
    u16 CCR3_Val = 250;
    u16 CCR4_Val = 125;
    ErrorStatus HSEStartUpStatus;
    
    /* Private function prototypes -----------------------------------------------*/
    void RCC_Configuration(void);
    void GPIO_Configuration(void);
    void NVIC_Configuration(void);
    
    /* Private functions ---------------------------------------------------------*/
    
    /*******************************************************************************
    * Function Name  : main
    * Description    : Main program
    * Input          : None
    * Output         : None
    * Return         : None
    *******************************************************************************/
    int main(void)
    {
    #ifdef DEBUG
      debug();
    #endif
    
      /* System Clocks Configuration */
      RCC_Configuration();
    
      /* NVIC Configuration */
      NVIC_Configuration();
    
      /* GPIO Configuration */
      GPIO_Configuration();
    
      /* -----------------------------------------------------------------------
        TIM3 Configuration: generate 4 PWM signals with 4 different duty cycles:
        TIM3CLK = 36 MHz, Prescaler = 0x0, TIM3 counter clock = 36 MHz
        TIM3 ARR Register = 999 => TIM3 Frequency = TIM3 counter clock/(ARR + 1)
        TIM3 Frequency = 36 KHz.
        TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 = 50%
        TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 = 37.5%
        TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 = 25%
        TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 = 12.5%
      ----------------------------------------------------------------------- */
    
      /* Time base configuration */
      TIM_TimeBaseStructure.TIM_Period = 999;
      TIM_TimeBaseStructure.TIM_Prescaler = 0;
      TIM_TimeBaseStructure.TIM_ClockDivision = 0;
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    
      TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
      /* PWM1 Mode configuration: Channel1 */
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    
      TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    
      TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
    
      /* PWM1 Mode configuration: Channel2 */
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
    
      TIM_OC2Init(TIM3, &TIM_OCInitStructure);
    
      TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
    
      /* PWM1 Mode configuration: Channel3 */
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
    
      TIM_OC3Init(TIM3, &TIM_OCInitStructure);
    
      TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
    
      /* PWM1 Mode configuration: Channel4 */
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
    
      TIM_OC4Init(TIM3, &TIM_OCInitStructure);
    
      TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
    
      TIM_ARRPreloadConfig(TIM3, ENABLE);
    
      /* TIM3 enable counter */
      TIM_Cmd(TIM3, ENABLE);
    
      while (1)
      {}
    }
    
    点赞 评论 复制链接分享