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

一、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。

发布了78 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bhniunan/article/details/104226814