D19. ADC实验-ARM体系结构与接口技术-嵌入式学习LV9

DAY19.ADC实验

如果出现图片无法查看可能是网络问题,我用的GitHub+图床保存的图片,可以参考我另外一篇文章GitHub的使用方法含网络问题解决
GitHub使用教程含网络问题_github加速器_肉丸子QAQ的博客-CSDN博客


相关作业和资料已上传,请在主页自行查看

1. ADC简介

ADC ADC(Analog to Digital Converter)

模数转换器:指一个能将模拟信号转化为数字信号的电子元件

image-20230817110235643

CPU只能处理数字信号

ADC主要参数

ADC的分辨率一般以输出二进制数的位数来表示,当最大输入电压一定时,位数越高,分辨率越高; n位的ADC能区分输入电压的最小值为满量程输入的1/2^n; 比如一个12位的ADC,最大输入电压为1.8v,那么该ADC能区分的最小电压为1.8v/212≈0.00044v,当转换的结果为m时,则实际的电压值为m*(1.8v/212);

2. 4412下的ADC控制器

板子上蓝色箭头旋钮就是电位器

原理图:

image-20230817201729755

引脚:

image-20230817201903413

从原理图能看到这几个引脚是专用的,没有其他功能,在程序上能直接用

image-20230817202149781

  • 精度可选,10/12位

  • 5MHZ下以每秒钟转换1M

  • 0-1.8v

image-20230817202541363
  • ADC转换频率

  • ADC转换时间

3. ADC寄存器详解

image-20230817203219138

ADCCON寄存器

ADC控制寄存器,32位

image-20230817204415832

ADCDLY 寄存器

ADC延迟,本次实验不用

image-20230817204515600

ADCDAT寄存器

存储转换结果,32位,只用12位

image-20230817204623273

只读,需要注意的是,读取的时候要把没用到的位清零

CLRINTADC寄存器

ADC中断,本次不用

image-20230817204753574

ADCMUX寄存器

选择转换通道

image-20230817204941354

image-20230817204947875

为什么需要这个寄存器,是因为4412内部只有一个ADC转换器,通过分时复用,不能同时转换

4. ADC编程

#include "exynos_4412.h"

int main()
{
	unsigned int AdcValue;

	/*设置ADC精度为12bit*/
	ADCCON = ADCCON | (1 << 16);
	/*使能ADC分频器*/
	ADCCON = ADCCON | (1 << 14);
	/*设置ADC分频值 ADC时钟频率=PLCK/(19+1)=5MHZ ADC转换频率=5MHZ/5=1MHZ*/
	ADCCON = ADCCON & (~(0xFF << 6)) | (19 << 6);
	/*关闭待机模式,使能正常模式*/
	ADCCON = ADCCON & (~(1 << 2));
	/*关闭通过读使能AD转换*/
	ADCCON = ADCCON & (~(1 << 1));
	/*选择转换通道,3通道*/
	ADCMUX = 3;

	while(1)
	{
		/*开始转换*/
		ADCCON = ADCCON | 1;
		/*等待转换完成*/
		while(!(ADCCON & (1 << 15)));
		/*读取转换结果*/
		AdcValue = ADCDAT & 0xFFF;
		/*将结果转换成实际的电压值mv*/
		AdcValue = AdcValue * 0.44;
		/*打印转换结果*/
		printf("AdcValue = %dmv\n",AdcValue);

	}
	return 0;
}

5. 作业

1.编程实现通过LED状态显示当前电压范围

注:

电压在1501mv~1800mv时,LED2、LED3、LED4、LED5点亮
电压在1001mv~1500mv时,LED2、LED3、LED4点亮
电压在501mv~1000mv时,LED2、LED3点亮
电压在0mv~500mv时,LED2闪烁

#include "exynos_4412.h"
#define LED2_ON    GPX2.DAT |= (1 << 7)
#define LED3_ON    GPX1.DAT |= 1
#define LED4_ON   GPF3.DAT |= (1 << 4) 
#define LED5_ON   GPF3.DAT |= (1 << 5) 
#define LED2_OFF   GPX2.DAT &= (~(1 << 7))
#define LED3_OFF   GPX1.DAT &= (~1)
#define LED4_OFF   GPF3.DAT &= (~(1 << 4))
#define LED5_OFF   GPF3.DAT &= (~(1 << 5))
void Delay(int time){
	    while (time--);
}


void LED_INIT(void)
{
	GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);//7[31:28]
	GPX1.CON = GPX1.CON & (~(0xF)) | (0x1);//1[3:0]
	GPF3.CON = GPF3.CON & (~(0xFF << 16)) | (0x11 << 16);//4[19:16]5[23:20]

}
void ADC_INIT(void)
{
	/*设置ADC精度为12bit*/
	ADCCON = ADCCON | (1 << 16); //或置1,与置0
	/*使能ADC分频器*/
	ADCCON = ADCCON | (1 << 14);
	/*设置ADC分频值 ADC时钟频率=PLCK/(PLCK19+1)=5MHZ ADC转换频率=5MHZ/5=1MHZ*/
	ADCCON = ADCCON & (~(0xFF << 6)) | (19 << 6);
	/*关闭待机模式,使能正常模式*/
	ADCCON =ADCCON & (~(1 << 2));
	/*关闭通过读使能AD转换*/
	ADCCON = ADCCON & (~(1 << 1));
	/*选择转换通道,3通道*/
	ADCMUX = 3;
}
int main()
{
	unsigned int AdcValue;
	ADC_INIT();
	LED_INIT();
	while(1)
	{
		/*开始转换*/
		ADCCON = ADCCON | 1;
		/*等待转换完成*/
		while(!(ADCCON & (1 << 15)));
		/*读取转换结果*/
		AdcValue = ADCDAT & 0xFFF;
		/*将结果转换成实际的电压值mv*/
		AdcValue = AdcValue * 0.44;
		/*打印转换结果*/
		printf("AdcValue = %dmv\n",AdcValue);
		if((AdcValue>0)&(AdcValue<=500))
		{
			/*LED2闪烁*/
			LED3_OFF;
			LED4_OFF;
			LED5_OFF;
			LED2_ON;
			Delay(1000000);
			LED2_OFF;
			Delay(1000000);
		}
		else if((AdcValue>500)&(AdcValue<=1000))
		{
			/*LED2
			 * ,LED3点亮*/
			LED3_OFF;
			LED4_OFF;
			LED5_OFF;
			LED2_ON;
			LED3_ON;
		}
		else if((AdcValue>1000)&(AdcValue<=1500))
		{           
			/*LED2、LED3、LED4点亮*/
			LED5_OFF;
			LED2_ON;
			LED3_ON;
			LED4_ON;
		}

		else if((AdcValue>1500)&(AdcValue<=1800))
		{
			LED2_ON;
			LED3_ON;
			LED4_ON;
				LED5_ON;
		}

	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肉丸子QAQ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值