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
    评论
ESP32-WROOM-32D是一款集成了WiFi和蓝牙功能的低功耗芯片模块,其引脚分布和功能如下: 1. GND(引脚1):地,用于提供模块的电源接地。 2. 3.3V(引脚2):电源输入,用于接入3.3V的电源供应。 3. EN(引脚3):模块使能引脚,高电平使模块工作,低电平使其进入待机模式。 4. VP(引脚4):读视频数据引脚(未使用)。 5. D2(引脚5):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 6. D3(引脚6):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 7. CMD(引脚7):SPI总线的命令线。 8. CLK(引脚8):SPI总线的时钟线。 9. SD0(引脚9):SPI总线的数据线。 10. SD1(引脚10):SPI总线的数据线。 11. SD2(引脚11):SPI总线的数据线。 12. SD3(引脚12):SPI总线的数据线。 13. GND(引脚13):地。 14. VDD_SDIO(引脚14):SDIO卡和WiFi模块的电源引脚。 15. MTDO(引脚15):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 16. MTCK(引脚16):调试时的串行TAP控制引脚。 17. MTDI(引脚17):进入Flash Boot模式的引脚。 18. MTMS(引脚18):调试时的串行TAP数据引脚。 19. TXD0(引脚19):UART0的发送引脚。 20. RXD0(引脚20):UART0的接收引脚。 21. TXD1(引脚21):UART1的发送引脚。 22. RXD1(引脚22):UART1的接收引脚。 23. D23(引脚23):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 24. D22(引脚24):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 25. D21(引脚25):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 26. D19(引脚26):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 27. D18(引脚27):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 28. D5(引脚28):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 29. D17(引脚29):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 30. D16(引脚30):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 31. D4(引脚31):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 32. D0(引脚32):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 33. D2(引脚33):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 34. D15(引脚34):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 35. D13(引脚35):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 36. D12(引脚36):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 37. D14(引脚37):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 38. D27(引脚38):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 39. D26(引脚39):GPIO引脚,可以用作通用输入/输出或特定功能的引脚。 通过连接与这些引脚相应的电路,我们可以实现不同的功能,如UART通信、SPI通信、控制外部模块的输入输出等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肉丸子QAQ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值