[PIC®/AVR®/dsPIC®产品]

PIC24HJ128GP504单片机输入捕获

[复制链接]
417|12
手机看帖
扫描二维码
随时随地手机跟帖
15614|  楼主 | 2023-5-18 10:46 | 显示全部楼层 |阅读模式
picC24HJ128GP504单片机输入捕获,捕获的是PWM高电平时间,能够捕捉到,但是与实际值相差很大,有没有大佬帮我看看哪里有问题啊,非常感谢程序如下

uint timePeriod=0;
unsigned int t1=0,t2=0;  

void CCP1INT(){
    //内部晶振7.37MHz,t

// Enable Capture Interrupt And Timer3
IPC0bits.IC1IP = 1; // 设置输入捕获寄存器为第一优先级
IFS0bits.IC1IF = 0; // 清除 IC1 中断状态标志
IEC0bits.IC1IE = 1; // 使能IC1 中断

   // Initialize Capture Module
IC1CONbits.ICM=0b00; // 输入捕捉1禁止
IC1CONbits.ICTMR= 0; // Select Timer3 as the IC1 Time base
IC1CONbits.ICI= 0b01; //  每 2 次捕捉事件产生一次中断
IC1CONbits.ICM= 0b001; // 在捕捉输入信号的上升沿和下降沿进行捕捉

IC1CONbits.ICBNE=0;
IC1CONbits.ICOV=0;
IC1CONbits.ICSIDL=0;        

   T3CON = 0x0000;

    T3CONbits.TON = 1;         
        T3CONbits.TCS = 0;   
        T3CONbits.TGATE = 0;   
        T3CONbits.TCKPS = 0;  
    T3CONbits.TSIDL=0;
    TMR3 = 0x0000;
    PR3 = 0xFFFF;
;

TRISBbits.TRISB12=1;
RPINR7bits.IC1R=0b01100;  //RB12给到输入捕捉1
// Capture Interrupt Service Routine

    // return 60;
}

// Capture Interrupt Service Routine
void __attribute__((__interrupt__)) _IC1Interrupt(void)
{

t1=IC1BUF;
t2=IC1BUF;
IFS0bits.IC1IF=0;
if(t2>t1)
timePeriod = t2-t1;
else
timePeriod = (PR3- t1) + t2;
//Phase = timePeriod;



}


使用特权

评论回复
15614|  楼主 | 2023-5-24 10:37 | 显示全部楼层
问题已解决,是IO口配置问题,需要将对应的输入捕捉引脚不仅配置为输入,还要将引脚配置为数字引脚,之前一直用的16型号的pic单片机,24的单片机配置不太熟悉,程序没有问题,将引脚设置为数字引脚就可以了

使用特权

评论回复
15614|  楼主 | 2023-5-18 10:56 | 显示全部楼层
顶顶顶

使用特权

评论回复
15614|  楼主 | 2023-5-21 15:58 | 显示全部楼层
目前是无法进入中断

使用特权

评论回复
ynwa| | 2023-5-23 11:03 | 显示全部楼层
ICM = 001时,每次发生捕捉事件都会产生中断,ICI<1:0>位会被忽略。对这点的理解可能是你觉得捕捉值误差大的原因。但你又说无法进入中断,这就无法理解了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝