MCU-51:单片机之AD模数转换与DA数模转换

一、AD/DA介绍

AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号
DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号
AD/DA转换打开了计算机与模拟信号的大门,极大的提高了计算机系统的应用范围,也为模拟信号数字化处理提供了可能
在这里插入图片描述

二、硬件电路模型

2.1 模型

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

2.2 硬件电路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、运算放大器

3.1 运算放大器介绍

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

在这里插入图片描述

3.2 运放电路

在这里插入图片描述
在这里插入图片描述

四、DA原理

4.1 T型电阻网络DA转换器:

在这里插入图片描述
在这里插入图片描述

4.2 PWM型DA转换器:

在这里插入图片描述
在这里插入图片描述

五、AD原理

逐次逼近型AD转换器:

在这里插入图片描述
在这里插入图片描述

六、AD/DA性能指标

分辨率:指AD/DA数字量的精细程度,通常用位数表示。例如,对于5V电源系统来说,8位的AD可将5V等分为256份,即数字量变化最小一个单位时,模拟量变化5V/256=0.01953125V,所以,8位AD的电压分辨率为0.01953125V,AD/DA的位数越高,分辨率就越高

转换速度:表示AD/DA的最大采样/建立频率,通常用转换频率或者转换时间来表示,对于采样/输出高速信号,应注意AD/DA的转换速度

七、XPT2046介绍

7.1 功能说明

在这里插入图片描述

7.2 XPT2046时序

在这里插入图片描述

八、代码演示

8.1 AD模数转换

main.c

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

unsigned int ADValue;

void main()
{
	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,6,ADValue,3);
		ADValue=XPT2046_ReadAD(XPT2046_VBAT_8);
		LCD_ShowNum(2,11,ADValue,3);
		Delay(10);
	}
}

XPT2406.c

#include <REGX52.H>

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

unsigned int XPT2046_ReadAD(unsigned char Command)
{
	unsigned char i;
	unsigned int ADValue=0;
	
	XPT2046_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;
	  if(XPT2046_DOUT){ADValue|=0x8000>>i;}
	}
	XPT2046_CS=1;
	if(Command&0x08)
	{
		return ADValue>>8;
	}
	else
	{
		return ADValue>>4;
	}
	
	
}

XPT2406.h

#ifndef __XPT2046_H__
#define __XPT2046_H__

#define XPT2046_XP_8  0x9C
#define XPT2046_YP_8  0xDC
#define XPT2046_VBAT_8  0xAC
#define XPT2046_AUX_8  0xEC

#define XPT2046_XP_12  0x94
#define XPT2046_YP_12  0xD4
#define XPT2046_VBAT_12  0xA4
#define XPT2046_AUX_12  0xE4

unsigned int XPT2046_ReadAD(unsigned char Command); 

#endif

8.2 DA数模转换

main.c

#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Timer0.h"

sbit DA=P2^1;

unsigned char Counter,Compare;
unsigned char i;

void main()
{
	Timer0_Init();

	while(1)
	{
		for(i=0;i<100;i++)
		{
			Compare=i;
			Delay(10);
		}
		for(i=100;i>0;i--)
		{
			Compare=i;
			Delay(10);
		}
	}
}

注意:一定要看

千万不要直接复制代码,因为是模块化编写,模块的代码没有往上复制(模块的代码在以往的文章中可以找到),大家一定要自己动手,跟着视频学!!!!!

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
生成锯齿波可以使用单片机DA转换器。下面是一个基于STM32F103C8T6的示例代码,可以生成一个简单的锯齿波: ```c #include "stm32f10x.h" #define SAWTOOTH_LENGTH 1000 // 锯齿波的周期长度 #define DAC_MAX_VALUE 4095 // DAC转换器的最大值 int main(void) { // 初始化GPIO口 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // DAC输出引脚为PA4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入模式 GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化DAC DAC_InitTypeDef DAC_InitStructure; DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; // 不使用触发器 DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; // 输出缓冲器使能 DAC_Init(DAC_Channel_1, &DAC_InitStructure); // 初始化DAC通道1 // 启动DAC DAC_Cmd(DAC_Channel_1, ENABLE); // 生成锯齿波 while (1) { for (int i = 0; i < SAWTOOTH_LENGTH; i++) { DAC_SetChannel1Data(DAC_Align_12b_R, i * DAC_MAX_VALUE / SAWTOOTH_LENGTH); // 设置DAC输出值 delay(1); // 等待一段时间,控制输出频率 } } } void delay(int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < 1000; j++); } } ``` 在上述代码中,我们使用了STM32的DAC通道1,通过改变DAC输出值,可以生成不同的锯齿波形。我们使用一个for循环来控制输出的频率和周期,每次循环通过DAC_SetChannel1Data函数来设置DAC输出值。其中,i * DAC_MAX_VALUE / SAWTOOTH_LENGTH的计算结果就是当前的DAC输出值,通过改变i的值可以生成不同的锯齿波形。 需要注意的是,DAC的输出值是一个0-4095的数字量,对应的是0-3.3V的模拟电压。因此,在使用锯齿波时需要注意输出电压的范围和波形的形状。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello xiǎo lěi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值