请问如何用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)
{
}
}
这是我的程序
#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)
{
}
}
简单的提供一下思路:如果想计算高电平时间,你可以先打开上升沿捕捉,只打开上升沿,捕捉到上升沿以后,再打开下降沿,这样就可以判断是高电平了