这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 413 413比较器的一个非正常现象,请专家解答

共2条 1/1 1 跳转至

413 413比较器的一个非正常现象,请专家解答

院士
2006-09-17 18:14:16     打赏
413 413比较器的一个非正常现象,请专家解答



关键词: 比较器     一个     正常现象     专家解答    

院士
2006-12-22 22:43:00     打赏
2楼
问 用比较器测量电阻值,采用的是为待测电阻测量值与已知电阻测量值比较的原理
上面的数据为待测电阻,下面的数据为已知电阻

SCFQCTL= 4F 3F 2F 1F 0F
计数值 =12692 10158 7626 5094 2558

SCFQCTL= 4F 3F 2F 1F 0F
计数值 =23548 18844 14140 9436 4732

现在有一个问题 计数值可能在上面数据的+2或者+4跳动,而没有出现+1+3这样的奇数?

比较器内部已经加入RC低通滤波,因为不加低通滤波则数据毫无规律?也是不解。

当对端口置低开始放电计时以后的程序代码中加入一条_NOP(); 数据变成奇数?
也是+2或者+4这样跳动。 1: 照理说定时器的计数是连续的,不可能二个字这样的跳变,如果不是定时器的原因
那问题可能出在比较器部分。

以下为调试记录的一段:
修改程序中放电开始部分代码,再次测量,发现铂电阻的数值都是奇数,而参考电阻的数值
都是偶数。奇怪?在对端口开始放电的程序末尾加入_EINT()或者_NOP()指令。则数据从奇
至偶或者从偶到奇,与后面的指令数有关。增加TEST1字节判断比较器中断发生时刻,是在
开始放电以后。使比较器的低通滤波不起作用,再次观测数据,所得到的铂电阻和参考电阻
的值从数字上基本是一致的,说明测量的结果没有可信度。然而铂电阻的数据有奇数也有偶
数,说明此时的定时器计数没有一直导致数据为偶或奇的因素存在,这样得出的结论是比较
器后的低通滤波器可能是造成数据固定为奇或者偶的原因。在取消低通滤波器以后仍然不能
实现温度的测量,所以仍需解决数据非连续变化的问题。

比较器加入低通滤波环节后可能产生这种现象?不解?? 2: 不存在这个问题,我做的结果很好。
给个程序和硬件图看看吧。
充放电的时间完全是随机的,得到的结果是在一定范围内的任意数,都是奇偶是有问题的。 3: void main()
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
SCFQCTL = 0x3F;
FLL_CTL0 = XCAP14PF; // Configure load caps

sb_count = 0; //
secend = 0; //

/*--P6.0 -> OUT -------------------------------*/
P6DIR |= BIT0; //
P6SEL &= ~BIT0; // 关闭VCC1
P6OUT |= BIT0; // 节约电流消耗

/*--LCD----全部显示后关闭--------------------*/
LCD_test();
// for(i=0; i<200; i++) delay(200);
LCD_clear();

/*--Timer--设置为每秒一次中断--------------*/
BTCTL = BTFRFQ1 +BTDIV+BT_fCLK2_DIV128; // 32.768k
// IE2 &= ~BIT7; // IE2 BIT7=0
IE2 |= BTIE; // 基础时钟允许中断

/*--Sensor input--------------------------------*/
P1IE |= BIT3; // P1.3 IE enable
P1SEL &=~BIT3; // P1.3 for in/out
P1DIR &=~BIT3; // P1.3 for input


/*--UART--------------------------------------*/
CCTL0 = OUT; // TXD Idle as Mark
TACTL = TASSEL1 + MC1;// SMCLK, continous mode
P1SEL = TXD + RXD; // PP1.0/1 TA0 for TXD/RXD function
P1DIR = TXD; // TXD output on P1
P2DIR = BIT5;

/*---------------------------------------------*/
init_timer();
_EINT(); // Enable interrupts


/*---------------------------------------------*/
while(1)
{


if(secend!=0)
{

secend = 0;
init_compare(); adc_time = TAR;
init_port();

for(i=0; i<200; i++) delay(200);

adc_time = TAR;


if((sec_n & 0x01) == 0) {
_DINT(); // Disable interrupts
Rres_HIZ();// 首先切掉参考电阻
adc_time = TAR; // 记录时间
Rin_CLR(); // 开始通过铂电阻放电
_EINT(); // Enable interrupts
_EINT(); // Enable interrupts
_NOP();

}
else
{
_DINT(); // Disable interrupts
_DINT(); // Disable interrupts
Rin_HIZ(); // 首先切换铂电阻
adc_time = TAR;// 记录时间
Rres_CLR();// 开始通过参考电阻放电
_EINT(); // Enable interrupts
_EINT(); // Enable interrupts
_EINT(); // Enable interrupts
_NOP();
}


}

if((status & ad_stop)!=0)
{
status &= ~ad_stop;


adc_buf[6] =adc_time%10;
adc_buf[5] =(adc_time%100)/10;
adc_buf[4] =(adc_time%1000)/100;
adc_buf[3] =(adc_time%10000)/1000;
adc_buf[2] =adc_time/10000;


LCD_Display(&adc_buf[0]);
secend = 0;
init_port(); //initialize port
for(i=0; i<200; i++) delay(200);

close_compare(); //


}


}// end while 1


} // end main


#pragma vector = COMPARATORA_VECTOR
__interrupt void COMPARATORA_INT(void)
{
adc_time = TAR - adc_time;
status |=ad_stop;
CACTL1 &= ~CAIFG;
} 4: /*----------------------------------------------
初始化定时器
----------------------------------------------*/
void init_timer(void)
{
// TACTL = MC_2+ID_0+TASSEL_1+TACLR; //continue mode,Divid=0,ACLK
// TACTL = MC_2+ID_0+TASSEL_1+TACLR; //continue mode,Divid=0,ACLK
TACTL = MC_2+ID_0+TASSEL_2+TACLR; //continue mode,Divid=0,MCLK
}

/*----------------------------------------------
初始化比较器
----------------------------------------------*/
void init_compare(void)
{

_DINT();
CACTL1 = CARSEL+CAIE+CAON+CAIES+CAREF0; // 1->0
// CACTL1 = CARSEL+CAIE+CAON+CAREF0; // 0->1
//
// CACTL2= P2CA0;
CACTL2= P2CA0+CAF;
CACTL1 &= ~ CAIFG; //
_EINT();
}


/*----------------------------------------------
开启比较器
----------------------------------------------*/
void open_compare(void)
{
_DINT();
CACTL1 |= CAON+CAREF1; //it must be caref_0 if extern viltage will be measured
CACTL1 &= ~ CAIFG; //
_EINT();
}


/*----------------------------------------------
关闭比较器
----------------------------------------------*/
void close_compare(void)
{
_DINT();
CACTL1 &=~(CAON+CAREF0); //close compare_a to lowpower mode
CACTL1 &= ~ CAIFG; //
_EINT();
} 5: 想要试试SCAN IF的功能 6: 也就是比较器测量电阻的那个参考电路
只是不用3XX系列改用F413来实现。
P1.5接REF;
P2.0接IN
CA1接电容 3个1uF并联

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]