微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请问如何用dspic的输入捕捉计算PWM的高电平时间

请问如何用dspic的输入捕捉计算PWM的高电平时间

时间:10-02 整理:3721RD 点击:
在dspic4011里我设置了边沿捕捉模式,上升沿和下降沿均捕捉,但是当我给捕捉输入引脚PWM时,无法判断捕捉到的是上升沿还是下降沿,这样相减得到的有可能是高电平时间也有可能是低电平时间!请问如何能够得到高电平时间?
这是我的程序
#include<p30f4011.h>
_FOSC(CSW_FSCM_OFF&XT_PLL16) ; //16倍频晶振,Failsafe时钟关闭
_FWDT(WDT_OFF) ; //关闭看门狗定时器
_FBORPOR(PBOR_OFF&MCLR_EN) ; //禁止掉电复位,MCLR复位使能
_FGS(CODE_PROT_OFF); //代码保护禁止
#define        FCY                32000000UL   //29490000UL
// pwm frequency
#define                FPWM        20000
// FULL_DUTY the equivalent of 100% duty cycle
#define        FULL_DUTY (2*FCY/FPWM)

void __attribute__((__interrupt__))_IC1Interrupt(void);//输入捕捉通道IC1中断服务子程序
unsigned int IC1InterruptCount = 0;
unsigned int TimerOverFlow=0;
unsigned int ICT1=0;
unsigned int ICT2=0;
unsigned int Fre_H=0;
void InitializeSys(void);
void InitializeTMR2();
void IC1_Init(void);

void InitializeSys(void)
{
                                   
    INTCON2 = 0x0000;                                       
    IEC2 = 0x0000;       
}
void IC1_Init(void)
{
    InitializeTMR2();
        TRISDbits.TRISD0 = 1;
    IC1CONbits.ICM = 0;
        IC1CONbits.ICTMR = 1;//Timer2
    IC1CONbits.ICI = 0;
        IFS0bits.IC1IF = 0;
        IEC0bits.IC1IE = 1;
        IPC0bits.IC1IP = 5;
    IC1CONbits.ICM = 1;
}
void InitializeTMR2()
{
    TMR2 = 0;
    T2CON = 0x0010;
        PR2 = 0xFFFF;
        IFS0bits.T2IF = 0;               
        IEC0bits.T2IE = 1;               
        IPC1bits.T2IP = 6;               
    T2CONbits.TON = 1;
}
void __attribute__((__interrupt__))_IC1Interrupt(void)
{
    IC1InterruptCount++;
        if(IC1InterruptCount == 1)
    {
            ICT1 = IC1BUF;//获取捕捉值
            TimerOverFlow = 0;
    }
    if(IC1InterruptCount == 2)       
    {
            unsigned long timecount;
            ICT2 = IC1BUF;//获取捕捉值
            timecount = TimerOverFlow * 65536 + ICT2 -ICT1;
            IC1InterruptCount = 0;
            TimerOverFlow = 0;
    }
    IFS0bits.IC1IF = 0;
               
}
void __attribute__((interrupt, no_auto_psv)) _T2Interrupt(void)
{
        IFS0bits.T2IF = 0;       
        TimerOverFlow ++;
}
int main()
{
   IC1_Init();
   InitializeSys();
    while(1)
    {
    }
}

简单的提供一下思路:如果想计算高电平时间,你可以先打开上升沿捕捉,只打开上升沿,捕捉到上升沿以后,再打开下降沿,这样就可以判断是高电平了

上一篇:求各位大神帮忙
下一篇:求教各路大神

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top