共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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |