单片机ad是什么意思_stm32单片机的ad单次转换和扫描转换时什么意思呢 - CSDN
  • AD0~7 做地址总线用的。 AD=address=地址。 对应的有D0~7 是数据总线。 D=data=数据。

    AD0~7 做地址总线用的。 AD=address=地址。
    对应的有D0~7 是数据总线。 D=data=数据。

    展开全文
  • 定义:AD精度 AD精度指的是AD实际转换的结果和理想的计算结果之间的误差,也叫做积分非线性误差,符号是(INL) 单位是LSB LSB=基准/2^AD位数 例如3V的基准 12位AD 那LSB=3/4096 一般芯片的数据手册上都有写明,例如 ...

    定义:AD精度

    AD精度指的是AD实际转换的结果理想的计算结果之间的误差,也叫做积分非线性误差,符号是(INL) 单位是LSB

    LSB=基准/2^AD位数 例如3V的基准 12位AD 那LSB=3/4096

    一般芯片的数据手册上都有写明,例如

    这个手册写的典型值就是正负4个LSB,这就是衡量AD误差的一个标准  上述有些词或者某些描述或许不当,但我能确定的就是了LSB就是衡量一个AD误差最重要指标,若有不当之处还请各位路过高手指出。。。

    展开全文
  • 单片机AD转换

    2020-07-30 23:31:22
    单片机AD转换
  • 51单片机AD封装

    2020-07-30 23:30:07
    自己收集的51单片机AD原理图库,希望对大家有所帮助,希望大家喜欢.
  • 51单片机ad采样

    2020-07-28 23:31:14
    51单片机ad采样,通过外置芯片进行采样
  • 51单片机AD转换程序,ad采样及显示,举一反三,看完了就学会了ad
  • 单片机ad转换电路
  • 51单片机 AD转换

    2016-08-06 17:15:52
    在数逻的课程中,已经学习过AD转换的概念:将模拟信号采样、量化、编码后转换为数字信号。但是未学习过通过单片机编程,显示结果。 编码分有舍有入、只舍不入两种,量化误差前者更小。=2Vm/(2^n+1 - 1 ) 注意...

    在数逻的课程中,已经学习过AD转换的概念:将模拟信号采样、量化、编码后转换为数字信号。但是未学习过通过单片机编程,显示结果。

    编码分有舍有入、只舍不入两种,量化误差前者更小。=2Vm/(2^n+1  - 1 )

    注意,为了达到精确度高、稳定性好的目的,最好将所有器件的模拟地和数字分别连接,最后将模拟地和数字地仅在一点相连。

     

    此处,使用的是STC12C5A60S2内部的AD转换。


    /* 功能:使用12C5A60S2内部AD读取外部电压,显示在1602上       */
    
    #include "STC12C5A60S2.H"
    #include <intrins.h>
    sbit RS = P2^6;   //1602定义口  //HZ:EN=P2.2  RS=P2.0  RW=P2.1
    sbit RW = P2^5;
    sbit EN = P2^7;
    #define uchar unsigned char;
    #define uint unsigned int;
    
    #define RS_CLR RS=0 
    #define RS_SET RS=1
    #define RW_CLR RW=0 
    #define RW_SET RW=1 
    #define EN_CLR EN=0
    #define EN_SET EN=1
    
    #define DataPort P0   //连接1602数据口 P0             
    
    uchar da1=0,da2=0,da3=0;
    double Data,c;
    char a[5]="";         
    uchar ADC_Chanul_Turn=0;
    
    
    void DelayUs2x(unsigned char t)
    {   
     while(--t);
    }
    
    
    void DelayMs(unsigned char t)
    {
         
     while(t--)
     {
         //大致延时1mS
         DelayUs2x(245);
         DelayUs2x(245);
     }
    }
    /*------------------------------------------------
                  判忙函数
    ------------------------------------------------*/
     bit LCD_Check_Busy(void) 
     { 
     DataPort= 0xFF; 
     RS_CLR; 
     RW_SET; 
     EN_CLR; 
     _nop_(); 
     EN_SET;
     return (bit)(DataPort & 0x80);   
     }
    /*---------
    ------------------------------------------------*/
     void LCD_Write_Com(unsigned char com) 
     {  
     while(LCD_Check_Busy()); //忙则等待
     RS_CLR; 
     RW_CLR; 
     EN_SET; 
     DataPort= com;          //
     _nop_(); 
     EN_CLR;
     }
    /*------------------------------------------------
                  写入数据函数
    ------------------------------------------------*/
     void LCD_Write_Data(unsigned char Data) 
     { 
     while(LCD_Check_Busy()); //忙则等待
     RS_SET; 
     RW_CLR; 
     EN_SET; 
     DataPort= Data; 
     _nop_();
     EN_CLR;
     }
    
    /*------------------------------------------------
                    清屏函数
    ------------------------------------------------*/
     void LCD_Clear(void) 
     { 
     LCD_Write_Com(0x01); 
     DelayMs(5);
     }
    /*------------------------------------------------
                  写入字符串函数
    ------------------------------------------------*/
     void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)//y为行数,x为横坐标,最后一个是字符 
     {     
     if (y == 0) 
         {     
         LCD_Write_Com(0x80 + x);     //表示第一行
         }
     else 
         {      
         LCD_Write_Com(0xC0 + x);      //表示第二行
         }        
     while (*s) 
         {     
     LCD_Write_Data( *s);     
     s ++;     
         }
     }
    /*------------------------------------------------
                  写入字符函数
    ------------------------------------------------*/
     void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
     {     
     if (y == 0) 
         {     
         LCD_Write_Com(0x80 + x);     
         }    
     else 
         {     
         LCD_Write_Com(0xC0 + x);     
         }        
     LCD_Write_Data( Data);  
     }
    /*------------------------------------------------
                  初始化函数
    ------------------------------------------------*/
     void LCD_Init(void) 
     {
       LCD_Write_Com(0x38);    /*显示模式设置*/ 
       DelayMs(5); 
       LCD_Write_Com(0x38); 
       DelayMs(5); 
       LCD_Write_Com(0x38); 
       DelayMs(5); 
       LCD_Write_Com(0x38);  
       LCD_Write_Com(0x08);    /*显示关闭*/ 
       LCD_Write_Com(0x01);    /*显示清屏*/ 
       LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
       DelayMs(5); 
       LCD_Write_Com(0x0C);    /*显示开及光标设置*/
       }
       
    /*------------------------------------------------
                      ADC函数
    ------------------------------------------------*/ 
    void InitADC()//初始AD寄存器
    {
             P1ASF=0x03;     //0xff设置P1口全部为ADC通道,P10 P11为输出口
            ADC_RES=0x00;    //清除高8位缓冲数据
            if(ADC_Chanul_Turn%2==0)
            {
                ADC_CONTR=0xF0;    //P10口
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                ADC_CONTR=0xE8;
                    
             }
            if(ADC_Chanul_Turn%2==1)   //P11口
            {
                ADC_CONTR=0xF1; 
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                ADC_CONTR=0xE9;    
             }                              
    }     
    
    void timer0() interrupt 1      //interrupt 1: 定时器0,interrupt3:定时器3
    {
        TH0=(65536-20000)/256;       //高八位,(需要表示Xms的定时,计数器由65536-X数到65536,由于16位,只能分高低位)
        TL0=(65536-20000)%256;     //低八位
        InitADC();
        
    }
    
    void adc_isr() interrupt 5      //FLAG标志位置位触发中断,没有设优先级,但是同优先级下定时器0更高
    {  
       
       //V_5REF=V_1REF*256/da_ref;
       if(ADC_Chanul_Turn%3==0)                     //外部基准电压
       {    
           da1=ADC_RES;                                   //获取转换结果
           Data=((double)da1/256)*5;     //取八位计算基准电压Data,
           c =Data;
           } 
       if(ADC_Chanul_Turn%3==1)
       {
           da2=ADC_RES;                                  //获取转换结果
           Data=((double)da2/256)*5;     //取八位计算实际值Data,
           c =Data;
           }
       if(ADC_Chanul_Turn%3==2)
       {
           da3=ADC_RES;                                  //获取转换结果
           Data=((double)da3/256)*5;     //取八位计算实际值Data,
           c =Data;
           }
          
       a[0]=((int)c%10+0x30);//个位(电压<5,仅有个)     //0x30: ASCAI码里代表“0”,必须转换成字符存在字符型数组里才可以在1602液晶屏上显示
       a[1]=0x2e;                    //小数点
       a[2]=((int)(c*10)%10+0x30); // 十分位
       a[3]=((int)(c*100)%10+0x30);// 百分位
       a[4]='\0';                  //  加了串尾符才成了字符串哦
    
       if(ADC_Chanul_Turn%3==0)  LCD_Write_String(0,0,a);
       if(ADC_Chanul_Turn%3==1)  LCD_Write_String(5,0,a);
       if(ADC_Chanul_Turn%3==2) LCD_Write_String(0,1,a); 
       
       ADC_CONTR&=0xEF;               //标志位清零
       
       ADC_Chanul_Turn++;
       if(ADC_Chanul_Turn==252) 
          ADC_Chanul_Turn=0;    
    }
    void main()
    {
        LCD_Init(); 
        LCD_Clear();                     //清屏
        DelayMs(255);
        TH0=(65536-20000)/256;           //开定时器0
        TL0=(65536-20000)%256;
        EA=1;                             //开全局中断
        ET0=1;                             //允许定时器零中断
        EADC=1;                          //允许ADC中断 
        TR0=1;       
        while(1);
    }


    展开全文
  • 51单片机AD转换

    2020-07-30 23:31:53
    利用51单片机ad0809进行模数转换,其中比较电压利用单片机本身电源,而采样电压用滑动电阻输入。
  • 51单片机AD采集protues仿真,实现数据的多路采集
  • 单片机ad转换模块和数码管显示木块 是微机接口大作业的一部分
  • 本资源内含单片机AD转换控制程序,包括C语言版和汇编版两个版本
  • 51单片机AD转换程序

    2020-07-30 23:32:28
    大学课程,51单片机A/D转换的程序详解。
  • 430单片机AD封装库

    2020-07-27 23:31:25
    MSP430单片机的全部AD原理图元件库和封装库,硬件工程师的开发利器。
  • pic单片机AD转换程序

    2020-07-30 23:32:46
    pic单片机AD转换程序,PIC单片机在实际应用中比较广泛.其汇编语言中,指令比较少,而采取C语言编写可以减少这些烦琐的问题.
  • 基于51单片机,用于内部AD采样,并用LCD1602显示采样电压值
  • PIC单片机AD转换

    2015-07-23 16:34:14
    AD转换  我们先看看R1和R2,R2是个可调电阻 如果我们将R2变大 RA1这个管脚上的电压就越大。R2变小 RA1这个管脚上的电压就越小。那单片机是怎么知道电压变化的。这就需要AD转换。就是将模拟量转换成数字量。    ...

    AD转换

        我们先看看R1和R2,R2是个可调电阻 如果我们将R2变大 RA0这个管脚上的电压就越大。R2变小 RA0这个管脚上的电压就越小。那单片机是怎么知道电压变化的。这就需要AD转换。就是将模拟量转换成数字量。

      

       PIC单片机如何表示电压

         PIC用十位二进制位的数来表示电压,也就是数值0~1023来表示电压。那比如现在这个数值是400那这代表多少的电压?这就要根据参考电压来确定了。

       比如我们设置正参考电压为3.3V ,当输入的电压为0时,数值就为0。当输入的电压为3.3V时,数值就是1023. 那如果输入的电压是1.2V代表多少电压。

      首先,先算出一个数值代表多少的电压 3.3V除以1023 约等于 0.003V .

      然后,1.2V除以0.003V 等于400. 这就得出了400代表的是1.2V。

           见下图我们可以看AN0~AN7.这些都是可以配置成模拟输入的端口。只有这些引脚才能做为AD转换的端口。


    实例讲解:

     例如: 我们看第一张的原理图,从RA0/AN0脚输入个模拟量如果电压大于1.2v则LED亮否则LED灭。

    AD的设置步骤:

       1,设置端口

              将RA0口设置为输入 TRISA =  0x01;

              将RA0口设置为模拟  ANSELA = 0x01;

       2, 配置ADC模块

               选择ADC的转换时钟

               如何选择转换时钟呢 要根据现在的时钟频率进行选择。可以根据数据手册中的表格进行选择 。

              我们设置单片机的时钟频率为32MHZ ,选择ADC周期关键不要选择阴影部分,在32MHz 这一列 我们随意选择了ADC时钟周期1us,对应的时钟源为Fosc/32.,AD控制寄存器1 ADCON1的ADCS<2:0>=010注:ADCS<2:0>代表的意思就是 ADCS的0到2位


                 配置参考电压

                我们这里把正参考电压配置为电源压。AD控制寄存器1 ADCON1的ADPREF<1:0>=00;

                配置左/右对齐

               AD转换后数值是十位的二进制我们用单片机却只是八位的,所以PIC单片机,用两个八位的寄存器来存放AD值,ADRESH用来存放高位结果,ADRESL用来存放低位结果。可是ADRESH和ADRESL加起来是十六啊。那这十位的数值是怎么放在里面的。这就靠左右对齐来设置,

                  如果是右对齐 低8八位放在ADRESL,剩下的2位放在ADRESH中。

                 如果是左对齐 高8八位放在ADRESH,剩下的2位放在ADRESL中。见下图

                

                 我们这里选择右对齐,所以AD控制寄存器1 ADCON1的 ADFM=1

               

                  上面将有关ADCON1寄存器的配置说完了。下面来讲解ADCON0

                选择ADC输入通道  

                AD转换模块只有一个,而AD输入通道有8个AN0~AN7.所以不可能同时进行AD转换,那个需要用我们就分配给那个,根据硬件我们将AD转换模块分配给AN0.

                  所以 ADCON0 的CHS<4:0>=0000;

                开启ADC模块

                 ADC模块开启,ADCON0的ADON=1,只是单纯的启用ADC模块。并不开始AD转换。如果不用ADC模块时候建议关闭。可以省点电哦!!!

                

    3 开始AD转换

                   ADCON0的GO/DONE=1开启AD转换。

     4 等待AD转换结束


     5 读取结果

         一般情况下我们并不取一次的AD转换的值。而是取多次之后算平均值。这样来确保转换的准确性。 配置ADC模块,有许多地方并没有讲解为什么这么配置,因为许多配置其实是比较随意的。并不是那么的绝对的。一定非要选择哪一个。当然实际的配置还是要根据你项目需求。

    //开发环境MPLAB X IDE ,单片机PIC16LF1823. 

    #include <pic.h>

    __CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON

                       &CLKOUTEN_OFF&IESO_ON&FCMEN_ON);//这个要放到上一行去


    __CONFIG(PLLEN_OFF&LVP_OFF) ;
    #define  ADC_NUM   8 //转换的次数
    #define  LED       LATA1
    void init_GPIO(void)
    {
        TRISA =  0x01;//端口设置为输入
        ANSELA = 0x01;//设置为模拟输入
        PORTA = 0x00;
        LATA  = 0x00;
    }
    void init_fosc(void)
    {
        OSCCON = 0xF0;//32MHZ
    }
    void init_AD(void)
    {
     ADCON1= 0xA0;//右对齐,AD时钟为Fosc/32,参考电压为电源电压,
     ADCON0= 0x00;//选择通道AN0
     ADCON0bits.ADON = 1;//开启模块
    }
    unsigned int ADC_BAT_ONE(void)//转换一次
    {
        unsigned int value;
        value=0;
        ADCON0bits.CHS =0;//选择通道AN0
        ADCON0bits.ADGO=1;//开始转换
        while(ADCON0bits.GO==1);//等待转换结束


        value=(unsigned int)ADRESH;//强制类型转换,因为ADRESH是字符型的只能表示8位二进制。所以必须转换成可以容纳10位二进制的整型。
        value= value<<8;// 将高两位左移8位
        value += ADRESL;//低八位加入ADRESL的值。
        return value;
    }
    unsigned int ADC_BAT_contiue(void)
    {
        unsigned int ADV_MCU[ADC_NUM],ADV_CNT,ADV_ALL;
        ADV_ALL=0;
        for(ADV_CNT=0;ADV_CNT<ADC_NUM;ADV_CNT++)//进行多次AD转换
        {
         ADV_MCU[ADV_CNT]=ADC_BAT_ONE();
        }
         for(ADV_CNT=0;ADV_CNT<ADC_NUM;ADV_CNT++)//计算多次AD转换的平均值
        {
            ADV_ALL += ADV_MCU[ADV_CNT];
        }
        ADV_ALL= ADV_ALL/ADC_NUM;
        return ADV_ALL;//得到结果返回
    }
    /*
     *
     */
    int main(int argc, char** argv) {
         init_fosc();//设置时钟
         init_GPIO();//设置I/O口
         init_AD();//设置AD
         while(1)
         {
             if( ADC_BAT_contiue()>400)//判断输入电压是否大于1.2V
             {
                 LED=1;//灯亮
             }
             else
             {
                 LED=0;//灯灭
             }


         }
    }



    展开全文
  • 单片机ad采样转换

    2013-02-01 15:52:50
     一个设计,要求显示电池电量,电源是充电电池,工作电压在4.4~5.4V中间,想做出和手机那样的效果,有4格的电量显示,用AD实现,AD转换的参考电压是随着电源电压的变化而变化的(Vref=VDD),如何检测成本最低?...
    :
         一个设计,要求显示电池电量,电源是充电电池,工作电压在4.4~5.4V中间,想做出和手机那样的效果,有4格的电量显示,用AD实现,AD转换的参考电压是随着电源电压的变化而变化的(Vref=VDD),如何检测成本最低?


    :
         用反算法,AD参考基准设为电源VDD,测二极管正向压降,倒算出电源电压,最低成本。

         VDD/VF=1024/AD
         VDD=1024*VF/AD
         上式中
         VF =二极管正向压降基本不变视作常数
         VDD=电源电压
         AD----AD采样值

         一般测电源电压的方法是用PIC的一个引脚作参考电压输入,外接TL431之类的基准源,用另一个引脚测分压后的电源电压,这当然是最容易实现的方法。
         这里说的是只用一个AD引脚来实现测单片机电源VDD的方法:
         PIC单片机的AD可以设成以Vdd为参考电压,这样在Vdd是稳定的情况下,AD采样值*Vdd/1024即为被测电压。即:
         Vi=AD*Vdd/1024
         但电池供电的系统电源Vdd是不稳的,正是我们的测量对象,那么我们是不是可以让Vi不变,作为参考电压,倒算出电源Vdd呢?事实上是可行的。我们用一个引脚测一个固定的电压Vi这样可以推算出:
         Vdd=Vi*1024/AD
    我们可以找到各种固定电压的器件,稳压管、基准电源等。在只要显示4格电源变化的情况下用一个二极管也是可以保证精度的。列如采用的二极管的正向压降为0.7V,上式就可以写成:
         Vdd=717/AD
         这就实现在用一个引脚测电源的方法。
         上述方法只对直接用电池供电的PIC单片机有效,对经稳压后供单片机的不可以用上述方法。对其它单片机没试过。

    展开全文
  • 实用AD采集单片机综合实验原理图。protel
  • 51单片机AD转换的程序

    2017-12-26 13:39:29
    void Read_init ... unsigned char AD_FIN=0; //存储A/D转换标志   CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位)   ADC_CONTR = 0x40; //ADC转换的速度(0XX0 0000 
1 2 3 4 5 ... 20
收藏数 9,025
精华内容 3,610
关键字:

单片机ad是什么意思