D9-19ADC实验

目录

19.1ADC简介

19.2Exynos4412下的ADC控制器

19.3ADC寄存器

19.4ADC编程

作业


19.1ADC简介

ADC(Analog to Digital Converter)即模数转换器,指一个能将模拟信号转化为数字信号的电子元件。

ADC主要参数:分辨率    

ADC的分辨率一般以输出二进制数的位数来表示,当最大输入电压一定时,位数越高,分辨率越高; n位的ADC能区分输入电压的最小值为满量程输入的1/2^n;

比如一个12位的ADC,最大输入电压为1.8v,那么该ADC能区分的最小电压为1.8v/2^12≈0.00044v,

因此,当转换的结果为m时,则实际的电压值为m*(1.8v/2^12);

自我理解:相当于每变化0.00044v,二进制变加或减1。

19.2Exynos4412下的ADC控制器

蓝色旋钮-电位器-滑动变阻器

《FS4412-DevBoard-V5》

《FS4412_CoreBoard_V2》 

这4个引脚是专用引脚,供VDD_18_ADC,无其他功能

《4412手册》

 

模拟输入电压范围0-1.8V,

19.3ADC寄存器

 

PRSCEN:分频器开关

PRSCVL:极限转换速度5MHz,分频时小于此值。范围19-255

STANDBY:待机模式选择。置0正常,置1低功耗模式

0-1位设置AD什么时候开始转换,两种转换方式。

READ_START:读完上次结果开始下一次AD转换,

ENABLE_START:置1时,开始一次AD转换,转换后该位自动置0.初始化时不设置,需要转化时设置。

最高精度12位,故只用12位。存储转换结果的寄存器,读取时将高20位清零,防止影响读取结果。

 总共4个通道,选一个

1.4ADC编程


#include "exynos_4412.h"

int main()
{
	unsigned int AdcValue;

	/*设置ADC精度为12bit,第16位置1*/
	ADCCON = ADCCON | (1 << 16);
	/*使能ADC分频器,第14位置1*/
	ADCCON = ADCCON | (1 << 14);
	/*设置ADC分频值 ADC时钟频率=PLCK/(19+1)=5MHZ ADC转换频率=5MHZ/5=1MHZ*/
    /*刚上电时,默认是0xFF,先清零第6-13位,再放入19*/
	ADCCON = ADCCON & (~(0xFF << 6)) | (19 << 6);
	/*关闭待机模式,使能正常模式,第2位置0*/
	ADCCON = ADCCON & (~(1 << 2));
	/*关闭通过读使能AD转换*/
    /*第0位转换时设置*/
	ADCCON = ADCCON & (~(1 << 1));
	/*选择转换通道,3通道*/
	ADCMUX = 3;

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

	}
	return 0;
}

作业

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--);
}
int main()
{
	unsigned int AdcValue;

	/*设置ADC精度为12bit,第16位置1*/
	ADCCON = ADCCON | (1 << 16);
	/*使能ADC分频器,第14位置1*/
	ADCCON = ADCCON | (1 << 14);
	/*设置ADC分频值 ADC时钟频率=PLCK/(19+1)=5MHZ ADC转换频率=5MHZ/5=1MHZ*/
    /*刚上电时,默认是0xFF,先清零第6-13位,再放入19*/
	ADCCON = ADCCON & (~(0xFF << 6)) | (19 << 6);
	/*关闭待机模式,使能正常模式,第2位置0*/
	ADCCON = ADCCON & (~(1 << 2));
	/*关闭通过读使能AD转换*/
    /*第0位转换时设置*/
	ADCCON = ADCCON & (~(1 << 1));
	/*选择转换通道,3通道*/
	ADCMUX = 3;

    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]

	while(1)
	{
		/*开始转换,设置第0位为1*/
		ADCCON = ADCCON | 1;
		/*等待转换完成,看15位是1还是0*/
		while(!(ADCCON & (1 << 15)));
		/*读取转换结果,低12位*/
		AdcValue = ADCDAT & 0xFFF;
		/*将结果转换成实际的电压值mv,0.44=1800/4096*/
		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((AdcValue>1500)&(AdcValue<=1800))
        {
            /*LED2、LED3、LED4、LED5点亮*/
            LED2_ON;
			LED3_ON;
			LED4_ON;
			LED5_ON;
        }
     
	}
	return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值