Q156899579 发表于 2024-4-16 08:42:39

大神们,在PWM中断中进行脉冲计数,是否可以?急







void        PWM_config(void)
{

       P_SW2 |=0x80;                        // 访问XFR

        PWM2T1 = CYCLE;        // 第一个翻转匹配点
        PWM3T1 = CYCLE;        // 第一个翻转匹配点
        PWM4T1 = CYCLE;        // 第一个翻转匹配点
        PWM5T1 = CYCLE;        // 第一个翻转匹配点
//        PWM6T1 = 0;        // 第一个翻转匹配点
//        PWM7T1 = 0;        // 第一个翻转匹配点

        PWM2T2 = PWM2_Claw ;        // 第二个翻转匹配点
        PWM3T2 = PWM3_Updn;        // 第二个翻转匹配点
        PWM4T2 = PWM4_Ltrt;        // 第二个翻转匹配点
        PWM5T2 = CYCLE/2;        // 第二个翻转匹配点       PWM5_Ftbk
       
//        PWM6T2 = 1000;        // 第二个翻转匹配点
//        PWM7T2 = 1200;        // 第二个翻转匹配点

                //        PWMxCR;        //7位 6位 5位 4位      3位      2位            1位               0位
                                        // -   -   -   -    管脚选择允许PWMx中断允许T2匹配时中断允许T1匹配时中断
        PWM2CR = PWM2_P37;        //PWM2_P37 PWM2_P27                //上下
        PWM3CR = PWM3_P21;        //PWM3_P21 PWM3_P45                //夹牌
        PWM4CR = PWM4_P22;        //PWM4_P22 PWM4_P44                //过牌
        PWM5CR = PWM5_P23;        //PWM5_P23 PWM5_P42          //发牌
//        PWM6CR = PWM6_P07;        //PWM6_P16 PWM6_P07
//        PWM7CR = PWM7_P06;        //PWM7_P17 PWM7_P06

        PWMCFG = 0x00;        //7位    6位                5位    4位    3位    2位    1位    0位
                                        //置01-计数器归零触发ADC C7INIC6INIC5INIC4INIC3INIC2INI
                                        //   0-归零时不触发ADC       (值为1时上电初始高电平,为0低电平)

        P37 = 0;
        P3n_push_pull(1<<7);        //IO设置为推挽输出, 上电时为高阻
        P21 = 0;
        P2n_push_pull(1<<1);        //IO设置为推挽输出, 上电时为高阻
        P22 = 0;
        P2n_push_pull(1<<2);        //IO设置为推挽输出, 上电时为高阻
        P23 = 0;
        P2n_push_pull(1<<3);        //IO设置为推挽输出, 上电时为高阻
//        P06 = 1;                                //停止PWM时输出高电平
//        P0n_push_pull(1<<6);        //IO设置为推挽输出, 上电时为高阻
//        P07 = 0;                                //停止PWM时输出低电平
//        P0n_push_pull(1<<7);        //IO设置为推挽输出, 上电时为高阻

        PWMCKS = 0x00;        //7位6位5位    4位             3位    2位    1位    0位
                                        //   置0    0-系统时钟分频          分频参数设定
                                        //          1-定时器2溢出       时钟=系统时钟/(+1)

        PWMIF = 0x00;        //7位    6位                5位    4位    3位    2位    1位    0位
                                        //置0计数器归零中断标志            相应PWM端口中断标志

        PWMFDCR = 0x00;        //7位    6位       5位                4位
                                        //置0    置0 外部异常检测开关外部异常时0-无反应 1-高阻状态
                                        //3位             2位               1位                0位
                                        //PWM异常中断比较器与异常的关系   P2.4与异常的关系PWM异常标志

        PWMC = CYCLE;                // PWM计数器周期2000       CYCLE

        PWMCR = 0x80+0x0f;        // 7位          6位         5位   4位   3位   2位   1位   0位
                                                //ENPWM         ECBI         ENC7O ENC6O ENC5O ENC4O ENC3O ENC2O
                                                //PWM开关 计数归零中断开关   相应I/O为GPIO模式(0)或PWM模式(1)

//        PWMFDCR = ENFD | FLTFLIO | FDIO;        //PWM失效中断控制,ENFD | FLTFLIO | EFDI | FDCMP | FDIO
}       



/********************* PWM中断函数************************/

void PWM_int (void) interrupt PWM_VECTOR          // #define PWM_VECTOR       22                    
{
        if(PWMIF & CBIF)        //PWM计数器归零中断标志
        {
                PWMIF &= ~CBIF;        //清除中断标志
        }

        if(PWMIF & C2IF)        //PWM2中断标志
        {
                PWMIF &= ~C2IF;        //清除中断标志
        }

        if(PWMIF & C3IF)        //PWM3中断标志
        {
                PWMIF &= ~C3IF;        //清除中断标志

        }


        if(PWMIF & C4IF)        //PWM4中断标志
        {
                PWMIF &= ~C4IF;        //清除中断标志

        }


        if(PWMIF & C5IF)        //PWM5中断标志
        {               
               
                PWMIF &= ~C5IF;        //清除中断标志

          Pul_FP ++;                                                                                           //在PWM中断中进行脉冲计数,是否可以?          
                if( Pul_FP>=6000){SBUF=0x88;SLeep_FP   =0; }       //   SleepMFP_OFF();
        }



        if(PWMIF & C6IF)        //PWM6中断标志
        {
                PWMIF &= ~C6IF;        //清除中断标志
        }

        if(PWMIF & C7IF)        //PWM7中断标志
        {
                PWMIF &= ~C7IF;        //清除中断标志
        }

}


社区闲人 发表于 2024-4-16 09:05:13

完全可以。

国学芯用 发表于 2024-4-16 09:05:55

STC32G实验箱9.6 https://www.stcaimcu.com/forum.php?mod=attachment&aid=NjgzOXwwZDAxYTE3ZXwxNjk4ODkxMzUxfDE3fDE1MjU=

乘风飞扬 发表于 2024-4-16 09:09:07

可以使用中断进行脉冲计数,STC8G范例程序、STC8A8K64D4实验箱例程包里面都有对应的例子

lezjin 发表于 2024-4-16 10:09:26

这个应该是没问题

Q156899579 发表于 2024-4-16 10:39:24

社区闲人 发表于 2024-4-16 09:05
完全可以。

但是调试的时候,计数到了电机没停下来。
是什么问题?

Q156899579 发表于 2024-4-16 10:45:20

lezjin 发表于 2024-4-16 10:09
这个应该是没问题

但是计数满的时候,电机没有停下来,好像程序没有跑进中断一样

Yim_Hom 发表于 2024-5-11 22:35:50

试试先计数处理,处理完再清标志位呢?
页: [1]
查看完整版本: 大神们,在PWM中断中进行脉冲计数,是否可以?急