一、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。
设计资源 培训 开发板 精华推荐
- LPS25HB适配器板,标准DIL 24插座
- 使用 Infineon Technologies AG 的 OM1850NMM 的参考设计
- LTC1565 新型连续时间低通滤波器具有差分 I/O、线性相位和宽动态范围
- LTC3630HMSE 12V 至 65V 输入至 12V 输出和 100mA 输入电流限制的典型应用电路
- LT1171IQ、-12/2.5A 正负降压-升压转换器的典型应用
- AM2G-4807DZ ±7.2V 2 瓦 DC-DC 转换器的典型应用,适用于开/关控制应用
- 用于有刷直流电机的桥驱动IC —— TB6642FTG
- 桌面焊接吸烟器
- 2019年C题:线路负载及故障检测装置+828006A
- LTC3459 的典型应用 - ThinSOT 中的 10V 微功率同步升压转换器