大神们,在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; //清除中断标志
}
}
完全可以。 STC32G实验箱9.6 https://www.stcaimcu.com/forum.php?mod=attachment&aid=NjgzOXwwZDAxYTE3ZXwxNjk4ODkxMzUxfDE3fDE1MjU=
可以使用中断进行脉冲计数,STC8G范例程序、STC8A8K64D4实验箱例程包里面都有对应的例子
这个应该是没问题 社区闲人 发表于 2024-4-16 09:05
完全可以。
但是调试的时候,计数到了电机没停下来。
是什么问题? lezjin 发表于 2024-4-16 10:09
这个应该是没问题
但是计数满的时候,电机没有停下来,好像程序没有跑进中断一样 试试先计数处理,处理完再清标志位呢?
页:
[1]