F413 关于用F413的比较器测电阻的方法?
1.TI的文档。
TI用一个标准电阻,以电阻放电时间的比值测。
Rref/Rt=Nref/Nt。
2.在胡大可的书上P83
介绍了用两个标准电阻测量的方法,讲的不是很清楚。
Rt=R1+(R2-R1)*(Nt-N2)/(N1-N2)。
我用第一种方法,通过交换比较器输入的方法(CAEX)作得已经比较稳定了。只是不明白第二种方法的精髓在什么地方。感觉两种方法都受标准电阻的限制,如果考虑成本不用高精度的电阻,标准电阻的温漂、误差都会影响测量精度。在调校上也看不出第二种方法比第一种方法有哪些优势。
请高手解惑。
谢谢! 答 1: 如果两个标准电阻一致,就可以减小或抵消温漂等相对误差的影响,就像工业测温传感器常用的桥路法。抵消补偿导线的温漂引起的误差。
谁帮我看看我的也是用比较器测电阻,可是一直没有调通。我用的是F449的芯片
#ifndef MSP430F449_H
#include"msp430x44x.h"
#include"bijiaoqi.h"
#include"rs.h"
#endif
#define uchar unsigned char
#define uint unsigned int
#define CA0_IN BIT6 //将比较器输入端CA0定义到P1.6
#define CA1_IN BIT7 //将比较器输入端CA1定义到P1.7
#define FINISH 1
#define N_FINISH 0
#define SHUCHU_BIT0 P1DIR|=BIT0
#define SHURU_BIT0 P1DIR&=~BIT0
#define SHUCHU_BIT1 P1DIR|=BIT1
#define SHURU_BIT1 P1DIR&=~BIT1
#define SET_BIT0 P1OUT |=BIT0
#define CLR_BIT0 P1OUT&=~BIT0
#define SET_BIT1 P1OUT |=BIT1
#define CLR_BIT1 P1OUT&=~BIT1
#define REF_ZHI 10 //参考电阻的阻值,K欧姆
#define CPU_F ((double)1048576)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
uchar StaBuHuo=N_FINISH; //捕获状态标志
float dianzu;
uint dianzu1;
uchar index[50];
uchar h;
/*void delay(uchar lhh)
{
for(uchar l=0;l<lhh;l++)
{
for(int h=0;h<2000;h++);
}
}
*/
void CompInit()
{
CACTL1 |= CARSEL+CAREF_1; //内部参考源接负端,内部参考源为0.25Vcc
CACTL2 |= P2CA0; //CA0选择外部信号输入,CA1不选择外部信号输入
P1SEL|=BIT6+BIT7;
P2SEL=BIT6;
CAPD = CA0_IN+CA1_IN; //关闭输入缓冲
}
void InitBhTimerA()
{
TACTL |= TASSEL_2+TACLR+ID_3; //定时器A,时钟源:MCLK,连续计数模式,8分频
TACCTL1 |= CCIS_1+CM_2+CAP; //选择下降沿捕获,CCI1B 为信号源,
}
void CompOpen()
{
CACTL1 |= CAON;
}
void CompClosed()
{
CACTL1 &= ~CAON;
}
void GoBhTimerA()
{
TACCR1=0;
TACTL |= MC1+TACLR; //打开计数器
TACCTL1 |= CCIE; //捕获中断允许
}
void ComeBhTimerA()
{
TACTL &=~ MC1; //打开计数器
TACCTL1 &=~ CCIE; //捕获中断允许
}
unsigned char GetTime(uint *buhuo)
{
uint j=N_FINISH;
if(StaBuHuo==FINISH)
{
j=FINISH;
}
*buhuo=CCR1;
return j;
}
void ClearBuHuo()
{
StaBuHuo=N_FINISH;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA1()
{
switch (__even_in_range(TAIV,10))//TAIV中断标志
{//捕获/比较1中断
case 2:
StaBuHuo=FINISH;
break;
}
}
void InitSys()
{
uchar i;
FLL_CTL1&=~XT2OFF; //打开XT2振荡器
do
{
FLL_CTL0 &= ~XT2OF; //清除振荡器失效标志
for(i=0xff;i>0;i--);//延时,等待XT2起振
}
while (FLL_CTL0 & XT2OF); //判断XT2是否起振
FLL_CTL1 |=SELM1+SELS; //选择MCLK、SMCLK为XT2
}
/****************************************************************************
测量电阻阻值
返回值:电阻值
*****************************************************************************/
void uart_send(uchar send)
{
while (!(IFG2 & UTXIFG1));
// while((IFG2&UTXIFG1)==0);
TXBUF1=send;
}
void main()
{ while(1)
{ WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
FLL_CTL0 |= XCAP14PF; // Configure load caps //中断允许
CompOpen();
GoBhTimerA();
InitSys();
InitBhTimerA();
CompInit();
P4SEL |= 0x03; //p4的0和1都设为 //P4.0为输出口
ME2 |= UTXE1 + URXE1; // 使能USART1 TXD/RXD
UCTL1 |= CHAR; // 字符长度为8位
UTCTL1 |= SSEL1; // UCLK=SMCLK
UBR01 = 0x36; // 1MHz 19200
UBR11 = 0x00; // 1MHz 19200
UMCTL1 = 0x6B;
UCTL1 &= ~SWRST;
IE2 |= URXIE1;
uint time_ref0,time_ref1,time_rsen0,time_rsen1,iq0,iq1;
// _EINT(); //中断允许
_EINT();
//充电
SHUCHU_BIT0; //通过REF充电
SET_BIT0;
delay_ms(15); //延时15ms
//测REF放电时间
// ClearBuHuo();
time_ref0=TAR;
CLR_BIT0; //通过REF放电
while(GetTime(&time_ref1)==0); //读REF放电的时间 //问题1
iq1=time_ref1-time_ref0;
//充电
SHUCHU_BIT0; //通过REF充电
SET_BIT0;
delay_ms(15); //延时15ms
//测RSEN放电时间
// ClearBuHuo();
time_rsen0=TAR;
SHURU_BIT0; //停止通过REF充电
SHUCHU_BIT1; //通过RSEN放电
CLR_BIT1;
while(GetTime(&time_rsen1)==0); //读REF放电的时间 //问题2
iq0=time_rsen1-time_rsen0;
SHURU_BIT1; //停止放电
//计算电阻值
dianzu=REF_ZHI*iq0;
dianzu=dianzu/iq1;
dianzu=dianzu*1000;
dianzu1=(uint)dianzu;
// dianzu1='a';
index[2*h]=(dianzu1)/128;
index[2*h+1]=(dianzu1)%128;
h++;
uart_send(index[0]);
uart_send(index[1]);
CompClosed();
ComeBhTimerA();
}
}
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |