这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » F413 关于用F413的比较器测电阻的方法?

共3条 1/1 1 跳转至

F413 关于用F413的比较器测电阻的方法?

院士
2006-09-17 18:14:16     打赏
F413 关于用F413的比较器测电阻的方法?



关键词: 关于     比较器     电阻     方法    

院士
2006-12-22 22:43:00     打赏
2楼
问 用F413的比较器测电阻的方法看过两种:
1.TI的文档。
TI用一个标准电阻,以电阻放电时间的比值测。
Rref/Rt=Nref/Nt。
2.在胡大可的书上P83
介绍了用两个标准电阻测量的方法,讲的不是很清楚。
Rt=R1+(R2-R1)*(Nt-N2)/(N1-N2)。

我用第一种方法,通过交换比较器输入的方法(CAEX)作得已经比较稳定了。只是不明白第二种方法的精髓在什么地方。感觉两种方法都受标准电阻的限制,如果考虑成本不用高精度的电阻,标准电阻的温漂、误差都会影响测量精度。在调校上也看不出第二种方法比第一种方法有哪些优势。
请高手解惑。
谢谢! 1: 如果两个标准电阻一致,就可以减小或抵消温漂等相对误差的影响,就像工业测温传感器常用的桥路法。抵消补偿导线的温漂引起的误差。

菜鸟
2010-12-24 18:51:30     打赏
3楼

谁帮我看看我的也是用比较器测电阻,可是一直没有调通。我用的是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();
}
}

 


共3条 1/1 1 跳转至

回复

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