proteus+51单片机+AD/DA学习5
目录
1.DA转换原理
1.1基本概念
1.1.1DA的简介
1.1.2DA0832芯片
1.1.3PCF8591芯片
1.2代码
1.2.1DAC8053的代码
1.2.2PCF8951的代码
1.3仿真
1.3.1DAC0832的仿真
1.3.2PFC8951的仿真
2.AD转换原理
2.1AD的基本概念
2.1.1AD的简介
2.1.2ADC0809的介绍
2.1.3XPT2046芯片介绍
编辑编辑2.2AD代码
2.2.1PFC8591代码
2.3仿真实验
1.DA转换原理
1.1基本概念
1.1.1DA的简介
- DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号
- D/A转换一般由电阻解码网络、模拟电子开关、基准电压、运算放大器等组成。按电阻解码网络的组成形式,将DA转换器分成有权电阻解码网络D/A转换器、T型电阻解码网络D/A转换器、倒T型电阻解码网络D/A转换器和开关树型电阻解码网络D/A转换器等。
- DAC的分类
(1)从数码数上看,有8位、10位、12位、16位、24位等。
(2)在输出形式上,有:电压输出型和电流输出型
(3)按输入是否含有锁存器分为:内部无锁存器和内部有锁存器形式
(4)按数字量的输入形式分为:并行总线D/A转换器和串行总线D/A转换器
(5)按转换时间分为:超高速DAC(转换时间<100ns)、较高速DAC(100ns~1us)、高速(1μs~10μs
中速DAC(10μS~100μs)、低速DAC(>100us)等。
- DAC的性能指标
(1)分辨率:指AD/DA数字量的精细程度,通常用位数表示。例如,对于5V电源系统来说,8位的AD可将5V等分为256份,即数字量变化最小一个单位时,模拟量变化5V/256=0.01953125V,所以,8位AD的电压分辨率为0.01953125V,AD/DA的位数越高,分辨率就越高
(2)转换速度:表示AD/DA的最大采样/建立频率,通常用转换频率或者转换时间来表示,对于采样/输出高速信号,应注意AD/DA的转换速度
(3)建立时间:建立时间是描述D/A转换器转换速度的参数,表明转换时间长短。其值为从输入数字量到输出达到终值误差正负(1/2)LSB(最低有效位)时所需的时间。电流输出的转换时间较短,而电压输出的转换器,由于要加上完成I-V转换的时间,因此建立时间要长一些。快速D/A转换器的建立时间可控制在1s以下。
(4)转换精度:理想情况下,转换精度与分辨率基本一致,位数越多精度越高。但由于电源电压、基准电压、电阻、制造工艺等各种因素存在误差。严格地讲,转换精度与分辨率并不完全一致。两个相同位数的不同的DAC,只要位数相同,分辨率则相同,但转换精度会有所不同。
1.1.2DA0832芯片
- DAC0832芯片内部的框图
(1)DAC0832的内部结构如图所示,内部有两级数据缓冲器(8位输入寄存器和8位DAC寄存器)和一个8位D/A转换器以及门控电路。内部无参考电源需外接;输出电流型,要获得电压输出需外加转换电路。各引脚含义如下:
- T型电阻网络DA转换器(8位DA转换器)
(1)当数字量D7~D0为1时,开关将会移向1,为0时将会开关在0
(2)由右边的电阻2R//2R的并联后的阻值为R,再加上串联的电阻R,形成2R的电阻。再依次与输入数据的高位 电阻并联得到总阻值为R了。因此总的电流为。
(3)进行分流操作时,两个并联电阻的流经的电流是相等的,串联的电流是两个并联电流之和。依次形成从D7~D0的电流位权。即D7的电流是D6电流的两倍,最后合成总的输出电流。形成一个8位的二进制数
(4)最终的每一位电流的大小的计算公式为,总的电流除以2的8次方
(5)当Ref=R时,输出电压×,即输出电压为Io1与反馈电阻的乘积
- DAC的芯片引脚
写信号1 | |
写信号2 | |
片选信号 | |
数据传送控制信号输入线,低电平有效。 | |
DI0~DI7(DI0为最低位) | 8位数字量输入端 |
I-V转换时的外部反馈信号输入端,内部己有反馈电阻Rfb,根据需要也可外接反馈电阻。 | |
模拟电流输出线1,它是数字量输入为“1”的模拟电流输出端。输入数字量全为“1”时,最大, | |
模拟电流输出线2,它是数字量输入为“0”的模拟电流输出端,+=常数 | |
基准电压输入线。电压范围为-10V~+10V。 | |
工作电源输入端,可接+5V~+15V电源。 | |
AGND DGND | 模拟地。最好与基准电压共地 数字地。 |
(1)当LE=1,CS*=0,WR1*=0时,即M1=1,第一级8位输入寄存器被选中。待转换的数字信号被锁存到第一级8位输入寄存器中。
(2)当XFER*=0,WR2*=0时,第一级8位输入寄存器中待转换数字进入第二级8位DAC寄存器中。
1.1.3PCF8591芯片
- PCF8591是具有I2C总线接口的8位A/D及D/A 转换器。PCF8591有4个模拟输入、1个模拟输出和1个I²C总线接口。PCF8591有3个地址引脚A0, A1和A2,用于硬件地址设定,这允许在一条I2C总线上接入8个PCF8591器件。
- 链接:PCF8591+I2C DA转换 实现PWM方波、三角波以及实现呼吸灯_哔哩哔哩_bilibiliPCF8591+I2C DA转换 实现PWM方波、三角波以及实现呼吸灯是51单片机入门教程+Proteus嵌入式开发入门实战视频教程2024新版的第21集视频,该合集共计23集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1uN411M7PB/?p=21&spm_id_from=333.880.my_history.page.click
- DAC的芯片概述
AIN0~
AIN3:
| 模拟信号输入管脚。 |
A0~
A2
|
硬件地址设定管脚
|
VDD
| 接电源(2.5V~6V)正极 |
VSS
| 接电源(2.5V~6V)负极,即GND。 |
VREF
| 基准电源端 |
AOUT
|
D/A
转换输出端
|
SDA |
I2C
总线的数据线
|
SCL
|
I2C
总线的时钟线。
|
OSC
| 外部时钟输入端,内部时钟输出端。 |
EXT | 内部、外部时钟选择线,使用内部时钟时EXT 接地。内部、外部时钟选择线,使用内部时钟时EXT 接地。 |
AGND | 模拟信号地 |
- PFC8951的设备地址
- PFC8951的D/A转换
1.2代码
1.2.1DAC8053的代码
//方波的生成代码
//单片机采用定时器定时中断,时间常数决定方波高、低电平持续时间
void DAC_test_PWM()
{
P2=0; //PWM波的低电平的时间即0V
Delay_ms(50); //高电平持续时间
P2=255; //输出PWM的最大值即参考电压的5V
Delay_ms(10); //低电平持续时间
}
//单片机把初始数据0送DAC0832后,数据不断增1,增至0xff后,再增1则溢出清“0”,
//模拟输出又为0,然后再重复上述过程,如此循环,则输出锯齿波。
//生成锯齿波
void DAC_Test_sawetooth_wave()
{
unsigned int i;
for(i=0;i<256;i++)
{
P2=i;
}
}
//生成三角波
//单片机把初始数字量0送DAC0832后,不断增1,增至0xff后,然后从0xff
//再把送给DAC0832的数字量不断减1,减至0后,再重复上述过程。
void DAC_Test_triangular_wave()
{
int i;
for(i=0;i<255;i++)
{
P2=i;
}
for(i=255;i>0;i--)
{
P2=i;
}
}
//正弦表
unsigned char code sin[]={0x7F,0x82,0x85,0x88,0x8B,0x8F,0x92,0x95,0x98,0x9B,0x9E,0xA1,0xA4,0xA7,0xAA,0xAD
,0xB0,0xB3,0xB6,0xB8,0xBB,0xBE,0xC1,0xC3,0xC6,0xC8,0xCB,0xCD,0xD0,0xD2,0xD5,0xD7
,0xD9,0xDB,0xDD,0xE0,0xE2,0xE4,0xE5,0xE7,0xE9,0xEB,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4
,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFB,0xFC,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE
,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFD,0xFD,0xFC,0xFB,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6
,0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEB,0xE9,0xE7,0xE5,0xE4,0xE2,0xE0,0xDD,0xDB
,0xD9,0xD7,0xD5,0xD2,0xD0,0xCD,0xCB,0xC8,0xC6,0xC3,0xC1,0xBE,0xBB,0xB8,0xB6,0xB3
,0xB0,0xAD,0xAA,0xA7,0xA4,0xA1,0x9E,0x9B,0x98,0x95,0x92,0x8F,0x8B,0x88,0x85,0x82
,0x7F,0x7C,0x79,0x76,0x73,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x54,0x51
,0x4E,0x4B,0x48,0x46,0x43,0x40,0x3D,0x3B,0x38,0x36,0x33,0x31,0x2E,0x2C,0x29,0x27
,0x25,0x23,0x21,0x1E,0x1C,0x1A,0x19,0x17,0x15,0x13,0x12,0x10,0x0F,0x0D,0x0C,0x0A
,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00
,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08
,0x09,0x0A,0x0C,0x0D,0x0F,0x10,0x12,0x13,0x15,0x17,0x19,0x1A,0x1C,0x1E,0x21,0x23
,0x25,0x27,0x29,0x2C,0x2E,0x31,0x33,0x36,0x38,0x3B,0x3D,0x40,0x43,0x46,0x48,0x4B
,0x4E,0x51,0x54,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x73,0x76,0x79,0x7C};
//生成正弦波
void DAC_Test_sine_wave()
{
unsigned int i;
for(i=0;i<256;i++)
{
P2=sin[i];
}
}
1.2.2PCF8951的代码
void PCF8951_DAC(unsigned char Data)
{
I2C_Start(); //iic开始
I2C_sendByte(0x90); //iic写信号
I2C_ReceiveAck(); //等待一应答
I2C_sendByte(0x40); //发送控制位
I2C_ReceiveAck(); //等待应答
I2C_sendByte(Data); //发送数据电压值
I2C_ReceiveAck(); //等待应答
I2C_end(); //iiC停止
}
void PWM()
{
PCF8951_DAC(255);
Delay1us(10000);
PCF8951_DAC(0);
Delay1us(10000);
}
1.3仿真
1.3.1DAC0832的仿真
1.3.2PFC8951的仿真
2.AD转换原理
2.1AD的基本概念
2.1.1AD的简介
- AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号。AD转换通常有多个输入通道,用多路选择开关连接至AD转换器,以实现AD多路复用的目的,提高硬件利用率
- AD转换器的主要性能指标
(1)分辨率:ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示。例如12位ADC的分辨率就是12位,或者说分辨率为满刻度FS的1/。 一个10V满刻度的12位ADC能分辨输入电压变化最小值是10V×1/=2.4mV。
(2)量化误差:ADC把模拟量变为数字量,用数字量近似表示模拟量,这个过程称为量化。量化误差是ADC的有限位数对模拟量进行量化而引起的误差。实际上,要准确表示模拟量,ADC的位数需很大甚至无穷大。一个分辨率有限的ADC的阶梯状转换特性曲线与具有无限分辨率的ADC转换特性曲线(直线)之间的最大偏差即是量化误差。
(3)偏移误差:偏移误差是指输入信号为零时,输出信号不为零的值,所以有时又称为零值误差假定ADC没有非线性误差,则其转换特性曲线各阶梯中点的连线必定是直线,这条直线与横轴相交点所对应的输入电压值就是偏移误差。
(4)满刻度误差:满刻度误差又称为增益误差。ADC的满刻度误差是指满刻度输出数码所对应的实际输入电压与理想输入电压之差
(5)线性度:线性度有时又称为非线性度,它是指转换器实际的转换特性与理想直线的最大偏差。
(6)绝对精度:在一个转换器中,任何数码所对应的实际模拟量输入与理论模拟输入之差的最大值,称为绝对精度。对于ADC而言,可以在每一个阶梯的水平中点进行测量,它包括了所有的误差
(7)转换速率:ADC的转换速率是能够重复进行数据转换的速度,即每秒转换的次数。而完成一次A/D转换所需的时间(包括稳定时间),则是转换速率的倒数。
- 逐次逼近式ADC的转换原理
(1) 数字量由“逐次逼近寄存器SAR(shift arithmetic right)”产生。SAR使用“对分搜索法”产生数字量,以8位数字量为例,SAR首先产生8位数字量的一半,即10000000B,试探模拟量Vi的大小,若Vn>Vi,清除最高位,若Vn<Vi,保留最高位。在最高位确定后,SAR又以对分搜索法确定次高位,即以低7位的一半y1000000B(y为已确定位) 试探模拟量Vi的大小。在bit6确定后,SAR以对分搜索法确定bit5位,即以低6位的一半yy100000B(y为已确定位) 试探模拟量的大小。重复这一过程,直到最低位bit0被确定,转换结束。
(2)VN为参考电压的一半
2.1.2ADC0809的介绍
- 引脚的定义
(1)DAC输出的电压和通道选择开关的的输出电压进行比较最终输出一个电压到SAR中,SAR通过大小来控制DAC的要输出的电压大小,最终输出到8位三态锁存缓冲器
- 电压比较器
(1)输出数字量:(D7~D0)=×256。结果为整数
- ADC0809的工作时序
2.1.3XPT2046芯片介绍
- XPT2046的功能说明
(1)XPT2046是一款4线制电阻式触摸屏控制器,内含12位分辨率125KHz转换速率逐步逼近型 A/D转换器。 XPT2046支持从1.5V到5.25V的低电压I/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带2.5V参考电压,可以作为辅助输入、温度测量和电池监测之用,电池监测的电压范围可以从0V到6V。XPT2046片内集成有一个温度传感器。 在 2.7V的典型工作状态下,关闭参考电压,功耗可小于 0.75mW。XPT2046 采用微小的封装形式:TSSOP-16,QFN-16 和 VFBGA-48。工作温度范围为-40℃~+85℃。与ADS7846、TSC2046、AK4182A完全兼容
- XPT2046的主要特性
(1)工作电压范围为 1.5V~5.25V
(2) 支持 1.5V~5.25V 的数字 I/O 口
(3)内建 2.5V 参考电压源
(4) 电源电压测量(0V~6V)
(5) 内建结温测量功能
(6) 触摸压力测量
(7) 采用 3 线制 SPI 通信接口
(8) 具有自动省电功能
- 芯片引脚
(1)TSSOP-16 封装
- 单端输入和差分输入
(1)单端输入:单端输入只有一个输入引脚ADCIN,使用公共地GND作为电路的返回端,ADC的采样值=ADCIN电压-GND的电压(OV).这种输入方式优点就是简单,缺点是如果Vin受到干扰,由于GND电位始终是0V,所以最终ADC的采样值也会随着干扰而变化,
(2) 差分输入:差分输入比单端输入多了一根线,最终的ADC采样值=(ADCIN+电压)(ADCIN-电压),由于通常这两根差分线会布在一起,所以他们受到的干扰是差不多的,输入共模干扰,在输入ADC时会被减掉,从而降低了干扰,缺点就足投线复杂一些。而目需要VIN+和VIN一两路反相的输入信号。
- XPT2048的工作时序
2.2AD代码
2.2.1PFC8591代码
//ADC采集模拟量的函数
unsigned int PCF8951_ADC(void)
{
unsigned int Data;
I2C_Start();
I2C_sendByte(0x90); //寻找PFC8951的地址
I2C_ReceiveAck(); //等待应答
I2C_sendByte(0x00); //使用通道0来采集电压
I2C_ReceiveAck();
I2C_Start();
I2C_sendByte(0x91); //发送地址+读
I2C_ReceiveAck();
Data=I2C_ReceiveByte();//接收数据ADC
I2C_SendACK(1);
I2C_end();
return Data;
}
//主函数测量函数
int main()
{
unsigned int voltage; //设置数字量
unsigned int vol; //
LCD_Init();
while(1)
{
voltage=PCF8951_ADC(); //测量的模拟量进入单片机后转换的数字量
vol=voltage*5/0.255; //检测的电压放大1000倍
LCD_WriteNum(1,1,vol/1000%10,1);//整数位
LCD_WriteString(1,2,"."); //.点位
LCD_WriteNum(1,3,vol/100%10,1); //检测的电压的小数位的第一位
LCD_WriteNum(1,4,vol/10%10,1); //检测的电压的小数位的第二位
LCD_WriteNum(2,1,voltage,4); //检测电压的数字量
}
}
2.3仿真实验
(1)POT-HG
(2)电压表(DC Voltmeter)