历史上的今天
返回首页

历史上的今天

今天是:2025年04月19日(星期六)

2020年04月19日 | C51:数模模数转换

2020-04-19 来源:eefocus

前言

三种ADC的原理就默认都懂了~


数模模数转换:DAC

DA硬件上讲比较容易,就是通过运算放大器把二进制数(一系列的稳定的高低电平)转换成不稳定的、连续变换的波。


比如下面这个图,可以得到image.png?imageView2/2/w/550的通式就是image.png?imageView2/2/w/550


在这里插入图片描述

公式怎么来的?

图中的MOS都是绝缘栅型、N沟道、增强型管,在image.png?imageView2/2/w/550时有可以导通。所以在每个管子的image.png?imageView2/2/w/550处,如果给1,即高电平,那么该管子导通,看做漏级与栅极之间短路。


上面这个公式就表明了简单的DA转换原理。

image.png?imageView2/2/w/550

不是一个位对应一个电压值,而是一个二进制数对应一个电压值。


另外,上面式子中前面的系数image.png?imageView2/2/w/550是其比例系数、单位电压,也是最小输出电压的增量。


数模转换器结构

在这里插入图片描述

一个二进制对应一个电压值,可是电压连续变换。那么从一个二进制跳到另一个二进制之间不就必然出现其他二进制吗???


我估计,(没错,又是估计)

数字转模拟的数字量间不能间隔别的,因为模拟信号是一直连着的,所以需要转换的数字量也需要是一串在模拟上对应连续的二进制。


转换精度和分辨率关系不大,分辨率大的精度不一定大。即分辨率小数点后位数再多,精度也可能不会有提高。


分辨率与测量的刻度有关,而精度是值接近真实值的程度。


例1:一把1米的软尺,有1000个刻度,分辩率1毫米(分辩率0.1%),用标准尺量下绝对误差5毫米,精度0.5%。如果能把尺拉长20毫米,此时绝对误差25毫米,精度降为2.5%, 可是尺还是1000个刻度,其分辨率还是1毫米(0.1%).


例2:两杆称来称真重1克的物体, 一杆的结果为1.03克, 另一杆的结果为0.8333333333333333333333333克,

哪个准呢?


转换精度与转换误差有关。误差越大,精度越小。精度值越小,精度越高。


分辨率:image.png?imageView2/2/w/550n


转换误差:满刻度FSR(Full Scale Range)的百分比,或者m倍的最低有效位LSB(Least Significant Bit)—— m表示输入是0…01时,输出电压与绝对误差的比值。


DA-PWM呼吸灯

PWM(Pulse width modulation,脉冲宽度调制) 就是更改数字信号高电平的占空比。

image.png?imageView2/2/w/550

在这里插入图片描述

呼吸灯的意思是灯的亮度逐渐变化,像在呼吸一样。这通过PWM实现,在一个周期里,使高电平(如果高电平让灯亮的话)占空比越来越小,那么灯就会越来越暗。


连续原理图如下,左边的电路就是DAC(Digtal to Analog Convertor)由PWM得到的仍然是数字信号需要经过外围DAC电路得到模拟信号。


(PWM实质可能是给电容充电的时间长度的改变)

在这里插入图片描述

#include "reg52.h"


//DAC input port

sbit PWM=P2^1;

bit DIR;



unsigned int count,value,timer1;


void Timer1Init()

{

TMOD|=0X10;//T1 mode1


TH1 = 0xFF; 

TL1 = 0xff;  

ET1=1;//open T1 interrupt

EA=1;//open whole interrupt

TR1=1;//start T1

}


void main(){

Timer1Init();  

DIR=1;

value=0;

count=0;

while(1) {

if(count>100){ 

//保持亮多久,亮几次才能达到视觉暂留效果 

//Led显示中常常需要这样的变量,像多加一个循环一样延长暂留的时间好被看清楚


count=0;

if(DIR==1){//bright more

  if(++value>=1000)

  DIR=0;

}

else{//bright less

  if(--value<=0)

  DIR=1;

}


}


if(timer1>1000)/// 

timer1=0;

if(timer1 PWM=1;

else

PWM=0;

}

}


void time1_interrupt() interrupt 3 {  ///T1 interrupt

TH1 = 0xFF; 

TL1 = 0xff;   //1us

timer1++; 

    count++;

}


显示效果:

在这里插入图片描述

数模模数转换:ADC

数模模数转换的操作也是操作器件,不是纯在软件上的。我的单片机上只有一个XPT2046,所以使用时我只写这个芯片的使用(话说我不是一直这样吗)。

三种ADC电路:逐次逼近型、双积分型、并联比较型。

三种ADC原理都很简单,如果仔细推敲的话!三个的速度是逐次递增的——毫米级、微秒级、纳秒级。


XPT2046的简单介绍

XPT2046原理图如下。单片机上有AIN0、AIN1、AIN2、AIN3这4个通道,分别是接电位器、温敏电阻、光敏电阻、无。外部模拟信号可以由这四个输入被转换成数字信号。

在这里插入图片描述

XPT2046引脚图如下。需要用到的就是框里4个口。

在这里插入图片描述

XPT2046控制字使用

一个命令8位,需要逐个从DIN端口输入。

在这里插入图片描述

MODE一般都选单端输入。毕竟只需要测一个量。

因为AIN0接电位器,而AIN0对应XP(X+)。那么image.png?imageView2/2/w/550为001、011都行。

在这里插入图片描述


那么数据该从哪头开始呢?

从左到右,首先CS端给个零。

然后DIN输入端开始传一位。

DCLK给个上升沿后,DIN开始传下一位。

…dots…

控制字8位传完后,等一个周期。消除BUSY这段时间。

然后从DOUT读一位数据。

每次DCLK给下降沿后,就读取一位。

…dots…

接收12位后CS端置位。

在这里插入图片描述

读取电位器电压

#include"reg52.h"

#include"intrins.h"


sbit DIN=P3^4;//输入

sbit CS=P3^5;//片选 

sbit CLK=P3^6;//avoid the conflict 外部时钟

sbit DOUT=P3^7; //输出


sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

unsigned char leds[4];

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};



unsigned int XPT_2046_Read(unsigned char _cmd);

unsigned int SPI_Read();

void SPI_Send(unsigned char _cmd);


void delay(unsigned int i);

void show();



void main(){

while(1)show();

}


void delay(unsigned int i){

while(i--);

}

void show(){

unsigned int temp,j;

static  int i=0;

if(++i>=50){

i=0;

temp=XPT_2046_Read(0x94);// or 0xB4

}



leds[0] = table[ temp%10 ];

leds[1]= table[ temp/10%10  ];

leds[2] = table[ temp/100%10 ];

leds[3] = table[ temp/1000 ];

for(j=0;j<4;j++){

switch(j){

case 0:

LSC=0,LSB=0,LSA=0;

break;

case 1:

LSC=0,LSB=0,LSA=1;

break;

case 2:

LSC=0,LSB=1,LSA=0;

break;

case 3:

LSC=0,LSB=1,LSA=1;

break;

}


P0=leds[j];

delay(100);

P0=0;

}


}


unsigned int XPT_2046_Read(unsigned char _cmd){


unsigned char i;

unsigned int var_AD;

CLK=0;

CS=0;

SPI_Send(_cmd);

for(i=6;i>0;i--);


CLK=1;//清除busy

_nop_();

_nop_();

CLK=0;

_nop_();

_nop_();


var_AD=SPI_Read();

CS=1;

return var_AD;


}

unsigned int SPI_Read(){


unsigned int value=0,i;

CLK=0;

for(i=0;i<12;i++){ //接收12位的数据

value<<=1;

CLK=1;

CLK=0;

value|=DOUT;

}

return value;


}

void SPI_Send(unsigned char _cmd){


unsigned char i;

CLK=0;

for(i=0;i<8;i++){

DIN=_cmd>>7;

_cmd<<=1;

CLK=0;//上升沿发送

CLK=1;

}


}


显示结果:

在这里插入图片描述

很简单的代码,折磨了我两三个小时。以前也有这样的错误,不过没注意,这次可难受死我了——在定义变量时,比如i,就不要定义成int型。要定义成unsigned char型。

推荐阅读

史海拾趣

AnalogicTech公司的发展小趣事

AnalogicTech公司成立于1997年,总部位于美国硅谷。在创立初期,公司面临资金短缺、市场竞争激烈等诸多挑战。然而,凭借创始团队对半导体技术的深刻理解和前瞻视野,AnalogicTech成功开发出一系列具有创新性的产品,逐渐在市场中站稳脚跟。

BTCPower公司的发展小趣事

随着全球环保意识的提高,绿色发展成为电子行业的重要趋势。BTCPower积极响应这一趋势,将绿色发展理念融入公司的产品和服务中。公司致力于研发更环保、更节能的产品,同时还推动供应链中的合作伙伴共同实现绿色生产。这些努力使得BTCPower在行业中树立了良好的环保形象。

Anachip公司的发展小趣事

随着电子行业的竞争日益激烈,Anachip公司意识到单凭自己的力量难以应对市场的快速变化。于是,公司开始积极寻求与其他企业的合作。通过与多家知名电子企业建立战略合作关系,Anachip成功将自己的芯片技术应用于更多领域,进一步扩大了市场份额。同时,这种合作模式也促进了整个电子行业的共同发展。

Exar公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,Exar公司始终坚持以创新为核心竞争力。公司不断投入研发资金,加强技术创新和产品研发力度,推出了一系列具有自主知识产权的新产品。同时,Exar还积极关注行业发展趋势和市场动态,不断调整和优化产品线,以适应市场的变化和发展。在未来,Exar将继续坚持创新驱动的发展战略,努力成为电子行业的领军企业。

请注意,以上故事框架仅供参考,具体的故事内容需要根据实际情况进行补充和完善。

Brand-Rex公司的发展小趣事

随着全球市场的不断扩大,Brand-Rex也将目光投向了潜力巨大的中国市场。作为首批进入中国市场的国际一线品牌之一,Brand-Rex凭借其卓越的技术和产品质量迅速赢得了中国客户的青睐。然而,由于公司重组和调整,Brand-Rex在2005年之后暂停了在中国大陆地区的销售。幸运的是,2009年8月,Brand-Rex与上海速越电子工程有限公司合作重返中国市场,进一步推动了其在华业务的发展。

Enovation Controls LLC公司的发展小趣事

随着全球市场的不断扩大,Brand-Rex也将目光投向了潜力巨大的中国市场。作为首批进入中国市场的国际一线品牌之一,Brand-Rex凭借其卓越的技术和产品质量迅速赢得了中国客户的青睐。然而,由于公司重组和调整,Brand-Rex在2005年之后暂停了在中国大陆地区的销售。幸运的是,2009年8月,Brand-Rex与上海速越电子工程有限公司合作重返中国市场,进一步推动了其在华业务的发展。

问答坊 | AI 解惑

基于VHDL的I2C总线从模式控制核设计 论文

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 好的论文,里面写得还不错!大家看看  …

查看全部问答>

3G无线上卡怎么进行应用开发?

我想对3G无线上网卡(如Huawei EC1260)进行应用开发,具体的想法是,把上网卡接到电脑上,通过开发的程序进行短信收发,拨打电话,连接上网,断开网络等。无线上网卡原来已经有驱动程序,但要进行自己的应用开发,不知道要怎么使用?在哪里可以获得 ...…

查看全部问答>

请问wince中怎么实现mid播放?

请问wince中怎么实现mid播放??那里有软解码器??…

查看全部问答>

keil自带的s3c2440.s

我在keil uv4下生成了一个工程,用了自带的s3c2440.h 我写的main函数如下: #include \"s3c2440.h\" #define LED1        1…

查看全部问答>

帮忙看看!

     最近学习汇编时,对cpu的地址线,数据线和cpu位宽及内存的地址怎样分配及它于地址线的关系很模糊,哪位大侠能帮小弟讲解一下?…

查看全部问答>

智能手持PDA

我现在要一款pda 要求win ce 系统 ,支持wifi功能,请大家介绍几家国内的厂家…

查看全部问答>

怎么去判断MMA7455L是否焊好?

第一次焊LGA封装的芯片心里有点紧张,焊上去后又看不见各个引脚是否连通。要是不连通的话,那么写程序就麻烦了,所以我就打算先确定它是否连通。 昨天晚上在基地奋战到三点多,就是为了测量MMA7455L是否焊好。我的方法是用数字示波器测量mma7455l ...…

查看全部问答>

LED路灯应用中存在的三大问题

1、价格偏高   目前LED路灯的成本还远高于高压钠灯,一款LED路灯价格在3000~5000元,甚至更高,而一套进口品牌的高压钠灯(含灯具、成套电器光源)价格不超过1500元。就现状而言,LED路灯明显太贵,价格是高压钠灯的2~5倍。因此即使LED路灯的耗 ...…

查看全部问答>

新手问个弱智的问题

/*****************************************文件名:seg.v描述:程序运行的结果:第0至第七个数码管依次显示0-7;创建人:何运涛创建时间:2012年1月17日******************************************/module seg(clk,wela,dula);input clk;//输入 ...…

查看全部问答>

学习Hercules TMS570LS硬件设计入门

一、硬件系统 原理图以TMS570LS31x Hercules USB Stick Development Kit 参考 PCB 以TMS570LS31x_USB_STICK_Gerber参考…

查看全部问答>