飞思卡尔16位单片机(九)——ECT模块测试

发布者:Ampoule最新更新时间:2021-03-22 来源: eefocus关键字:飞思卡尔  16位单片机 手机看文章 扫描二维码
随时随地手机看文章

        一、ECT模块介绍

        XEP100单片机的增强型捕捉定时器模块(ECT)是在标准定时器模块(TIM)的基础上增加了一些功能而发展起来的定时器模块,ECT特别适合汽车的ABS、ESP等系统的应用。ECT模块包括一个16位的可编程的计数器,ECT有多种功能,最主要的功能是:输入捕捉(IC)、输出比较(OC)、脉冲累加(PAI)和模数递减计数(MDC)。本文主要对最常用的输入捕捉和输出比较功能进行研究。下图为ECT模块的功能框图。

       ECT模块有8个输入捕捉和输出比较通道。当通道设置为输入时,通道具有输入捕捉功能。输入捕捉功能可以测量输入的脉冲信号的一些特征。可以测量脉冲的周期、占空比和频率等特征。


        输入捕捉通道由4个缓冲通道IC0~IC3和4个非缓冲通道IC4~IC7组成。这两部分的功能都是捕捉外部事件发生的时刻,但缓冲通道除了有IC/OC寄存器TCn外,还有保持寄存器TCnH,此外还在入口设置了延迟计数器,用来提高抗干扰能力。非缓冲通道没有持寄存器,也没有延迟计数器。


        下图为输入捕捉功能的原理框图。当使能了ECT模块之后,一个时钟就会一直在不停的计数,这个时钟被称为TCNT,即图中的“16位主时钟”。TCNT由$0000开始计数,每个ECT时钟周期TCNT加1。加到$FFFF后,TCNT再复位为$0000。脉冲信号由单片机引脚输入,信号经过边沿检测器和延时计数器之后输入给ECT模块。当检测到有效边沿(上升沿或者下降沿)时,ECT模块将TCNT的值捕捉到输入捕捉寄存器TCn中,上一个脉冲边沿捕捉的TCNT的值会保存在TCnH中。编程者通过读取相邻两个边沿捕捉的值,并计算两个值之间的差值,就可以计算出两个边沿之间的时间间隔,即可以计算出脉冲的周期。

        当通道设置为输出时,通道具有输出比较功能。输出比较功能一般用于精确计时,也可以用来产生PWM信号。使用时,先向输出比较寄存器TCn中写入一个数值,当TCNT的值与TCn的值相等时,就可以产生一个输出比较事件,使标志位CnF置1。如果使能了中断功能,则可以触发中断。在中断程序中可以执行相应的程序。


        二、ECT输出比较测试

        在本文的资源中,包含了ECT模块的输出比较和输入捕捉功能的测试代码,这个实验我们来研究ECT的输出比较功能。下面的代码是对ECT模块的初始化。


void initialize_ect(void){

  ECT_TSCR1_TFFCA = 1;  // 定时器标志位快速清除

  ECT_TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)

  ECT_TIOS  = 0xff;      //指定所有通道为输出比较方式

  ECT_TCTL1 = 0x00;     // 后四个通道设置为定时器与输出引脚断开

  ECT_TCTL2 = 0x00;     // 前四个通道设置为定时器与输出引脚断开

  ECT_DLYCT = 0x00;     // 延迟控制功能禁止

  ECT_ICOVW = 0x00;     // 对应的寄存器允许被覆盖;  NOVWx = 1, 对应的寄存器不允许覆盖

  ECT_ICSYS = 0x00;     // 禁止IC及PAC的保持寄存器

  ECT_TIE   = 0x00;     // 禁止所有通道定时中断

  ECT_TSCR2 = 0x07;     // 预分频系数pr2-pr0:111,,时钟周期为4us,

  ECT_TFLG1 = 0xff;     // 清除各IC/OC中断标志位

  ECT_TFLG2 = 0xff;     // 清除自由定时器中断标志位

}


        代码中已经加了比较详细的注释,可以根据注释和芯片手册来分析代码,这个函数主要的作用是使能了ECT模块,将所有通道都设置为输出比较功能,并且所有通道都与IO引脚断开。将ECT的计数器TCNT的周期设置为4us。禁止所有通道中断。


        程序的主函数如下所示。


void main(void) {

  DisableInterrupts;

  INIT_PLL();

  INIT_LED();

  initialize_ect();

  EnableInterrupts;

 

  for(;;) 

  {

    ECT_TFLG1_C0F = 1;              //清除标志位

    ECT_TC0 = ECT_TCNT + 31250;         //设置输出比较时间为0.125s

    while(ECT_TFLG1_C0F == 0);      //等待,直到发生输出比较事件

    ECT_TFLG1_C0F = 1;              //清除标志位

    ECT_TC0 = ECT_TCNT + 31250;         //设置输出比较时间为0.125s

    while(ECT_TFLG1_C0F == 0);      //等待,直到发生输出比较事件

    ECT_TFLG1_C0F = 1;              //清除标志位

    ECT_TC0 = ECT_TCNT + 31250;         //设置输出比较时间为0.125s

    while(ECT_TFLG1_C0F == 0);      //等待,直到发生输出比较事件

    ECT_TFLG1_C0F = 1;              //清除标志位

    ECT_TC0 = ECT_TCNT + 31250;         //设置输出比较时间为0.125s

    while(ECT_TFLG1_C0F == 0);      //等待,直到发生输出比较事件

    LEDCPU = ~LEDCPU;           //反转灯的状态

  } 

}


        在主函数的主循环中,ECT_TC0 = ECT_TCNT + 31250;用来定时,由于TCNT的周期为4us,所以定时时间为4us*31250=0.125s,当达到时间时,标志位ECT_TFLG1_C0F置1,然后重新进行计时,直到4个周期结束,也就是计时了0.5s,改变LED的亮灭状态,最后的效果相当于LED以1Hz的频率闪烁。将程序下载到单片机中运行,可以看到相应的现象。


        三、ECT输入捕捉测试

       输入捕捉用来测量脉冲信号的特征,为了产生脉冲信号,我们用单片机的PWM模块产生一路PWM脉冲信号,代码如下。


void init_pwm(void) 

 {

  PWMCTL_CON01= 1;   //联结通道0,1为16位的PWM

  PWMPOL_PPOL1= 1;   //通道01的极性为高电平有效

  PWMPRCLK = 0x55;   //A时钟和B时钟的分频系数为32,频率为1MHz

  PWMSCLA  =  100;   //SA时钟频率为5KHz

  PWMSCLB  =  100;   //SB时钟频率为5KHz

  PWMCLK =0x02;      //通道01用SA时钟作为时钟源

  PWMCAE   = 0x00;   //脉冲模式为左对齐模式

  PWMPER01  = 500;  //通道01的周期为10Hz 

  PWMDTY01  = 250;  //通道01的占空比为50%  

  PWME_PWME1 = 1;    //使能通道01

 }


        这段代码将PWM信号设置为10Hz,占空比为50%,关于这段代码的解释可以参考《飞思卡尔16位单片机(八)——PWM模块测试》这篇文章。


        接下来就是对ECT模块进行设置,代码如下


void initialize_ect(void){

  ECT_TSCR1_TFFCA = 1;  // 定时器标志位快速清除

  ECT_TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)

  ECT_TIOS  = 0xfe;      //指定所有通道为输出比较方式

  ECT_TCTL4 = 0x01;     // 设置通道0为捕捉上升沿方式

  ECT_DLYCT = 0x00;     // 延迟控制功能禁止

  ECT_ICOVW = 0x00;     // 对应的寄存器允许被覆盖;  NOVWx = 1, 对应的寄存器不允许覆盖

  ECT_ICSYS = 0x00;     // 禁止IC及PAC的保持寄存器

  ECT_TIE   = 0x01;     // 使能通道0中断

  ECT_TSCR2 = 0x07;     // 预分频系数pr2-pr0:111,,时钟周期为4us,

  ECT_TFLG1 = 0xff;     // 清除各IC/OC中断标志位

  ECT_TFLG2 = 0xff;     // 清除自由定时器中断标志位

}


        这个设置与输出比较有很多不同的地方,将通道0设置为输入功能,并设置为捕捉上升沿,使能通道0的中断功能。其他设置与输出比较一致。


        在这个程序中,采用中断方式来处理输入捕捉时间,中断服务函数如下所示。


interrupt void capture(void) 

{

 if(ECT_TFLG1_C0F == 1)

   ECT_TFLG1_C0F = 1;

 time1 = time2;

 time2 = ECT_TC0;

 delaytime = time2-time1;

 LEDCPU = ~LEDCPU;

}


        当捕捉到外部输入脉冲的上升沿时,触发中断,在中断中,首先清除标志位,然后读取TC0捕捉到的计数值。最后计算相邻上升沿之间的时间间隔,并保存到delaytime变量中。


       将单片机的PWM输出引脚与ECT的通道0引脚连接在一起,并将程序下载到单片机中运行,在调试界面中可以看到delaytime的值,如下所示。

        可以看到delaytime的值为25000,它是TCNT的时钟数,TCNT的周期为4us,所以可以计算得到两个上升沿之间的时间间隔为4us*25000 = 0.1s,即脉冲的频率为10Hz。


关键字:飞思卡尔  16位单片机 引用地址:飞思卡尔16位单片机(九)——ECT模块测试

上一篇:飞思卡尔16位单片机(十)——PIT模块测试
下一篇:飞思卡尔16位单片机(八)——PWM模块测试

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved