单片机测试电压_控制单片机电压线性输出大电压 - CSDN
  • 利用51单片机测试AD转换测电压
  • 2.确认采样的参考电压是否正确,是内部参电压VCC、1.2V或者是外部的Vref. 3.以上两步都确认没有问题后,核查代码的初始化有无问题。 4.以上都确认无误的话,观察AD的IO口的对外电阻值,是否在芯片推荐使用的对外电阻...

    当遇到MCU采集到的AD值相差特别大的时候,应该怎么分析。
    1.首先再次确认采样点的实际电压。
    2.确认采样的参考电压是否正确,是内部参电压VCC、1.2V或者是外部的Vref.
    3.以上两步都确认没有问题后,核查代码的初始化有无问题。
    4.以上都确认无误的话,观察AD的IO口的对外电阻值,是否在芯片推荐使用的对外电阻值得范围之内。如果超出芯片推荐的范围值得话就要小心了,有可能是因为外部阻抗过大所导致的AD采样不准。
    如果是这种情况的话,可以先将AD的采样保持时间设置的尽量长,将AD的的分频调至最大,以保证采样时间的充足。如果依旧无法解决的话,建议将对外阻抗调整到芯片推荐范围之内。

    案例:
    我遇到过的一个现象就是如此:
    AD采样的电压跟实际值相差太大,软件和采样时间都检查过了没有问题,最后去看AD口的阻抗,我们使用220M :22M的分压比来采样的(因为产品的低功耗需求,必须在每一个节点来把控功耗的限制,因为AD采样其实是蛮增加功耗的,所以就尽量放大阻抗限流,以此来控制功耗。)。查看芯片数据手册,推荐使用的是1M以内的推荐对外阻抗,所以将阻抗调整到推荐范围就顺利解决了该问题。

    说到这里不得不提及一个问题,为什么外部阻抗过大会导致AD采样失准呢?
    因为芯片内部的AD采样的原理是靠一个RC电路来实现的,采样保持时间其实就是等C充电完成来测量C的电压就是实际测得的电压值,由于外部阻抗过大的时候,限流严重导致AD口灌入的电流减小很多,导致RC即使在最大的采样保持时间也没法将C充电至外部实际电压值,所以导致AD采样失准,这是阻抗过大之后AD采样失准的核心原因。

    展开全文
  • 本文目的:记录前段时间做的一个项目Debug经历,项目大致内容是给8051内核的单片机进行测试和烧录**。 **OS测试:**在MCU测试功能中,第一个需要测试的内容就是OS测试,其原理就是,通过在芯片的 GND pad 和 IO 引脚...

    本文目的:记录前段时间做的一个项目Debug经历,项目大致内容是给8051内核的单片机进行测试和烧录**。
    **OS测试:**在MCU测试功能中,第一个需要测试的内容就是OS测试,其原理就是,通过在芯片的 GND pad 和 IO 引脚之间加上一个正向电压(弱驱动能力),此时在 GND 于 IO PAD之间会观测到 0.5~0.6V 的电压,即表征 OS 正常。
    OS测试框图
    问题如何产生的:
    1.在CP阶段,我们对芯片进行OS测试时,都是只会连接芯片的两根引脚,即GND与IO_PAD,这样测试的结果就是GND与IO_PAD的压降,必然是准确的;
    2.本次项目特殊,使用STM32控制相应模块,对MCU进行测试,达到取代CP测试的目的;
    3.电路图在设计时,芯片的VPP以及VDD两根电源引脚与系统板是直接相连的,为了达到滤波去耦的效果,每根电源线都并联了10uF、100nF的电容。
    问题根本
    第3点就是本次问题产生的原因,它导致了OS测试时,芯片除了IO_PAD与GND和系统板相连外,还有VPP、VDD与系统板相连。从而在测量电压时,弱驱动的正向电源需要给电容充电,短时间内测量到的电压值不准确。(此结果是一步步debug后,才发现有这么一回事)
    处理过程
    1.初次上电异常处理
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2.OS问题异常分析
    1
    1
    2
    2
    3
    3
    4
    4

    展开全文
  • 51单片机C语言电流电压测量代码

    热门讨论 2020-07-21 10:31:48
    51单片机电流电压测量器,C语言源的代码.编译后直接下载到单片机量可以了.测量接口看代码里设定.
  • 51单片机电压原理图

    热门讨论 2020-07-29 14:21:17
    利用51单片机及外围电路实现多路电压测试并与PC的串口通讯上传测试结果
  • 51单片机:利用TLC549测量电压,并将测量值显示在LCD上 之前有段时间做单片机课设,同学在做电压比较器,找我帮忙写个要求,利用TLC549测量电压,并将测量值显示在LCD上,想到之前自己写过TLC549测量电压,并将测量...

    51单片机:利用TLC549测量电压,并将测量值显示在LCD上

    之前有段时间做单片机课设,同学在做电压比较器,找我帮忙写个要求,利用TLC549测量电压,并将测量值显示在LCD上,想到之前自己写过TLC549测量电压,并将测量值显示在数码管上,还没用过LCD,便试着写了一下(LCD我学的不好)。

    代码实现:

    #include<reg52.h>
    #include<intrins.h>
    
    #define uchar unsigned char 
    #define uint unsigned int 
    
    void delay(uchar ms);    //延时函数
    void wr_com(unsigned char com);    //写入指令数据到LCD
    void wr_dat(unsigned char dat);    //写入字符显示数据到LCD
    void xianshi(uchar dizhi, uchar suzi);   //单独写数到液晶函数 ( 地址  数据 )
    uchar TLC549_ADC(void);   //TLC549模数转换
    void uart_init();         //串口初始化函数
    
    sbit rs = P2^0;
    sbit rw = P2^1;
    sbit e = P2^2;
    
    sbit DI  = P1^0;
    sbit CS  = P1^1;
    sbit CLK = P1^2;
    
    uchar ad_0;
    uint AD;
    
    
    //-------------------------------------
    //	            主函数 
    //-------------------------------------
    void main()
    {
    	uart_init();
    	wr_com(0x01);    //显示清屏
    	wr_com(0x38);   //显示模式设置
        wr_com(0x0c);     //光标设置
    	while(1)
    	 {
    	  delay(100);
    	  ad_0=TLC549_ADC();
    	  AD=ad_0*1.97;
    	  xianshi(0x80+2,'v');
    	  xianshi(0x80+3,'=');
    	  xianshi(0x80+5,0x30+AD%1000/100);
    	  xianshi(0x80+6,'.');
    	  xianshi(0x80+7,0x30+AD%100/10);
    	  xianshi(0x80+8,0x30+AD%10);
    	  xianshi(0x80+9,'V');
    	}
    }
    
    //----------------------------------
    //               延时子程序
    //----------------------------------
    void delay(uchar ms)    
    {       
    	 uchar i ;
    	 while(ms--)
    	 {
    	  	for(i = 0 ; i<250;i++) ;
    	 }
    }
    
     //-------------------------------------
     //         写入指令数据到LCD
     //-------------------------------------
    void wr_com(unsigned char com)   
    {       
          
     	rs = 0 ;
      	rw = 0 ;
      	e = 0 ;
      	P0 = com ;
    	delay(1);
      	e = 1 ;
    	delay(1);
      	e = 0 ; 
    }		
    	   
    //-------------------------------------------------
    //             写入字符显示数据到LCD
    //--------------------------------------------------
    void wr_dat(unsigned char dat)
    {      
          
     	rs = 1 ;
      	rw = 0 ;
      	e = 0 ;
      	P0 = dat ;
        delay(1);
      	e = 1 ;
    	delay(1);
      	e = 0 ; 
    }
    
    //------------------------------------------------------
    //     单独写数到液晶函数 ( 地址  数据 )
    //------------------------------------------------------
    void xianshi(uchar dizhi, uchar suzi)
    { 
         wr_com(dizhi);
    	 wr_dat(suzi);
    }
    
    //-----------------------------------------
    //            TLC549模数转换
    //-----------------------------------------
    uchar TLC549_ADC(void)
    {
    	   uchar n, tmp;
    
            CS  = 1;                     //CS置高,片选无效
            CLK = 0;
    
            CS  = 0;                     //CS置低,片选有效,同时DO输出高位
            _nop_();
            _nop_();                     //适当延迟时间1.4us Setup Time
    
            for(n = 0; n < 8; n++) //串行数据移位输入
            { 
                    tmp <<= 1;
                    tmp |=  DI;
    
                    CLK = 1;        //0.4us
                    _nop_();        //延迟0.1us
                    CLK = 0;        //0.4us
            }
            CS = 1;            //CS置高,片选无效
            for(n = 17; n != 0; n--) _nop_();  //下一次转换需要延迟17us
            return (tmp);
    
    }
    //------------------------------------------
    //      	串口初始化函数 
    //------------------------------------------
    void uart_init()
    {
    	TMOD=0x20;		//9600bps
    	SCON=0x50;
    	TH1=0xFD;
    	TL1=0xFD;
    	TR1=1;
    	EA=1;
    }
    

    仿真结果:

    (结果有点误差,大概为0.02v)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 单片机 数字电压表(ADC0809)

    万次阅读 多人点赞 2020-04-04 15:59:49
    单片机 数字电压表(ADC0809) 一、简述 采用模数转换的芯片ADC0809实现设计数字电压表。例子中设计的数字电压表可以测量0~5V范围内的输入电压值,并且通过4位LED数码管显示采集的电压值,例子测量三个模拟值:4....

    单片机 数字电压表(ADC0809)

    一、简述

        采用模数转换的芯片ADC0809实现设计数字电压表。例子中设计的数字电压表可以测量0~5V范围内的输入电压值,并且通过4位LED数码管显示采集的电压值,例子测量三个模拟值:4.995、2.5、0.005。

        ADC0809是可以将我们要测量的模拟电压信号量转换为数字量从而可以进行存储或显示的一种转换器件。

       文件打包:链接: https://pan.baidu.com/s/1F2E135Jw7TG3EmUVx3xKGg 提取码: 5ttz

    二、效果

    三、工程文件

    1、Keil工程

    2、仿真电路图

    四、源文件

    #include<reg51.h>
    #define uint unsigned int
    #define uchar unsigned char
    uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0-9的电平码
    uint volt,vtime; //电压值测定值 
    uchar addr;//测量地址位
    sbit LW1=P2^3; //对应第4个数码管
    sbit LW2=P2^2; //对应第3个数码管
    sbit LW3=P2^1; //对应第2个数码管
    sbit LW4=P2^0; //对应第1个数码管
    sbit LW5=P1^4;//指示当前显示的是第几个转换值
    sbit CLK=P2^4; //时钟信号
    sbit START=P2^5; //转换启动开关
    sbit EOC=P2^6;	//转换结束标志
    sbit OE=P2^7;//定义ADC0809各脚
    /**********************************************************/
    //函数名:delay(uint x)
    //功能:延时程序 改变测量地址 	
    //调用函数:
    //输入参数:x
    //输出参数:
    //说明:程序的延时时间为x乘以0.5ms 每5s改变测量地址位
    /**********************************************************/
    void delay(uint x)
    {
    	uchar y,z;
    	for(y=x;y>0;y--)
    		for(z=250;z>0;z--);//该步运行时间约为0.5ms
    		vtime++;
    		if(vtime==1000)
    		{
    			vtime=0;
    			addr++;
    			if(addr==3)	 //本例子一共有3个测量输入值,轮流读取这3个值并转换显示
    				addr=0;//以上语句实现测量地址位的改变		
    		}	
    }
    /**********************************************************/
    //函数名:ADC()
    //功能:数模转换程序
    //调用函数:
    //输入参数:
    //输出参数:
    //说明:将转换好的测定值保存在变量volt中
    /**********************************************************/
    void ADC()
    {
    	EA=1;//开中断
    
    	//确保进入正常AD转换状态?
    	START=0;
    	START=1;
    
    	START=0;//ad开始转换		
    	while(EOC==0); //等待转换结束
    	OE=1; //输出数据标志为真
    	
    	EA=0;//关中断
    	volt=P3;//获取转换值保存到volt中,(P3为转换后数据)
    	volt=volt*196;//转换值处理 (例子的满量程为5V,转换分辩率为8位即最大值是255,5/255=196mV,即1代表196mV)
    	
    	OE=0;//输出转换结束 (要在获取转换值之后)
    }
    /**********************************************************/
    //函数名:display()
    //功能:4位数码管显示
    //调用函数:delay(uint x)
    //输入参数:
    //输出参数:
    //说明:将处理后的电压值显示在4位数码管上
    /**********************************************************/
    void display()
    {
    	P0=0xff;//消隐 (相当于全部灭灯,清除上次显示效果)
    	LW1=0;
    	P0=~led[volt/10000]&0x7f;//带小数点1伏显示位
    	delay(2);
    	P0=0xff;
    	LW1=1;
    	LW2=0;
    	P0=~led[(volt/1000)%10];//100毫伏显示位
    	delay(2);
    	P0=0xff;
    	LW2=1; 
    	LW3=0;
    	P0=~led[(volt/100)%10];//10毫伏显示位
    	delay(2);
    	P0=0xff;
    	LW3=1;
    	LW4=0;
    	P0=~led[(volt/10)%10];//1毫伏显示位
    	delay(2);
    	P0=0xff;
    	LW4=1;
    	LW5=0;
    	P0=~led[addr+1];//显示电压测量位
    	delay(2);
    	LW5=1;//指示当前显示的是第几个转换值								
    }
    /**********************************************************/
    //主程序
    /**********************************************************/ 
    void main()
    {
    	EA=1;//开总中断		   
        TMOD=0x01;//设定定时计数工作方式
    	//为定时器初赋值
    	TH0=0XFF;
        TL0=0XB4;
    
    	ET0=1;//开定时器0中断 
    	TR0=1;//开启定时器0
    	while(1)
    	{
    		P1=addr;//装入测量地址
    		LW5=1;
    		ADC();//调用模数转换程序
    		display();//调用显示程序
    	}
    }
    /**********************************************************/
    //函数名:timer() interrupt 1
    //功能:定时中断0响应程序
    //调用函数:
    //输入参数:
    //输出参数:
    //说明:为ADC提供时钟信号
    /**********************************************************/
    void timer() interrupt 1
    {
    	//初值重置
    	TH0=0XFF;
        TL0=0XF0;
    	CLK=~CLK;//取反 产生时钟信号
    }
    

    五、总结

        ADC0809是一种有8路模拟输入、8位并行数字输出的逐次逼近式A/D器件。

    1、主要技术指标和特性
        (1) 分辨率:8位;
        (2) 转换时间:取决于芯片的时钟频率,转换1次所需时间;
        (3) 单一电源:+5V;

        (4) 模拟输入电压范围:单级性为0~+5V。

    2、引脚介绍

    管脚功能说明:
    IN0-IN7:模拟量输入通道。就是说它可以分时地分别对八个模拟量进行测量转换。
    ADDA-C:地址线。也就是通过这三根地址线的不同编码来选择对哪个模拟量进行测量转换。
    ALE:地址锁存允许信号。在低电平时向ADDA-C写地址,当ALE跳至高电平后ADDA-C上的数据被锁存
    START:启动转换信号。当它为上升沿后,将内部寄存器清0。当它为下降沿后,开始A/D转换。
    D0-D7:数据输出口。转换后的数字数据量就是从这输出给S52的。
    OE:输出允许信号,是对D0-D7的输出控制端,OE=0,输出端呈高阻态,OE=1,输出转换得到的数据。
    CLOCK:时种信号。ADC0809内部没有时钟电路,需由外部提供时钟脉冲信号。
    EOC:转换结束状态信号。EOC=0,正在进行转换。EOC=1,转换结束,可以进行下一步输出操作

    Vref(+)、Vref(-):参考电压。参考电压用来与输入的模拟量进行比较,作为测量的基准。一般Vref(+)=5v ,Vref(-)=0V。

    3、时序图与工作过程

        时序图:

    工作过程:

     ①在IN0-IN7上可分别接上要测量转换的8路模拟量信号。可只接一路。
     ②将ADDA-ADDC端给上代表选择测量通道的代码。如000(B)则代表通道0;001(B)代表通道1;111则代表通道7。
     ③将ALE由低电平置为高电平,从而将ADDA-ADDC送进的通道代码锁存,经译码后被选中的通道的模拟量送给内部转换单元。
     ④给START一个正脉冲。当上升沿时,所有内部寄存器清零。下降沿时,开始进行A/D转换;在转换期间,START保持低电平。
     ⑤EOC为转换结束信号。在上述的A/D转换期间,可以对EOC进行不断测量,当EOC为高电平时,表明转换工作结束。否则,表明正在进行A/D转换。
     ⑥当A/D转换结束后,将OE设置为1,这时D0-D7的数据便可以读取了。OE=0,D0-D7输出端为高阻态,OE=1,D0-D7端输出转换的数据。
        说明:ADC0809的转换工作是在时钟脉冲的条件下完成的,因此首先要在CLOCK端给它一个时钟信号,说明书上给出了可以接入的脉冲信号频率是在10KHz-1280KHz,典型值是640KHz。我们这里取值50KHz。
      时序图上的teoc时长为:从START上升沿开始后的8个时钟同期再加2微秒。这一点得注意,因为当START脉冲刚结束进入转换工作时,EOC还没有立即变为低电平而是过了8个时钟周期后才进入低电平的,所以再给出START脉冲后最好延时一会再进行EOC的检测。

      一个通道的转换时间一般为64个时钟周期,如时钟频率为640KHz时,时钟周期为1.5625微秒,一个通道的转换时间则为1.5625×64=100微秒,那么1秒种就可以转换1000000÷100=10000次。

    4、计算定时器初值:

        信号频率取值50KHz,晶振频率是12MHz。

        12MHz时钟频率下,12MHz = 12000KHz = 12000000Hz,一个时钟振荡周期就是1/12000000秒,亦即1/12微秒,标准MCS51系列单片机的一个机器周期是12个时钟振荡周期,也就是12 * (1/12) = 1微秒。

    要输出50KHz的矩形方波 周期 T = (1/50K)s 等宽 也就是占空比50% 高电平时间是(0.5/50K)s = 0.01 ms = 10us

     

    然而,实际上仿真时这个频率是太快了(不知道是否是计算方法错了),编程中没有使用该初值。

    六、Proteus相关操作

          1、电压探针元件(显示电压)

               

       2、自定义电源电压

            

    -------------------------------------------------以下是回复 Rainynightsunset 这位兄弟---------------------------

    下载打包文件之后:

    ========================以下回复  木子Jasmine 这位兄弟======================

    手动复位效果 (使用轮询方式检测按键有没有按下,因为外部中断引脚被使用了)

    测试代码以及仿真文件:链接: https://pan.baidu.com/s/1zC8uhzlbIFRBOkOWuWzAWQ 提取码: wr39

     

     

    ===================以下回复 Leon. 这位兄弟=======================

    将程序中的addr最值修改为8,如下:

    在仿真上,添加5个模拟输入

    效果:(注:想要查看电压,请加上电压探针元件)

     

     

    ============== ===== 以下回复    馨心愢忞   ========================

    简单的测量20v(采用分压法:先把电压除以4再进行转换,得到转换的值后再乘以4)

    测试例子:链接: https://pan.baidu.com/s/10RzT9lFVbB8db4CO7at_0A 提取码: zwem

    测试效果:

    分压测量20V说明:

     

    =======================以下回复 yikai0511validatetoken==============================

    以下例子是:按键设置最高电压,当前电压大于等于最高电压时蜂鸣器报警以及LED亮,测试环境为Win10

    电压为20V的可以自己设置的,上下限值同时设置暂时没弄好(感觉引脚不够用,需要复用引脚)

    例子打包:链接: https://pan.baidu.com/s/1RY18AeWCCsXXqlgUBeTv_w 提取码: pdf7

    仿真截图:

     

    效果:

     

    展开全文
  • 单片机制作电压

    2020-07-21 09:59:17
    电压表是电子测量不可缺少的一种工具,这是 一款用单片机制作的电压表,测量精确,达到小数 后两位
  • 基于51单片机的数字电流电压

    千次阅读 2019-05-11 00:09:46
    本文介绍了基于STC89C52单片机为核心,分别以ACS712-05芯片和串联分压电路为为电流检测和电压检测电路,并通过AD0809数模转换芯片对电压信号进行采集和转换,传输给单片机进行处理,最后将处理后的电压值和电流值...
  • 单片机用AD测量电池电压的值

    万次阅读 2017-07-27 15:28:13
    单片机的引脚最大输入电压一般为3.3V或者5.0V,电流是25ma,40ma 而电池一般有3.3V-36V不等,电流也是好几A,超过5.0的电池一接到单片机 AD口,可能和三星手机一样。所有我们需要从电压电流2方面来入手考虑。 1...
  • 应广单片机有很实用的功能,就是可以用内部的分压电阻,内部1.2v参考电压,和比较器一起,测试单片机VDD电压.厉害吧,不使用任何外部器件,测试供电的电源电压.!当电池低压的时候可以做相应的动作.比如休眠,进入低功耗等....
  • 使用51单片机测试电压,用的是12位AD转换器tlc2543采集电压,使用1602液晶屏显示
  • 1.6.5 PIC单片机的外接电压检测复位电路举例  1.设计思路  有许多型号单片机的内部均不具备掉电复位功能,即使对于内部包含该功能的PIC单片机,其复位门槛电压值是固定不可更改的,有时不能满足用户的需求,...
  • 课程设计,该资料的实物已经通过测试,能实现功能,完整的论文报告、电路图、PCB图,可供参考。
  • 利用单片机和adc0804模板可以进行电池电压测量达到估算电池电量的效果
  • 大体思路是:用运放加法器将电压整体抬高,也就是负电压抬到正电压,原本正电压抬到更高就行了,如果电压过大,还可以调整比例,只不过会使精度下降。 话不多说附上原理图: 这里为了方便我们设置R1=R2=RF=1K,要想...
  • 这些文档和代码是针对4路AD设计的,有详细的电路原理图和51源代码解析。
  • 本系统采用STC系统列单片机,相比其他系列单片机具有很多优点。一般STC单片机资源比其他单片机要多,而且执行速度快;STC系列单片机使用串口对单片机进行烧写,下载程序较为方便;STC51单片机内部集成了看门狗电路;...
  • 本文提出了一个噪音测试仪的设计方案,此测试仪能将外界噪声经过传声器转换成电信号。由运放LM324构成三级放大电路,峰值检波网络输出直流电平反应了噪声声压的大小。由LM331构成电压/频率转换电路,输出的频率信号...
  • 单片机ADC分压电阻测量直流电压

    千次阅读 2020-01-13 22:54:42
    两种方案: 直接分压,简单低成本,如果ADC内阻太小就有误差大 分压后接跟随器,电路变多,跟随器额外要耗电。 分压部分电阻值的选择: ...电压跟随器 https://blog.csdn.net/qq_33114231/article/details/7...
1 2 3 4 5 ... 20
收藏数 5,040
精华内容 2,016
关键字:

单片机测试电压