ADC实验

1.ADC简介

ADC(Analog to Digital Converter)即模数转换器,指一个能将模拟信号转化为数字信号的电子元件
在这里插入图片描述
ADC主要参数:
(1)分辨率
ADC 的分辨率是指对于允许范围内的模拟信号,它能输出离散数字信号值的个数。这些信号值通常用二进制数来存储,因此分辨率经常用比特作为单位,且这些离散值的个数是 2 的幂指数。例如:12 位 ADC 的分辨率就是 12 位,或者说分辨率为满刻度的 1/(2^12)。一个 10V 满刻度的 12 位 ADC 能分辨输入电压变化最小值是10V×1/(2 12)=2.4mV
在这里插入图片描述

(2)转换误差
转换误差通常是以输出误差的最大值形式给出。它表示 A/D 转换器实际输出的数字量和理论上的输出数字量之间的差别。常用最低有效位的倍数表示。例如给出相对误差≤±LSB/2,这就表明实际输出的数字量和理论上应得到的输出数字量之间的误差小于最低位的半个字。
(3)转换速率
ADC 的转换速率是能够重复进行数据转换的速度,即每秒转换的次数。而完成一次 A/D 转换所需的时间(包括稳定时间),则是转换速率的倒数。

ADC 转换原理
AD 转换器(ADC)将模拟量转换为数字量通常要经过 4 个步骤:采样、保持、 量化和编码。所谓采样即是将一个时间上连续变化的模拟量转换为时间上离散变化的模拟量。如下图所示:
在这里插入图片描述
将采样结果存储起来,直到下次采样,这个过程叫做保持。一般采样器和保持电路一起总称为采样保持电路。将采样电平归化为与之接近的离散数字电平,这个过程叫做量化。将量化后的结果按照一定数制形式表示就是编码。将采样电平(模拟值)转换为数字值时,主要有两类方法:直接比较型与间接比较型。
–直接比较型:就是将输入模拟信号直接与标准的参考电压比较,从而得到数字量。常见的有并行 ADC 和逐次比较型 ADC。
–间接比较型:输入模拟量不是直接与参考电压比较,而是将二者变为中间的某种物理量在进行比较,然后将比较所得的结果进行数字编码。常见的有双积分型 ADC

2.Exynos4412下的ADC控制器

在这里插入图片描述

ADC概述
10位或12位CMOS模拟到数字转换器(ADC)包括4通道模拟输入。它通过5MHz A/D转换器时钟,以最大转换率为1MSPS,将模拟输入信号转换为10位或12位二进制数字码。A/D转换器具有片上采样和保持功能。ADC支持低功耗模式。

电机控制用ADC的主要特点
ADC包括以下特性:

  1. 分辨率:10位/12位(可选)
  2. 微分非线性误差:2.0 LSB(最大值)
  3. 积分非线性误差:4.0 LSB(最大值)
  4. 顶部偏移错误: 0 ~ + 55 LSB
  5. 底部偏移错误: 0 ~ - 55 LSB
  6. 最大转换率:1 MSPS
  7. 低功耗
  8. 电源电压:1.8V(类型),1.0V(类型,数字输入/输出接口)
  9. 模拟输入范围:0 ~ 1.8V

在这里插入图片描述
A/D转换时间
当APB总线时钟(PCLK)频率为66MHz,预计算器值为65时,总12位转换时间如下。
A/D转换器的频率 = 66MHz/(65+1)= 1MHz
转换时间=1/(1MHz/5周期)=1/200 kHz=5us
注意:这个A/D转换器被设计为运行在最大5MHz时钟,所以转换率可以达到1MSPS。

ADC转换模式
此模式的操作与AIN0~AIN3相同。要初始化此模式,请设置ADCCON(ADC控制寄存器)。转换后的数据可以从ADCDAT(ADC转换数据寄存器)

编程说明
1.A/D转换数据可以通过中断或轮询方法访问。利用中断方法,从A/D转换器启动到转换数据读取的总转换时间可能会延迟,因为中断服务例程的返回时间和数据访问时间。使用轮询方法,要确定ADCDATXn寄存器的读取时间,请检查ADCCONn[15]-- 转换结束标志 一bit
2.A/D转换可以以不同的方式被激活。ADCCONn[1] - A/D转换后,开始读调制解调器设置为1。当读取转换后的数据时,A/D转换同时开始。

2.1 寄存器描述

在这里插入图片描述
(1) ADCCON (ADC Control Register)
在这里插入图片描述
(2) ADCDAT (ADC Conversion Data Register)
在这里插入图片描述
(3) ADCMUX (ADC Channel Mux Register)
在这里插入图片描述

3.ADC编程

#include "exynos_4412.h"

void delay(unsigned int Time);
void ADC_Init(void);
void init_gpio(void);
int main()
{
	unsigned int ADC_val = 0;
	ADC_Init();
	init_gpio();
	while(1){

		ADCCON = ADCCON | 1;
		while(!(ADCCON & (1<<15)));
		ADC_val = ADCDAT & (0xfff);
		ADC_val = ADC_val * 0.44;
		if(ADC_val >= 1501){
			GPX2.DAT = GPX2.DAT | (1<<7);           //led2点亮
	//		delay(1000000);
			GPX1.DAT = GPX1.DAT | (1<<0);           //led3点亮
	//		delay(1000000);
			GPF3.DAT = GPF3.DAT | (1<<4);           //led4点亮
	//		delay(1000000);
			GPF3.DAT = GPF3.DAT | (1<<5);           //led5点亮
	//		delay(1000000);
		}else if(ADC_val >= 1001){
			GPF3.DAT = GPF3.DAT & (~(1<<5));
	//		delay(1000000);
			GPX2.DAT = GPX2.DAT | (1<<7);           //led2点亮
	//		delay(1000000);
			GPX1.DAT = GPX1.DAT | (1<<0);           //led3点亮
	//		delay(1000000);
			GPF3.DAT = GPF3.DAT | (1<<4);           //led4点亮
	//		delay(1000000);
		//	GPF3.DAT = GPF3.DAT | (1<<5);           //led5点亮
		}else if(ADC_val >= 501){
			GPF3.DAT = GPF3.DAT & (~(1<<4));
	//		delay(1000000);
			GPF3.DAT = GPF3.DAT & (~(1<<5));
	//		delay(1000000);
			GPX2.DAT = GPX2.DAT | (1<<7);           //led2点亮
	//		delay(1000000);
			GPX1.DAT = GPX1.DAT | (1<<0);           //led3点亮
	//		delay(1000000);
	//		GPF3.DAT = GPF3.DAT | (1<<4);           //led4点亮
	//		GPF3.DAT = GPF3.DAT | (1<<5);           //led5点亮
		}else if(ADC_val >= 0){
			GPF3.DAT = GPF3.DAT & (~(1<<4));
	//		delay(1000000);
			GPF3.DAT = GPF3.DAT & (~(1<<5));
	//		delay(1000000);
			GPX1.DAT = GPX1.DAT & (~(1<<0));
	//		delay(1000000);
			GPX2.DAT = GPX2.DAT | (1<<7);           //led2点亮
	//		delay(1000000);
//			GPX1.DAT = GPX1.DAT | (1<<0);           //led3点亮
//			GPF3.DAT = GPF3.DAT | (1<<4);           //led4点亮
//			GPF3.DAT = GPF3.DAT | (1<<5);           //led5点亮

		}
		printf("ADC_val=%dmv\n",ADC_val);
	}

	return 0;
}
void delay(unsigned int Time)
{
	while(Time--);
}

void ADC_Init(void)
{
	/*将ADC精度设为12位*/
	ADCCON = ADCCON | (1 << 16);
	/*使能ADC分频器*/
	ADCCON = ADCCON | (1 << 14);
	/*设置ADC的分频值  ADC时钟频率=pclk/(19+1)=5MHZ  ADC的转换频率=5/5=1MHZ*/
	ADCCON = ADCCON & (~(0xff << 6)) | (19 << 6);
	/*关闭待机模式,使能正常工作*/
	ADCCON = ADCCON & (~(1 << 2));
	/*关闭通过读使能AD转换*/
	ADCCON = ADCCON & (~(1 << 1));
	/*选择转换通道3*/
	ADCMUX = 3;
	return ;
}
void init_gpio(void)
{
	GPX2.CON = GPX2.CON & (~(0xf<<28)) | (0x1<<28);
	GPX1.CON = GPX1.CON & (~(0xf<<0)) | (0x1<<0);
	GPF3.CON = GPF3.CON & (~(0xf<<16)) | (0x1<<16);
	GPF3.CON = GPF3.CON & (~(0xf<<20)) | (0x1<<20);
	return;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zigbee ADC(模拟数字转换)实验是一种基于Zigbee通信技术的数据采集实验。在该实验中,使用Zigbee无线模块与传感器进行无线通信,将传感器采集的模拟信号转换为数字信号,并通过Zigbee无线模块传输到接收端进行处理和分析。 该实验的步骤如下: 1. 准备实验材料:Zigbee无线模块、传感器、电源、Arduino单片机等。 2. 搭建实验平台:将传感器连接到ADC输入引脚,将ADC输出引脚连接到Arduino单片机,然后将Zigbee无线模块连接到Arduino MCU的串口。 3. 编写程序:使用Arduino开发环境编写程序,读取ADC输入引脚上的模拟信号,并通过串口将数字信号发送给Zigbee模块。 4. 配置Zigbee模块:设置Zigbee模块的通信参数,包括波特率、通道、地址等。 5. 实施实验:给传感器提供电源并触发数据采集,Arduino单片机将模拟信号转换为数字信号,并通过Zigbee模块发送到接收端。 6. 数据接收与分析:在接收端使用Zigbee模块接收数据,并使用相应的程序进行数据解析、分析和展示。 通过该实验,可以实现无线传感器网络中的数据采集和远程监测。此外,由于Zigbee协议具有低功耗和可靠性等特点,该实验还可以探讨无线传感器网络在节能和环境监测等领域的应用。 总之,Zigbee ADC实验是一种利用Zigbee技术进行无线数据采集的实验,通过该实验可以实现传感器信号的无线传输和远程监测,具有广泛的应用前景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值