历史上的今天
返回首页

历史上的今天

今天是:2025年03月22日(星期六)

2021年03月22日 | 飞思卡尔16位单片机(九)——ECT模块测试

2021-03-22 来源:eefocus

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


推荐阅读

史海拾趣

Collins Electronics Corp公司的发展小趣事

在电子行业竞争日益激烈的情况下,Collins Electronics Corp面临着巨大的挑战。为了保持竞争优势,公司加大了研发投入,不断优化产品性能。同时,他们还加强了对市场趋势的研究,以便及时调整产品策略。在一次行业技术革新中,公司凭借敏锐的市场洞察力和强大的研发能力,成功推出了一款符合市场需求的新产品,赢得了市场份额。

FLIR公司的发展小趣事

为了进一步扩大市场份额,FLIR在20世纪80年代末至90年代进行了一系列重要的战略并购。1990年,FLIR收购了美国休斯飞机公司在工业红外成像领域的业务,这一举动极大地增强了其在商业热成像市场的竞争力。随后,FLIR又分别收购了瑞典的Agema公司和波士顿的Inframetrics公司,这两家公司都是红外热像仪领域的佼佼者,拥有丰富的技术积累和市场资源。通过这些并购,FLIR不仅壮大了自身的研发团队和销售网络,还加速了其挺进商用热成像市场的步伐,进一步巩固了其市场领先地位。

Bussmann (Eaton)公司的发展小趣事

1914年,Bussmann五兄弟以家族生意为起点,在自家的地下室里开始生产熔断器。他们凭借对电路保护的深刻理解和对市场需求的敏锐洞察,不久便将业务从地下室扩展到了小型厂房,并专注于汽车熔断器的生产。这一转变不仅标志着Bussmann业务的飞速发展,也奠定了其在电路保护领域的基石。通过不断的技术创新和市场拓展,Bussmann逐步在保险丝市场上取得了领先地位。

Directed Energy Inc公司的发展小趣事

作为一家在电子行业中具有影响力的企业,Directed Energy Inc深知自己肩负的社会责任。公司积极参与各种公益活动和社会事务,为社会的发展贡献自己的力量。同时,公司还注重环保和可持续发展,努力降低生产过程中的能耗和排放,推动绿色生产。这种积极履行社会责任的态度赢得了社会的广泛赞誉和支持,也为公司的成长提供了有力保障。

请注意,以上故事均为模拟构建,旨在展示Directed Energy Inc公司在电子行业中的可能发展历程和成就。实际情况可能有所不同,具体细节和数据请以公司官方发布的信息为准。

aconno公司的发展小趣事

随着公司实力的增强,aconno开始积极拓展国内外市场。通过与各大电商平台和分销商建立合作关系,aconno的产品迅速覆盖了更广泛的地域和用户群体。此外,公司还积极参与国际电子展和技术交流会,与全球合作伙伴建立紧密的合作关系,共同推动电子行业的发展。

amcc [applied micro circuits corp]公司的发展小趣事

随着公司实力的增强,aconno开始积极拓展国内外市场。通过与各大电商平台和分销商建立合作关系,aconno的产品迅速覆盖了更广泛的地域和用户群体。此外,公司还积极参与国际电子展和技术交流会,与全球合作伙伴建立紧密的合作关系,共同推动电子行业的发展。

问答坊 | AI 解惑

980系统图

[ 本帖最后由 fish001 于 2009-12-24 09:12 编辑 ]…

查看全部问答>

红外循迹避障电路相关介绍

本帖最后由 paulhyde 于 2014-9-15 04:05 编辑 反射式光电传感器简介 反射式光电传感器在机器人中有着广泛的应用。可以用来检测地面明暗和颜色的变化,也可以探测有无接近的物体。这种光电传感器的基本原理是,自带一个光源和一个光接收装置, ...…

查看全部问答>

摄像头编程类+类调用+例子

本帖最后由 paulhyde 于 2014-9-15 09:18 编辑 using System; using System.Runtime.InteropServices; using System.Drawing.Imaging; using System.Windows.Forms; using System.Drawing; namespace YHhotel.YHhotelWindows //注意这里要 ...…

查看全部问答>

USB Serial Class问题

大虾好,    我知道USB Serial Class是把USB模拟程串口来用,现在我就是想通过USB这个串口来和电脑传数据,但是USB接上去后就成了ACTIVE SYNC了,需要怎样设置或修改才能让它当作个串口和电脑收发数据呢?  …

查看全部问答>

谁能给我提供一份支持SD2.0版本的注册表的文件看看,谢谢

主要就是platform.reg和platform.bib这两个文件,谢谢了, 邮箱longqm1984@163.com 谢谢,,因为我没有看到我的那里有调用我的sdbus.dll和sdmemory.dll的入口处,代码中没有找到,谢谢,。…

查看全部问答>

IIC的ACK问题

IIC的ACK应答是硬件从设备自动返回的 在程序中需要对ACK进行判断吗???…

查看全部问答>

求板上各位大虾们帮忙选购倾角传感器

需要做一个模块进行倾角的实时测量,一般在垂直方向上。左右波动30度大概。输出信号接到dsp开发板上,所以输出是模拟和数字的都行。 看到有人用sca60c sca61t        sca100t SCA103T 不知道哪个更适合,或者其他的传感 ...…

查看全部问答>

找个stm32,stm8的代理商

                                 我们买的芯片少 千片之内 找那家代理商比较好…

查看全部问答>

Helper2416-02——区分NandFlash与NorFlash

NandFlash与NorFlash 参与Helper2416开发板助学计划心得 对于Flash的思考: 从开始接触51开始,就知道我们的代码是烧写到片内的Flash里面然后执行的,也就是说代码是在flash里面直接运行。当接触到ARM9的时候,我们知道我们需要把代码从Nand ...…

查看全部问答>