共2条
1/1 1 跳转至页
413 413比较器的一个非正常现象,请专家解答

问
用比较器测量电阻值,采用的是为待测电阻测量值与已知电阻测量值比较的原理
上面的数据为待测电阻,下面的数据为已知电阻
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并联
上面的数据为待测电阻,下面的数据为已知电阻
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 跳转至页
回复
打赏帖 | |
---|---|
汽车+汽车地线之间连接处理被打赏20分 | |
【Zephyr】使用Zephyr外设初始化过程解析被打赏30分 | |
【S32K146】S32DS watchdog 配置使用被打赏20分 | |
【Zephyr】使用 IAR 调试 Zephyr 镜像被打赏20分 | |
赚取电动螺丝刀+电源电路理论知识分享1被打赏5分 | |
我想要一部加热台+分享常见运算放大器电路的应用被打赏5分 | |
【Zephyr】MCXN947 Zephyr 开发入门适配shell被打赏20分 | |
我想要一部加热台+常见的MOS管驱动电路被打赏5分 | |
【我要开发板】6.联合MATLAB记录数据被打赏50分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下串口调试printf输出记录被打赏29分 |