📄 pulseperiodmeasure.c
字号:
/*********************************************
文件名 :PulsePeriodMeasure.c **
功能描述:测量从捕捉输入端口输入的信号的周期**
**********************************************/
#include "p30f6014.h"
#include "PulsePeriodMeasure.h"
void InitializeSys()
{
INTCON1 = 0x0000; //关中断
INTCON2 = 0x0000;
IEC0 = 0x0000; //IECx中断禁止
IEC1 = 0x0000;
IEC2 = 0x0000;
}
void ConfigIO_IN()
{
TRISD = TRISD&0xfdf8;//RD0~RD2,RD9配置为输出
TRISD = TRISD|0x0100;//RD8配置为输入
PORTD = PORTD&0xfff8;//RD2~RD0为000,KEYA=0,选通U24
}
void InitializeIC()
{
ConfigIO_IN();
InitializeTMR3();
IC1CON = 0x0002;//捕捉Timer3,每1次捕捉事件中断一次,每一个下降沿捕捉一次
IFS0bits.IC1IF = 0;//清IC6中断标志
IEC0bits.IC1IE = 1;//使能中断
IPC0bits.IC1IP = 6;//设置中断优先级6
}
void InitializeTMR1()
{
TMR1 = 0; //定时器1计数寄存器TMR3=0
T1CON = 0x0000; //使用内部时钟,预分频比为1:1
PR1 = 0x4e20; //定时器Timer1周期寄存器PR1=0x4e20,10ms初值
IFS0bits.T1IF = 0; //清除TMR1的中断标志
IPC0bits.T1IP = 7; //中断优先级为7
IEC0bits.T1IE = 1; //使能中断
T1CONbits.TON = 1;//打开定时器TMR1
}
void InitializeTMR3()
{
TMR3 = 0;//定时器3计数寄存器TMR3=0
T3CON = 0x0000;//使用内部时钟,预分频比为1:1
T3CONbits.TON = 1;//打开定时器TMR3
}
void __attribute__((__interrupt__))_IC1Interrupt(void)
{
unsigned int i = 0;
unsigned long CaptureDiffValueTemp = 0;
for(i=0; i<4; i++)//求一阶差分值
{
CaptureDiffValue[i] = (CaptureValue[i+1] - CaptureValue[i]);
if(CaptureDiffValue[i] == 0)
{
CaptureDiffValueTemp = 0xffff + CaptureDiffValue[i+1] - CaptureDiffValue[i];
CaptureDiffValue[i] = CaptureDiffValueTemp;
}
CaptureValue[i] = CaptureValue[i+1];
}
CaptureValue[4] = IC1BUF;//获取捕捉值
IFS0bits.IC1IF = 0;
}
void __attribute__((__interrupt__))_T1Interrupt(void)
{
IFS0bits.T1IF = 0;
PORTDbits.RD9 = ~PORTDbits.RD9;
}
int main()
{
InitializeSys();
InitializeIC();
InitializeTMR1();
while(1)
{
PORTD = PORTD&0xfff8;//RD2~RD0为000,KEYA=0,选通U24
PORTD = PORTD&0xfff8|0x0002;//RD2~RD0为000,LEDA=0,选通U27
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -