大家好.我这里想用s12dp256测发动机的转速,使用外部16MHz的晶振..用的是输入捕捉功能.想测量一下两个下降沿的时间间隔.我这里把A口与通道0相接,用A口发送高低电平的脉冲,当通道0捕捉到电平变化后进入中断,这个时候中断里的dic就是2次下降沿的时间间隔吧...关键点是::我想问一下.这个时间间隔长度具体到咱们的分秒上怎么算出来呢?..比如我测到dic=42那我怎么能知道A口脉冲下降沿的频率呢? 具体dic记一个数是多长时间呢? 问题比较多哈.谢谢大家了.希望版主能帮我说一下.
/*ECT应用举例2-使用输入捕捉功能对脉冲进行计数 2009年2月 */
/*本例利用输入捕捉0通道(PT0在管脚9)对外来方波信号进行捕捉,采用中断方式.
中断发生后,读取捕捉后的计数值,并用LED灯指示中断成功.
通道0设置为输入捕捉,采用双沿触发,IC0开中断,可以进入终端服务程序.通道0接受外来方波信号 */
#include <hidef.h> /* common defines and macros */
#include <mc9s12dp256.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
unsigned char ic4,dic4,ic40;
void ic_init (void) //输入捕捉初始化函数
{
TSCR1=0x90; //主定时器使能
TSCR2=0x07; //分频因子为128
ICSYS=0x02; //IC缓冲使能
TIOS=0x00; //通道设置为输入捕捉
TCTL4=0x02; //采用下降沿触发
TIE=0x01; //通道0开中断
}
void delayms(int ms)
{
int ii,jj;
if (ms<1) ms=1;
for(ii=0;ii<ms;ii++)
for(jj=0;jj<1335;jj++);
}
void main(void)
{
EnableInterrupts;
ic_init();
DDRA=0xff; //设置PORTA的方向寄存器,为输出
PORTA=0x00; //PORTA的输出初始化为低电平
DDRB=0xff; //PORTB设置为LED灯的控制信号
PORTB=0xff;
delayms(2000); //LED灯全亮
for(;;)
{
PORTA=0x00; //循环中设置为高电平
delayms(100);
PORTA=0xff; //循环中设置为低电平,产生一个方波
delayms(100);
}
}
#pragma CODE_SEG NON_BANKED
void interrupt 8 ic0_int(void) //中断服务程序
{
TFLG1_C0F=1; //中断标志清除
ic4=TC0; //通过读TC0寄存器来相应中断,
dic4=ic4-ic40;
ic40=ic4; //得到脉冲宽度不需要考虑溢出
PORTB=0x55; //用LED灯来指示已经进入了中断
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |