51单片机学习笔记(十) - AD/DA转换
·
文章目录
一、AD/DA基本介绍
一、基本概念
- A是指analog、模拟的;D是指digital、数字的。
- 现实世界是模拟的,连续分布的;计算机世界是数字的,离散分布的,是可以被分成有限份的;
- AD转换就是把一个物理量从模拟的转换成数字的;DA就是将数字量转换成模拟量。
二、A/D转换的意义
- 自然界多数是模拟量,而计算机计算只能是数字量,所以为了借助计算机的工具研究计算模拟量,就需要将模拟量转换成计算机能识别的数字量;
- D/A是A/D转换的逆过程,是计算机将数字量转换成模拟量输出,但是此种模拟量严格意义上也不是连续的,也是可以分为有限份数的。
- A/D,D/A转换可以理解为数字量和模拟量的一个通信。也可以理解为物理世界和数字世界的交流。
A/D,D/A的转换原理,在数字电路相关课程里会有更详细的介绍,在这里我们无需展开细说,只需知道如何使用即可。感兴趣可以参考数字电路相关知识。
二、A/D,D/A转换中的主要概念
- 位数: AD转换后转出来的数由几位二进制来表示。位数越多,越细腻,精度越高。例如:10位,代表可以将模拟量分成1024份,12位,代表可以将模拟量分成4096份;
- 量程:AD转换器可以接受的模拟量的范围。跟芯片制造有关系,如果超过量程,超量程部分可能会被阉割,重则将芯片烧毁;
- 分辨率:AD转换器转出来的二进制数,每一格表示多少。例如:10位,分辨率是1/1024,12位,分辨率是1/4096;
- 转换速率:就是完成一次A/D,D/A转换所耗费的时间。实际应用中,转换速率越快越好,随之成本会越高。适合项目使用即可;
举例说明:
条件:电压量程范围0-5V,A/D,D/A转换位数是10位,精度是0.01V
分辨率为:(5-0)/2exp(10)=0.00488V
例如一次A转换中数字量是1010101010,计算转换中模拟量的过程如下:
1、1010101010对应的十进制数是682;
2、数字量对应的模拟电压是[682/2exp(10)]*5V =[682/1024]*5 = 3.33V
三、A/D,D/A转换在系统中存在的方式
- CPU外部扩展专用A/D,D/A芯片;
- CPU内部集成A/D,D/A模块(内部外设)
早期的单片机基本都是在外部扩展,新的高级一些的单片机是内部集成的;
51单片机内部没有集成,所以使用的是外部扩展,使用ET2046芯片,并用SPI接口通信
四、A/D转换原理图及ET2046芯片介绍
1、原理图
2、ET2046芯片介绍
1、主要特点
- 工作电压范围为 1.5V~5.25V
- 支持 1.5V~5.25V 的数字 I/O 口
- 内建 2.5V 参考电压源
- 电源电压测量( 0V~6V)
- 内建结温测量功能
- 触摸压力测量
- 采用 3 线制 SPI 通信接口
- 具有自动省电功能
2、引脚功能说明
3、ET2046控制字
3、开发板接线
1、SPI接线
- XPT_DO -> P3^7; //SPI输出;
- XPT_CLK -> P3^6; //SPI时钟;
- XPY_DI -> P3^4; //SPI输入;
- XPT_CS -> P3^5; //SPI片选。
2、模拟输入量
- AIN0靠滑动变阻器分压变化;
- AIN1靠热敏电阻NTC分压,温度变化电阻变化,导致分压变化;
- AIN2靠光敏电阻分压。
五、ET2046芯片SPI时序分析
1、时序图
2、SPI写时序代码实现
void Et2046_Wirte_Data(unsigned char dat)
{
unsigned char i;
CLK = 0;
_nop_();
for(i = 0; i < 8; i++)
{
DIN = dat >> 7; //先传高位
dat <<= 1; //将低位移到高位
CLK = 0;
_nop_();
CLK = 1; //CLK产生一个上升沿,写入数据
_nop_();
}
}
3、SPI读时序代码实现
unsigned int Et2046_Read_Data(void)
{
unsigned int value = 0;
unsigned char i;
CLK = 0;
_nop_();
for(i = 0; i < 12; i++) //12位AD,每次读取一位
{
value <<= 1; //注意该条语句放置的位置
CLK = 1;
_nop_();
CLK = 0; //CLK由高到低产生一个下降沿,从而读取数据
value |= DOUT; //先读取高位
}
return value;
}
4、ET2046读取采样代码实现
unsigned int Et2046_Read_Adc_Value(unsigned char cmd)
{
unsigned int adc_result = 0;
unsigned char i = 6;
CLK = 0;
CS = 0; //使能ET2046
Et2046_Wirte_Data(cmd);
while(i) i--;
CLK = 1; //发送一个时钟,清除BUSY
_nop_();
CLK = 0;
adc_result = Et2046_Read_Data();
CS = 1; //关闭ET2046
return adc_result;
}
5、一些宏定义
#define CMD_READ_AIN0 0x94 //电位器
#define CMD_READ_AIN1 0xD4 //NTC
#define CMD_READ_AIN2 0xA4 //光敏电阻
#define CMD_READ_AIN3 0xE4 //外部输入
sbit DOUT = P3^7; //输出
sbit CLK = P3^6; //时钟
sbit DIN = P3^4; //输入
sbit CS = P3^5; //片选
六、D/A转换
1、基本概念
-
概念
数模转换器,又称D/A转换器,简称DAC,它是把数字量转变成模拟的器件。D/A转换器基本上由4个部分组成,即权电阻网络、运算放大器、基准电源和模拟开关。模数转换器中一般都要用到数模转换器,模数转换器即A/D转换器,简称ADC,它是把连续的模拟信号转变为离散的数字信号的器件。 -
应用
函数信号发生器、数字转换模拟参考信号
2、开发板原理图
1、通过PWM1的占空比,经过运放的积分电路,会生成不同的电压;
2、这里勉强算是一个DA,可以通过定时器和IO输出来实现,故代码省略。
总结
1、本节介绍了A/D,D/A转换的相关概念;
2、重点介绍并代码实现了SPI的时序;
3、定义局部变量的时候,最好先初始化为0;
4、简单介绍了DA实现的原理。
更多推荐
已为社区贡献2条内容
所有评论(0)