江协科技51单片机学习- p35 AD/DA模拟/数字采样

   🚀write in front🚀  
🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 

💬本系列哔哩哔哩江科大51单片机的视频为主以及自己的总结梳理📚 

前言:

本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。

引用:

(十七)51单片机——AD/DA转换_51单片机的ad转换-CSDN博客

51单片机学习笔记-14 ADDA_51单片机adda-CSDN博客

单片机学习笔记---AD/DA工作原理(含运算放大器的工作原理)_单片机_Vera工程师养成记-GitCode 开源社区

Proteus基于51单片机通过PWM脉冲调制控制电机转速_按键与串口控制转速_电机转速可测_proteus中电机的转速怎么测-CSDN博客

51单片机霍尔测速与PWM调直流电机转速快慢_单片机霍尔直流电机如何计算转速-CSDN博客

基于51单片机的直流电机测速系统(proteus仿真 程序 电路 代码)_基于at89c51单片机的电机测速系统设计seg显示-CSDN博客

基于51单片机和霍尔传感器的测速-CSDN博客

基于51单片机直流电机PWM调速设计_51单片机pwm调速-CSDN博客

基于51单片机的霍尔直流电机PWM调速系统_基于51单片机的直流电机pwm调速控制系统-CSDN博客

正文:

0. 🌿概述

在淘宝上购买了江协科技51单片机开发板套件(普中科技STC51单片机A2型号),就上在上一篇博文里说的自己计划学习下江协科技51单片机开发教程,通过STC51单片机这种MCU这种贴近于裸机的开发来增加对于系统硬件层面知识的了解和掌握。

术语和缩略语

缩写全称说明
ADAnalog to Data模拟到数字,将模拟信号转换为计算机可操作的数字信号
DAData to Analog数字到模拟,将计算机输出的数字信号转换为模拟信号
ADCAnalog to Data Convert模拟到数字转换

1. 🚀 AD/DA介绍

AD/DA数字量/模拟量转换的介绍:

AD/DA转换打开了计算机与模拟信号的大门,极大的提高了计算机系统的应用范围,也为模拟信号数字化处理提供了可能。

AD通常是对电压进行转换(注意电阻阻值应大致相同),并且AD转换通常有多个输入通道,用多路选择开关连接至AD转换器,以实现AD多路复用的目的,提高硬件利用率。AD/DA与单片机数据传送可使用并口(速度快、原理简单),也可使用串口(接线少、使用方便),看需求而定。另外也可以将AD/DA模块直接集成在单片机内,这样直接写入/读出寄存器就可进行AD/DA转换,单片机的IO口可直接复用为AD/DA的通道。

🌳光敏电阻,热敏电阻,它们的电阻阻值随着光线的亮度或者温度而变化,如果我们将光敏电阻或者热敏电阻和一个电阻串联起来进行分压,那么随着光敏电阻/热敏电阻阻值的变化它们的电压分压值也就会发生改变。

🌳一般传感器的电阻的阻值会随着一些环境模拟量参量的变化而变化,AD转换一般对电压进行转化的它只能读取电压,如果我们要把电阻的变化转换为电压的变化就需要对它串一个电阻(串一个和它阻值差不多的电阻)。

  • 🌵AD转换通常有多个输入通道,用多路选择开关连接至AD转换器,以实现AD多路复用的目的,提高硬件利用率
  • 🌵AD/DA与单片机数据传送可使用并口(速度快、原理简单),也可使用串口(接线少、使用方便)
  • 🌵可将AD/DA模块直接集成在单片机内,这样直接写入/读出寄存器就可进行AD/DA转换,单片机的IO口可直接复用为AD/DA的通道

AD通常由多个输入通道,用多路选择开关连接至AD转换器,以实现AD多路复用的目的,提高硬件的利用率,一般AD转换器都会有多个通道的,如果一个AD只有一个通道会有点浪费啊。

1.1 开发板上AD,DA模块

在我们使用的单片机开发板原理图中(普中科技51单片机开发板A2)使用的ADC其实是一个触摸屏的芯片,如果你自己了解就知道它其实是一个触摸屏芯片,当然这触摸屏的原理也是AD转换,但它直接用触摸屏的芯片来做这个ADC的实验有点不方便理解哈,因为它(手册)内部经常会出现一些触摸屏的姿势啊,触摸屏如何检测的,然后就比较复杂不是很好理解。当然它的时序还是比较简单的,我们用时序直接读出来就行了,内部其它的触摸屏哪些就不需要管了。

然后DAC哪它用的是一个PWM型的,不过现在DAC的主流的,不过我觉的PWM型的DAC也有一些弊端,它需要输出我们PWM的波形,PWM距我们DA只剩下一步了哈,就是比较简单只剩一下一两步了,我们PWM信号本身就可以代表DA,怎样讲PWM转换为模型信号哪,只需要一个低通滤波就可以将PWM转换为模拟信号,所以PWM信号在一定程度上就是DA的另一种形式吧。我用一个低通滤波就可以直接转换为连续变化的波形。

这片开发板上使用的AD和DA模块都不是很主流的,用模拟屏芯片作为我们通用的了解上DA的内部原理上,有点闭塞封装起来了比较不方便理解,然后DAC PWM,起始我们现在用的话,更倾向于电阻网络DA,它比较简单原理更容易理解。

1.2 经典AD和DA芯片

下面是古老的(也非常经典的)AD转换芯片ADC0809、DA转换芯片DAC0832,由于芯片体积大且接口太多,目前已经逐渐淘汰。

因为它芯片比较老,接线也太多,所以也不推荐大家使用这些芯片,可以用一些新的ADC转换芯片,比如说这个在其它开发板上或者电子制作上也会经常使用的,就是 PCF8591 这个芯片,它是一个I2C总线的,它有4个AD转换,和一个DA转换,它的使用是比较简单的用通信总线直接读出来就可以了。

1.3 AD(模拟到数字) 

这是一个简单的AD芯片(ADC0809),首先选择模拟开关,之后进行AD转换,再通过缓存器输出,就可以了。

  • START:开始转换
  • EOC:转换结束
  • CLOCK:时钟
  • OE:使能

1.4 DA(数字到模拟)

 这是一个简单的DA芯片(ADC0832),首先输入数据,通过控制电路控制寄存器,最后通过一个DA转换器输出就成了。

 经过两路缓存,这个缓存器的做啥用的,就是用来多路同步的。比如说有两个DAC,我要求两个DAC同时输出,我可以想把数据放到缓存器里面,然后两个都放好之后再同时给这个输出信号,然后两个DAC就可以同步输出了。

1.5 DA转换的一个原理(运算放大器)

  • 📚️运算放大器(简称“运放”)是具有很高放大倍数的放大电路单元。它是一个集成电路,内部集成了差分放大器、电压放大器、功率放大器三级放大电路,是一个性能完备、功能强大的通用放大电路单元,由于其应用十分广泛,现已作为基本的电路元件出现在电路图中
  • 📚️运算放大器可构成的电路有:电压比较器、反相放大器、同相放大器、电压跟随器、加法器、积分器、微分器等
  • 📚️运算放大器电路的分析方法:虚短、虚断(负反馈条件下)

1.理想运算放大器具备以下性质:

  • 无限大的输入阻抗: 理想的运算放大器输入端不容许任何电流流入,即输入信号V+与V-两端点的电流信号恒为零,即输入阻抗无限大。
  • 趋近于零的输出阻抗: 理想运算放大器的输出端是一个完美的电压源,无论流至放大器负载的电流如何变化,放大器的输出电压恒为一定值,即输出阻抗为零。
  • 无限大的开回路增益: 理想运算放大器的开回路的状态下,输入端的差动信号有无限大的电压增益,这个特性使得运算放大器十分适合在实际应用时加上负反馈组态。
  • 无限大的共模抑制比: 理想运算放大器只能对V+与V-两端点电压的差值(差分信号)有反应,即只放大V+−V− 的部份。对于两输入信号的相同的部分(共模信号)将完全忽略不计。
  • 注:共模信号:双端输入时,两个信号相同。差模信号:双端输入时,两个信号的相位相差180度。

2.集成运算放大器有两种工作状态:

  • 线性状态:当给集成运算放大器加上负反馈电路时,工作在线性状态。工作特点:
    具有虚断特性及流入和流出输入端的电流都为0,I- = I+ = 0A。 
    具有虚短的特性及两个输入端的电压相等,U+ = U-。
  • 非线性状态:如果给集成运算放大器加正反馈电路或当其在开环工作时,工作在非线性状态。工作特点:
    当同相输入端电压大于反向输入端电压时,输出电压为高电平。
    当同相输入端电压小于反向输入端电压时,输出电压为低电平。 

3.运算放大器的分析方法

运算放大器的分析方法是:虚短和虚断(负反馈条件下)

  • 虚短: 集成运算放大器的开环放大倍数很大,一般通用型的运算放大器的开环电压放大倍数都在80dB以上,但是运放的输出电压是有限制的,一般 在10V~14V,然而运放的差模输入电压不足1 mV,因此可以输入两端可以近似等电位,就相当于短路。 开环电压放大倍数越大,两输入端的电位越接近相等,这种特性称之为虚短。
  • 虚断: 集成运算放大器具有输入高阻抗的特性,一般同向输入端和反向输入端的输入电阻都在1MΩ以上,所以输入端流入运放的电流往往小于1uA,远小于输入端外电路的电流。所以这里通常可把运放的两输入端视为开路,并且运放的输入电阻越大,同向和反向输入两端越接近开路。在运放处于线性状态时,根据这个特性可以把两输入端视为等效开路,简称虚断。

1.5.1运放电路-电压比较器

电压比较器会比较同向输入端和反向输入端的电压值,然后输出高低电平的方式来体现,它是一个在开环状态下,就是没有负反馈的情况下用的这个状态。

  • 电压比较器:开环工作,非线性状态。利用运放的放大倍数无穷大,来进行数字化。同相输入电压更大输出VCC;反之输出GND。

这是电压比较器的作用,当+大于-的时候(只要大一点点),输出VCC,当-大于+的时候,输出GDN。 

1.5.2运放电路-反向放大器

反相放大器。根据“虚短”中间的电势都为0,根据“虚断”流经R1和R2的电流大小及方向都相同。依次推算出输入电压与输出电压的关系。

公式推导(反向放大器,利用集成运算放大器的虚短和虚断的特性分析):

反向放大器,输出为负的时候需要双电源。 

1.5.3运放电路-同向放大器

同向放大器。分析思路同上。

公式推导(正向放大器,利用集成运算放大器的虚短和虚断的特性分析):

1.5.4运放电路-电压跟随器

电压跟随器。主要用于提高电路的驱动能力。放大倍数为1时,虽然没有电压放大特性,但是可以放大功率。(提高信号的驱动能力)

1.6 DA的原理-T型电阻网络DA转换器

运放工作在负反馈状态,所以 I01 和 I02 所在的两个线上的电压都相当于接在GND上,这样就不会影响上面电阻网络的分压分流等状态。根据电阻的串并联状态,I7 ~ I0 的大小为公比为0.5的等比数列,即 I7 ~ I0 为位权。注意总电流 I=Verf/R,所以通过Rfb的电流大小就是I的 [D7~D0]/256 倍,并且这个输出精度就是256不可变。即,输出电压

当 Rfb = R 时

T型电阻网络DA转换器公式推导(负反馈的情境下) 

而开发板上搭载的是 PWM型DA转换器,下图14-9所示。注意这种电路结构相比于图14-8所示的电路结构来说,极大的节省端口且精度高,但缺点就是需要更多资源来产生PWM波,并且低通滤波器性能不好时平均电压还会自带纹波。

 1.7 AD的原理-逐次逼近型AD转换器

逐次逼近型AD转换器

AD转换的常见架构主要有积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型、压频变换型等。但目前最常用的是 逐次逼近型 的AD转换器:

端口说明在图14-3下已经介绍过。整个AD转换器的核心部件就是 “比较器” 和 “DAC”,针对外部输入的模拟电压,“DAC” 通过不断逼近这个输入电压,直到8位数字量全部试完(如二分法),便可认为当前DAC的数字量认为是外部模拟输入的数字量。该DAC的精度也就是内部DAC的位宽。即,输出的数字量为:

AD/DA的性能指标

  • 分辨率:指AD/DA数字量的精细程度,通常用位数表示。例如,对于5V电源系统来说,8位的AD分辨率为5V/256 = 0.01953125V。
  • 转换速度:表示AD/DA的最大采样/建立频率,通常用转换频率或者转换时间来表示,对于采样/输出高速信号,应注意AD/DA的转换速度

2. XPT2046

X2046芯片SPI时序

X2046电阻触摸屏芯片用的是SPI的通信时序。

​​​​​​​

  • 根据SPI时序图:时钟上升沿采样锁存数据,时钟下降沿发送数据。因为SPI是串行全双工的通信协议,所以对于SPI主机和从机都是在时钟上升沿采样锁存数据,时钟下降沿发送数据。
  • 当我们使用51单片机的I/O口来模拟SPI通信的时钟时序,已经模拟SPI的 DIN, DOUT 数据总线的数据采样和数据输出的时候,根据上一条的SPI通信时序要求:
    📚️当主机发送数据的时候,先在时钟低电平的时候将数据输出到MOSI总线上,然后时钟切换到高高电平产生时钟上升沿,在时钟上升沿的时候SPI从机进行数据的采样锁存。
    ​​​​​​​📚️当主机接收数据的时候,先产生时钟的下降沿,当SPI从机检测到时钟的下降沿的时候从机就会将数据输出到MISO总线上,此时主机在MISO总线上检测高低电平获取到从机发送的数据。

这就是使用51单片机的IO口来模拟SPI通信,进行SPI MOSI/MISO总线上主机发送数据和接收数据的时序模拟方式。

3. AD模拟到数字转换-源码编写

XPT2046电阻触摸屏芯片的命令字:

  • 起始位,第一位,即S位。控制字首位必须为1,即S=1
  • 地址,接下来的3位,多路选择器的现行通道
  • MODE,模式选择为,用于设置ADC的分辨率,Mode=0下一次抓换是12位模式,Mode=1下一次转换为8位模式。
  • SER/DFR,位控制参考源模式,选择单端模式(SER/DFR=1),或者差分模式(SER/DFR=0);在X坐标,Y作为和触摸压力测量中,为了达到最佳性能,首选差分模式。
    在我们使用的普中科技51单片机开发版电路原理图中它的X-, Y- 都直接接地了,所以使用的是单端模式。如果是差分模式,读取的就是X+和X-的两个值的差值。
  • PD0和PD1:内部掉电和参考电压配置的关系。

注意XPT内部有一个2.5V的参考电压,PD1=1时启用。但是为了满量程测量(5V),调用外部的参考电压(引脚VREF),所以PD1~PD0设置为00,此时满量程4095就代表5V。

最终我们选择的XPT2046命令字各位如下:

最终源码如下,这里只给出了 XPT2046.C, XPT2046.h, main.c 文件的源码,工程里引用到的LCD1602.c的源码和Delay.c的源码在之前的实验里已经有给出,也建议直接去下载江协特技提供的示例源码包,里面包含了每一个实验的源码。

XPT2046.c

#include <REGX52.H>
#include "XPT2046.h"
#include "Delay.h"


sbit XPT2046_CS=P3^5;
sbit XPT2046_DCLK=P3^6;
sbit XPT2046_DIN=P3^4;
sbit XPT2046_DOUT=P3^7;

unsigned int XPT2046_ReadAd(unsigned char Command)
{
	unsigned int ADValue = 0;
	unsigned char i;
	
	XPT2046_DCLK = 0;		//注意:在时序图里在CS=0之前DCLK已经为0
	XPT2046_CS = 0;
	
	/*发送*/
	for(i=0; i<8; i++){
		XPT2046_DIN = Command & (0x80 >> i); //高位优先,高位先发送
		XPT2046_DCLK = 1;	//时钟拉高,给一个时钟上升沿
		XPT2046_DCLK = 0;	//时钟拉低
	}
	
	
	/*接收*/
	for(i=0; i<16; i++){
		XPT2046_DCLK = 1;
		XPT2046_DCLK = 0;
		
		//Bilibili网站弹幕提到如果ADC值不能到254,需要再这里延时1ms
		Delay(1);
		
		if(XPT2046_DOUT)
			ADValue |= (0x8000 >> i); //高位优先,高位先接收
	}
	
	//当选择XPT2046 ADC转换的量程为8位的时候,我们读取的16位需要左移8位
	//当选择XPT2046 ADC转换的量程为12位的时候,我们读取的16位需要左移4位
	if(Command & 0x08)
		return (ADValue >> 8);
	else
		return (ADValue >> 4);
		
	return ADValue;
}

XPT2046.h

#ifndef __XPT2046_H__
#define __XPT2046_H__


#define XPT2046_XP_8		0x9C	//1001 1100
#define XPT2046_YP_8		0xDC	//1101 1100
#define XPT2046_VBAT_8		0xAC	//1010 1100
#define XPT2046_AUX_8		0xEC	//1110 1100

#define XPT2046_XP_12		0x94	//1001 0100
#define XPT2046_YP_12		0xD4	//1101 0100
#define XPT2046_VBAT_12		0xA4	//1010 0100
#define XPT2046_AUX_12		0xE4	//1110 0100

unsigned int XPT2046_ReadAd(unsigned char Command);

#endif

main.c 

#include <REGX52.H>
#include <INTRINS.H>
#include "LCD1602.h"
#include "Delay.h"
#include "XPT2046.h"

void main()
{
	unsigned int ADValue = 0;
	
	LCD_Init();
	LCD_ShowString(1,1,"ADJ NTC RG");
	
	
	
	
	while(1)
	{
		ADValue = XPT2046_ReadAd(XPT2046_XP_8);
		LCD_ShowNum(2,1, ADValue ,3);
		ADValue = XPT2046_ReadAd(XPT2046_YP_8);
		LCD_ShowNum(2,5, ADValue ,3);
		ADValue = XPT2046_ReadAd(XPT2046_VBAT_8);
		LCD_ShowNum(2,9, ADValue ,3);
		
		Delay(100);
	}
}

3.1 实验结果

实验实际结果如下

3.3 实验注意点

哔站弹幕提到的注意点:

最高192,且旋转出来的数字只有二的倍数的,在第二个for循环,XPT2046_DCLK=1;后面加上Delay(1);

4. DA数字到模拟转换-源码编写

PWM 型DA的的源码如下,

在本实验使用的普中科技51单片机开发板A2中,PWM DA使用的输入口是 P2^1.

main.c

#include <REGX52.H>
#include <INTRINS.H>
#include "time0.h"
#include "Nixie.h"
#include "key.h"
#include "delay.h"

sbit PWM_DA=P2^1;

unsigned char Compare = 0;
unsigned char KeyNum;

void main()
{
	unsigned int i = 0;
	
	Timer0_Init();		//定时器初始化
	P2 = 0xFF;
	
	for(i=0; i<100; i++)
	{
		Compare = i;
		Delay(10);		//每个亮度延时10ms,不要太快
	}
	for(i=100; i>0; i--)
	{
		Compare = i;
		Delay(10);		//每个亮度延时10ms,不要太快
	}

}

/**
  * @brief  定时器0中断处理函数模版
  * @param  无
  * @retval 无
  */
void Timer0_Routine(void) interrupt 1
{
	static unsigned int count = 0;
	
	count++;
	if(count < Compare){
		PWM_DA = 1;				//ULN2003输出低电平,电机转动
	}
	else{
		PWM_DA = 0;				//ULN2003输出高电平,电机停止
	}
	if(count >= 100)
		count = 0;
	
	//定时器溢出之后需要重新装载
	TH0 = 0xFF;					//50微秒@11.0592MHz
	TL0 = 0xD2; 				//定时器装载周期为50微秒
}

5. 结束

本实验至此结束

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例 基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例基于51单片机开发的小程序,学习资料,用于学习51单片机的嵌入式开发,应用案例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值