最近做一个拓扑识别模块用到了MSP430的比较器(Comparator E),这个比较器还是蛮好用的,支持多个参考,支持比较输出以及中断功能,还可以设置比较器输出高电平和输出低电平时的比较阈值(这功能真是太好用了,这样就能在我想要的波形位置触发中断,比如可以利用这功能在正弦波零点附近触发晶闸管的导通),以及内部自带一个电阻网络(比较器的比较阈值可以通过这个电阻网络设置成不同大小),还带有RC滤波输出功能。
我在调试过程中一开始对这个电阻网络一直没搞清楚怎么使用,后来不断调试程序才慢慢懂得了他的作用,Comparator E的电阻网络有两个输出如下图1,VREF1, VREF0,这两个的值通过CEREF1和CEREF0来设置的,MSP430FR6972数据手册比较器部分提供了VREF1和VREF0的计算公式(VREFx=VIN*(n+1)/32)如下图2,里面的VIN就是CECTL2寄存器的CEREFLx位确认,注意要使用电阻网络需要正确配置CECTL2寄存器的CERSx位,VREF1的作用是当比较器由低到高的时候作为和输入的比较,VREF0的作用是当比较器由高到低的时候作为和输入的比较,但是实测发现不起作用不知道为什么,而且实测发现如果CEREF1和CEREF0的值设置不一样时输出会出现很多脉冲(如下图3)感觉是误触发了,但是不清楚为什么会产生。
程序代码如下:
/*
此代码测试条件:在P1.0输入一个正弦波半波,连接到比较器的正输入,比较器的负输入接VREF1和VREF0(内部自动切换),P1.1作为比较器输出(当V+ > V-输出高电平,否则输出低电平)
*/
void MSP_Comparator_Init(void)
{
/* 配置比较器输入输出引脚:P1.0信号输入,P1.1比较结果输出 */
P1SEL1 |= BIT0 | BIT1;
P1SEL0 |= BIT0;
P1SEL0 &= ~BIT1;
P1DIR |= BIT1;
CECTL0 = CEIPEN | CEIPSEL_0; /* 比较器V+接输入信号通道1,V-接内部参考 */
CECTL1 = CEPWRMD_1; /* 低功耗模式:正常工作模式 */
CECTL1 |= CEF+CEFDLY_3; /* 开启RC滤波功能,滤波延时3600ns */
CECTL1 |= CEIES; /* 下降沿触发中断 */
CECTL2 = CEREFL_2 | CERS_2 | CERSEL; /* REF=2.0V, 使用内部参考(电阻网络打开), 参考接V- */
CECTL2 |= CEREF0_7; /* 比较阈值0.5V */
CECTL2 |= CEREF1_7; /* 比较阈值0.5V: 2.0*(7+1)/32=0.5 */
CECTL3 = BIT0; /* 关闭输入缓冲功能 */
CECTL1 |= CEON; /* 开启比较器 */
// CEINT = CEIE; /* 开启比较器中断(下降沿触发) */
Delay_Ms(10); /* 延时一会,不做也行 */
}
程序运行结果如下图4和图5,图4设置的比较阈值是0.5V,图5设置的阈值是1V,从结果来看和预期是符合的。
图1
图2
图3
图4
图5