8H芯片PWM捕捉两路脉冲波信号的周期和占空比
急切请教各位大佬:我使用8H8K64U-45I-TSSOP20芯片,12MHz,PWM无分频,输入捕捉模式,同时测量两组0~2kHz的脉冲信号的周期和占空比,情况和疑问如下,请大佬赐教:
1、Freq1接P1.0/PWM1P,Freq2接P3.4/PWM4P,捕捉Freq1和Freq2的周期和占空比,均可能出现溢出情况;
2、在例程中看到,可以通过PWMA_CCR1读取捕获的Freq1周期,PWMA_CCR2捕捉Freq1的占空比;可以通过PWMA_CCR3读取捕获的Freq2周期,PWMA_CCR4捕捉Freq2的占空比;
3、当存在溢出时,如何判断PWMA_SR1中的UIFA更新标志,是Freq1溢出还是Freq2溢出呢?如果SR1中的UIFA是PWM1P的溢出标志,那PWM4P的溢出标志在那个状态寄存器里呢?
4、如果没有独立的UIFA更新标志,那么该如何区分Freq1/Freq2的溢出呢?
非常感谢
你不用管是谁溢出了,每次进入中断就保存计数器的值,如果,本次值小于上次值肯定是溢出重新计数了,你把小数给加个 65536L,这样小数不就变成大数了么,直接相减就行了。官方例程直接小数减去大数,测试看了一下也没有什么问题
/***************************************************************************/ //CCP捕获占空比服务函数
static void PWM_ISR() interrupt 26
{
uint j; //本次捕获值
static uint capT1_Last,capT2_Last; //上次捕获值
if (PWMA_SR1 & 0x02) // 当CC1捕获
{
PWMA_SR1 &= ~0x02; // 清零
j =(PWMA_CCR1H << 8) + PWMA_CCR1L; // CC1:上升沿-捕获周期
if(j < capT1_Last) P1capT = ( 65536L + j ) - capT1_Last ;
else P1capT = j - capT1_Last ;
capT1_Last = j;
DRY_OUT = 1;
}
if(PWMA_SR1 & 0x04) // 当CC2捕获
{
PWMA_SR1 &= ~0x04;
j =(PWMA_CCR2H << 8) + PWMA_CCR2L; // CC2:下降沿-捕获高电平时间
if(j < capT1_Last)P1capH = ( 65536L + j ) - capT1_Last ;
else P1capH = j - capT1_Last ;
DRY_OUT = 0;
}
if (PWMA_SR1 & 0x08) // 当CC3捕获
{
PWMA_SR1 &= ~0x08;
j =(PWMA_CCR3H << 8) + PWMA_CCR3L; // CC3:上升沿-捕获周期
if(j < capT2_Last)P2capT = ( 65536L + j ) - capT2_Last;
else P2capT = j - capT2_Last ;
capT2_Last = j;
}
if(PWMA_SR1 & 0x10) // 当CC4捕获
{
PWMA_SR1 &= ~0x10;
j =(PWMA_CCR4H << 8) + PWMA_CCR4L; // CC4:下降沿-捕获高电平时间
if(j < capT2_Last)P2capH = ( 65536L + j ) - capT2_Last;
else P2capH = j - capT2_Last ;
}
} nanger1984 发表于 2025-7-18 10:21
你不用管是谁溢出了,每次进入中断就保存计数器的值,如果,本次值小于上次值肯定是溢出重新计数了,你把小 ...
官方例程的变量是16位,直接小数减去大数,不够减等同于借位了,没有问题。
页:
[1]