发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[资料干货]

【每周分享】浅谈DAC和ADC(附加仿真代码)

[复制链接]
6817|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AC, AD, ADC, DAC, dc
本帖最后由 咕咕呱呱孤寡 于 2024-11-16 10:12 编辑

  #申请原创# @21小跑堂
数模转换(DAC)和模数转换(ADC)是单片机设计中重要的转换方式。

DAC的功能是将数字量转换为与其成比例的模拟电压或电流信号,绘出仪表外各种控制。DAC种类多,常用 DAC:DAC0832、AD7524、AD561等。

各种类型的 DAC 都具有数字量输入端、模拟量输出端及基准电压端。数字量输入有以下几种类型:① 无数据锁存器:② 带单数据锁存器:③ 带双数据锁存器:④ 可接串串行数字输入。第1种在与单片机接口时,要外加锁存器;第2种和第3种可直接与单片机接口:第4种与单片机接口十分简单,但接收数据较慢,适用于远距离现场控制的场合。
模拟量输出有两种方式:电压输出及电流输出。电压输出的DAC相当于一个电压源,其内阻很小,选用这种芯片时,与它匹配的负载电阻应较大。电流输出的芯片相当于电流源,其内阻较大,选用这种芯片时,负载电阻不可太大。在实际应用中,常选用电流输出的 DAC 实现电压输出,如下图(a)、(b)、(c)。

(a)、(b)电路均是单极性输出,(c)所示的电路为双极性输出。这里的双极性电路通常设计将R3=R4=2R2,从而使得输出电压Vout与基准电压Vref及第一级运放输出电压V1建立联系,其关系为Vout=-(2V1+Vref),这里将Vref取值通常选用芯片基准电压或电源电压,极性可正可负。
这里我们以DAC0832为实验芯片,进行简单实验仿真练习。


上图为DAC0832的逻辑结构,DAC0832作为典型的带内部双数据缓冲器的8位D/A芯片,单电源供电,从+5V~+15V均可正常工作,基准电压的范围为±10V,电流建立时间为1µs,CMOS工艺,低功耗20mm。其内部结构由1个8位输入寄存器、1个8位DAC寄存器和1个8位D/A转换器组成。

示如上图将DAC0832与8051单片机组合形成D/A转换电路通过Proteus仿真,实现波形输出。
通过keil软件进行代码编译与Proteus实现联机仿真,如下
宏定义文件代码:
  #include<REGX51.H>
  #define uchar unsigned char
  #define uint unsigned int
  #define WR P2_0
  #define CS P2_1

变量定义代码:
  uchar i,j;
  uint k;

通过DAC0832实现三角波输出:
void delay()
  {
  for (k=0;k<1000;k++);
  }
void main()
  {
  CS=0;
  while(1)
  {
  for(i=0;i<255;i++)
  {
  P1=i;
  WR=0;
  WR=1;
  }
  for(j=255;j>1;j--)
   {
   P1=j;
   WR=0;
   WR=1;
   }
   }
}
去掉橙色部分或黄色部分可形成锯齿波输出,仿真效果图如下:




若想要实现梯形波,则在变量计数后加延时,就会实现电平延迟。
for(i=0;i<255;i++)
  {
  P1=i;
  WR=0;
  WR=1;
  }

delay();
效果图如下:


方波输出则需要将IO引脚置高或或置低:
void main()
{
   CS=0;
   while(1)
   {
   P1=0;
   WR=0;
   WR=1;
   delay();
   P1=0xff;
   WR=0;
   WR=1;
   delay();
   }
}
效果图如下:


在原有原理图基础上,将转换电路修改为双极性输出,如下图:
根据电流输出的DAC实现电压输出的电压关系,Vout=-(2V1+Vref),波形图如下:

通过DAC转换除了可以实现波形输出,还可以驱动直流电机或多路模拟量输出等功能,可以利用DAC0832进行拓展学习。


ADC的功能是将输入模拟量转换为与其成比例的数字量,按其工作原理,有比较式ADC、积分式ADC及电荷平衡(电压-频率转换)式ADC等,常用ADC:ADC0808、ADC0809、ADC574等。

在实际使用中,应根据具体情况选用合适的 ADC。不同的芯片具有不同的连接方式,其中最主要的是输入、输出及控制信号的连接方式。从输入端来看,有单端输入的,也有差动输入的。差动输入有利于克服共模干扰。输入信号的极性有单极性和双极性输入,这由极性控制端的接法决定。从输出方式来看,主要有如下两种。
①数据输出寄存器具有可控的三态门。此时芯片输出线允许与CPU的数据总线直接相连,并在转换结束后利用读信号RD控制三态门,将数据送上总线。
②不具备可控的三态门,输出寄存器直接与芯片引脚相连,此时芯片的输出线必须通过输入缓冲器连至 CPU 的数据总线。
ADC的启动转换信号有电平和脉冲两种形式。设计时应特别注意,对要求用电平启动转换的芯片,如果在转换过程中撤去电平信号,芯片将停止转换,得到错误的结果。ADC转换完成后,将发出结束信号,以提示主机可以从转换器读取数据。结束信号也用来向CPU发出中断申请,CPU响应中断后,在中断服务子程序中读取数据,也可用延时等待和查询转换是否结束的方法来读取数据。


下面以ADC0809为ADC转换芯片做仿真演示。

上图为ADC0809的工作时序,将ADC0809与单片机8051组合形成ADC转换仿真电路。



根据上述ADC转换有三种方式:延时等待、查询、中断,以下分别演示,在ADC0809的CLOCK引脚处,提供一脉冲方波,通过keil软件编译与与Proteus实现联机仿真,如下:
宏定义文件代码:
  #include<AT89X51.H>
  #define uchar unsigned char
  #define uint unsigned int
  #define EOC P1_1
  #define OE P1_2
  #define ST P1_0

延时等待:
uchar i,j,k;   //变量定义
void delay(void)
{
  uint n;
  for(n=200;n>0;n--);
}
void delay1(void)
{
  uint m;
  for(m=10;m>0;m--);
}
void main(void)
{
  while(1)
  {
  ST=1;
  delay1();
  ST=0;
  delay();
  OE=1;
  k=P2;
  P0=k;
  OE=0;
  }
}



查询:
uchar i,j,k;
void delay(void)
{
  uint n;
  for(n=200;n>0;n--);
}
void delay1(void)
{
  uint m;
  for(m=10;m>0;m--);
}
void main(void)
{
  while(1)
  {
  ST=1;
  delay1();
  ST=0;
  delay1();
  while(!EOC);   //查询判断
  OE=1;
  k=P2;
  P0=k;
  OE=0;
  }
}



中断:
uint m;
uchar k;
void delay1(void)
{
  for(m=10;m>0;m--);
}
void init()
{
  P0=0x00;
  IT0=1;
  EX0=1;
  EA=1;    //中断使能
}
void main(void)
{
  init();
  ST=1;
  delay1();
  ST=0;
  while(1);
}
void intp0() interrupt 0       //中断函数
{
  OE=1;
  k=P2;
  P0=k;
  OE=0;
  ST=1;
  delay1();
  ST=0;
}



DAC和ADC作为两种类型的转换器,应用于不同场合,在数字信号处理中广泛使用,现如今很多单片机型号都已内置ADC及DAC功能,使得在数模、模数转换上更加便捷,从设计上为PCB板设计节省空间。




使用特权

评论回复

打赏榜单

21小跑堂 打赏了 50.00 元 2024-11-28
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论
21小跑堂 2024-11-28 17:17 回复TA
浅谈DAC和ADC的相关理论知识,运用Proteus的硬件电路仿真和8051单片机的程序联调。实现简单的演示。 
咕咕呱呱孤寡 2024-11-22 16:02 回复TA
@21小跑堂 :好的谢谢 
21小跑堂 2024-11-22 13:26 回复TA
@咕咕呱呱孤寡 :不好意思@过多,忽略了,现已加入审核中 
咕咕呱呱孤寡 2024-11-22 08:44 回复TA
@21小跑堂 请问我这个不符合原创要求是不,想了解一下,以后改进,谢谢 

相关帖子

发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

1869

帖子

2

粉丝