MSP430ADC偏差过大问题

2019-03-24 11:01发布

我在练习的时候发现用ADC测量电压的时候写了如下程序然后测量单片机的地。显示的电压总不为零,大约有0.03v左右的偏差。各位大大请问是我程序的问题还是什么问题啊?(头文件比较多我就只把函数复制上来了)
/*******************内部IO初始化函数*******************************************/
void Port_Init()
{
  P1DIR &=0x00;
  P4SEL = 0x00;
  P4DIR = 0xFF;
  P5SEL = 0x00;
  P5DIR |= BIT0 + BIT1 + BIT3 + BIT5 + BIT6 + BIT7;
  P6DIR |= 0xff;
}
/******************ADC初始化***************************************************/
void Adc_Init()
{  
  P6SEL |= BIT0 + BIT1;                              //选择AD通道P6.1
  ADC12CTL0=ADC12ON+MSC+SHT0_4+REF2_5V+REFON; //采样保持时间:16个ADC12CLK,参考电压2.5V
  ADC12CTL1=ADC12SSEL_2 + SHP + CONSEQ_3 + CSTARTADD_0;                  //序列通道多次转换模式
  ADC12MCTL0 =SREF_1+INCH_0;
  ADC12MCTL1 =SREF_1+INCH_1+EOS;
  ADC12IE = BIT1;                            // 使能转换中断
  ADC12CTL0 |= ENC;                         // 使能AD转换器
}
/*****************************************电压换算*****************************/
float Voltage_do(uint temp_d)
{
  float temp_3;
  temp_3=(temp_d)/4095.0;            //转换公式,ADC数字量转换为电压大小
  return temp_3*2.5;
}
/**************电压转换成数组**************************************************/
void num_trans(float temp_d)
{
  A4=(int)temp_d;                        //分出百,十,和个位
  temp_d*=10;
  A5=((int)temp_d)%10;
  temp_d*=10;
  A6=((int)temp_d)%10;
  temp_d*=10;
  A7=((int)temp_d)%10;
  temp_d*=10;
  A8=((int)temp_d)%10;
  Temp_Value[0]=A4+0x30;
  Temp_Value[1]='.';
  Temp_Value[2]=A5+0x30;
  Temp_Value[3]=A6+0x30;
  Temp_Value[4]=A7+0x30;
  Temp_Value[5]='V';
  Temp_Value[6]=' ';

}
/**************显示数组********************************************************/
void  LCD_DisplayV(uchar h)
{
  uchar i=0;
  for(i=0;i<=6;i++)
    LCD_PutChar(8*i,h,Temp_Value[i],White,Black);
}
/********************AD中断函数************************************************/     
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
  num_trans(Voltage_do(ADC12MEM0));//转化成字符输出
  LCD_DisplayV(0);

}
/*************************主函数***********************************************/
void main()
{  
  WDTCTL=WDTPW+WDTHOLD;//关看门狗
  Port_Init();
  Clock_Init();  //初始化时钟
  Device_code=0x9320;
  TFT_Initial();
  CLR_Screen(Black);
  Adc_Init();//初始化串口
  //ADC12CTL0&=!ENC;//关闭AD转换
   _EINT();
  while(1)
  {
      ADC12CTL0|=ENC;         //使能AD转换
      ADC12CTL0 |= ADC12SC;   // 开启转换
      ADC12CTL0&=~ADC12SC;
      
   }
}
此帖出自小平头技术问答
0条回答

一周热门 更多>

相关问题

    相关文章