geekdevin
2019-01-21 16:52
采纳率: 64.7%
浏览 3.8k

stm32同一定时器使用两个通道输出pwm,想用中断方式对两路脉冲计数,但只有一个中断函数怎么办?

stm32同一定时器使用两个通道输出不同频率的pwm,想用中断方式对两路pwm的脉冲个数进行计数,但同一定时器只有一个中断函数怎么办?

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 红三军团 2019-01-22 19:13
    已采纳

    一个定时器只能设置一个通道的PWM,可以不用中断的方式,使用模拟的方式输出可以设置频率的占空比波形。
    #define PWM1 PEout(0)// PE2
    #define PWM2 PEout(1)// PE3
    #define PWM3 PEout(2)// PE4
    #define PWM4 PEout(3)// PE3
    #define PWM5 PEout(4)// PE5
    #define PWM6 PEout(5)// PE2
    #define PWM7 PEout(6)// PE3
    #define PWM8 PEout(7)// PE4
    //定时器2的向上计数设置
    void TIM2_Int_Init(u16 arr,u16 psc)
    {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
    
    //定时器TIM3初始化
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
    
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
    
    //中断优先级NVIC设置
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级2级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
    
    TIM_Cmd(TIM2, ENABLE);  //使能TIMx                     
    

    }
    //
    TIM2_Int_Init(20,8);//8M的计数频率,
    void PWM_GOIO_init(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //PWM输出端
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    }
    //
    void PWN_deal(void)
    {
    if(PWM_CON>150)PWM_CON=0;
    if(PWM_CON<=state_pwm[0]){PWM1=1;}else{PWM1=0;}
    if(PWM_CON<=state_pwm[1]){PWM2=1;}else{PWM2=0;}
    if(PWM_CON<=state_pwm[2]){PWM3=1;}else{PWM3=0;}
    if(PWM_CON<=state_pwm[3]){PWM4=1;}else{PWM4=0;}
    if(PWM_CON<=state_pwm[4]){PWM5=1;}else{PWM5=0;}
    if(PWM_CON<=state_pwm[5]){PWM6=1;}else{PWM6=0;}
    if(PWM_CON<=state_pwm[6]){PWM7=1;}else{PWM7=0;}
    if(PWM_CON<=state_pwm[7]){PWM8=1;}else{PWM8=0;}
    }
    //
    void TIM2_IRQHandler(void) //TIM2中断,主要功能一秒钟读一次时间
    {
    static u32 m=0;
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
    {
    PWM_CON++;if(PWM_CON>150)PWM_CON=0;
    PWN_deal();
    m++;
    if(m>=65530)
    {
    m=0;
    LED2 = ~LED2;
    }
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中断标志
    }

    }
    //
    state_pwm[0]=25;
    这样就可以输出8路pwm波形了。//state_pwm[x]取值范围在0~150就行了。
    希望对你有用,哈哈。

    已采纳该答案
    打赏 评论
  • 千城2000 2019-01-21 17:06

    stm32一个定时器只能配置一个频率的pwm波哦

    打赏 评论
  • bxbxbxbd 2021-07-31 17:29

    http://www.enmaking.com/article/ar_hDXRpS16

    打赏 评论

相关推荐 更多相似问题