qixibujiabing 2019-01-21 16:52 采纳率: 50%
浏览 4398
已采纳

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

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

  • 写回答

3条回答

  • qq_35510211 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就行了。
    希望对你有用,哈哈。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题