2202|0

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MSP430ADC偏差过大问题 [复制链接]

我在练习的时候发现用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;
      
   }
}
 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表