单片机AD采集回来的数值如何能显示为对应的电压值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机AD采集回来的数值如何能显示为对应的电压值?相关的知识,希望对你有一定的参考价值。

参考技术A

voltage=AD_data*Vref/16777216。

voltage为电压值:AD_data为AD芯片的采集离散数值。

Vref为基准电压:16777216为2^24。

比如是2.5V,ADC转换的电压就是2.5/65535 *nAdc(V)。nAdc就是采集的ADC的值,也就是说,ADC的量程为0~2.5V,最小分辨率为2.5/65535=38uV。

Vref就是AD的参考电压,比如要转换5V的电压~ Vref=10V, GND=0V

那么输出的AD结果就是32768(65536的一半),而如果Vref=5V,GND=0V

那么输出的AD结果就是65536。

扩展资料:

电压表,测电压,电路符号圈中V.

测谁电压跟谁并(联),“+”进“-”出勿接反。

(注:实际上电压表不是开路,有电流流过,但由于电压表电阻在10kΩ以上,因此在初中物理中被视为断路。理想中的电压表电阻无限大,但这种电压表是不存在的)

通常先画连电路,最后添加电压表。

量程选用3V,0.1伏一小格。

量程选用15V,一小格为0.5(V)。

参考资料来源:百度百科-电压

利用XPT2046芯片转换电位器模拟值为数码管显示数值的单片机项目源码

技术图片技术图片

技术图片

技术图片

技术图片

技术图片

技术图片

技术图片

技术图片

技术图片

/***实验现象:下载程序后四位数码管显示XPT2046芯片转换电位器模拟值,范围是0-4096,一般达不到最大4096,这个受你供电电压的影响。还有就是数码管个位出现数字跳动,是源于程序中编写了每50下读取XPT2046芯片转换电位器模拟值,一是避免XPT2046芯片转换电位器模拟量为数字跳动太快,二是体现了XPT2046芯片在进行转换电位器模拟值。***/
#include <reg52.h>
#include<intrins.h>
#define uint unsigned int 
#define uchar unsigned char
#define GPIO_DUAN P3
uchar table[]={0x3f, 0x06, 0x5b, 0x4f,0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c,0x39, 0x5e, 0x79, 0x71};
uchar DisplayData[5];
sbit HCA = P2^2;//HCA,HCB,HCC是利用了74HC138译码器来进行位选,我们动态位选了4位
sbit HCB = P2^3;
sbit HCC = P2^4;
sbit CLK  = P1^0;
sbit CS   = P1^1;
sbit DIN  = P1^2;
sbit DOUT = P1^3;
void DisplayDS();
void delayms(uint xms);
uint Read_AD_Data(uchar moshi);
void SPI_Write(uchar moshi);
uint GetValue();
  void main()
{
   uint temp, cnt = 50;
   while(1)
  {
    if(cnt == 50)//每50下读取转换值,避免数字跳动太快
   {
     temp = Read_AD_Data(0x94);
     cnt = 0;
    }
    cnt++;
    DisplayData[0] = table[temp/1000];
    DisplayData[1] = table[temp%1000/100];
    DisplayData[2] = table[temp%100/10];
    DisplayData[3] = table[temp%10];
    DisplayDS();
   }
}
  void DisplayDS()//动态扫描函数
{
   uint i;
   for(i = 0; i < 4; i++)
 {
    GPIO_DUAN = 0x00;
    switch(i)
  {
     case 0 : 
             HCC = 0; HCB = 0; HCA = 0; 
             break;
     case 1 : 
             HCC = 0; HCB = 0; HCA = 1; 
             break;
     case 2 : 
             HCC = 0; HCB = 1; HCA = 0; 
             break;
     case 3 : 
             HCC = 0; HCB = 1; HCA = 1; 
             break;
    }    
    GPIO_DUAN = DisplayData[i];
    delayms(1);
  }
}
  void delayms(uint xms)
{
   uint i, j;
   for(i = 0; i < xms; i++)
    for(j = 0; j < 110; j++);
 }
  uint Read_AD_Data(uchar moshi)//读取最终的数字量函数
{
   uint i, ans;
   SPI_Write(moshi);    
   for(i = 0; i < 5; i++);
   CLK = 1;
   _nop_();
   _nop_();
   CLK = 0;
   _nop_();
   _nop_(); 
   ans = GetValue();
   CS = 1;
   return ans;
 }
  void SPI_Write(uchar moshi)//写模式函数
{
   uint i;
   CS = 0;
   for(i = 0; i < 8; i++)
 {    
    CLK = 0;
    DIN = moshi>>7;
    CLK = 1;
    moshi <<= 1;
   }
   CLK = 0;
 }
  uint GetValue()//读取DOUT管脚,得到最终数字量函数。
{
   uint i, ans = 0;
   for(i = 0; i < 12; i++)
 {
    CLK = 0;
    ans <<= 1;
    ans |= DOUT;
    CLK = 1;
   }
   CLK = 0;
   return ans;
 }

 

以上是关于单片机AD采集回来的数值如何能显示为对应的电压值?的主要内容,如果未能解决你的问题,请参考以下文章

怎样把电压编码后转换为实际电压数值

51 单片机AD采集电压值的坑

单片机如何采集4-20mA电流信号,是否要转换成0-5V的电压信号,怎么转换?

单片机ad与pwm问题

STC系列AD采集-P14端口模拟量以及转换电压值发送到串口

Proteus仿真PCF8591 AD电压采集8X8点阵显示