ARM篇九--ADC实验
一、前言
本篇使用华清远见的FS4412
开发板,进行ADC实验
,知识点包括:ADC知识原理、开发板ADC寄存器介绍、ADC编程,并通过开发板实验现象验证ADC。
二、准备工作
FS4412开发板
,我用的是华清远见的FS4412开发板- ubuntu下linux操作系统(包含交叉编译工具)
serial-com8
程序烧入执行工具- 开发板电路原理图、芯片手册
- 开发程序模板
开发板资料、交叉编译工具、程序烧入工具下载(包含教程)
开发板可选择到华清远见官网进行租赁。
工程模板文件下载
三、ADC原理
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)
;
四、开发板ADC实验电路
VDD1V8_EXT
最大电压是1.8v
,因此这个ADC电路的转换电压是0~1.8V
。
五、ADC配置寄存器
1、ADCCON寄存器
- 转换分辨率可以设置
12位
与10位
- 转换结束时,转换结束标志位自动置1
- 分频数设置只能在
19~255
之间,ADC最大转换时钟频率是5Mhz
,转换5次为成功转换一次,因此最短转换周期为1us。 - 使用单次转换模式时,一定要把连续转换模式关闭,单次转换模式转换一次后,该位自动变为0,需要重新置1,才能使用。
2、ADCDAT寄存器
- 该寄存器的
0~11位
是存储转换后的数据位,因此获取时要把其他位置0,防止数据受影响。
3、ADCMUX寄存器
- 该寄存器的
0~3
位是负责选择哪个通道。
六、ADC编程
程序功能:
电压在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 LED2_OFF GPX2.DAT &= (~(1 << 7))
#define LED3_ON GPX1.DAT |= (1 << 0)
#define LED3_OFF GPX1.DAT &= (~(1 << 0))
#define LED4_ON GPF3.DAT |= (1 << 4)
#define LED4_OFF GPF3.DAT &= (~(1 << 4))
#define LED5_ON GPF3.DAT |= (1 << 5)
#define LED5_OFF GPF3.DAT &= (~(1 << 5))
/**
* @description: 延时函数
* @param {unsigned int} i -递减的计数
* @return {*}
*/
void delay(unsigned int i)
{
while(i--);
}
/**
* @description: LED2、LED3、LED4、LED5初始化
* @param {*}
* @return {*}
*/
void LED_Init()
{
/* 配置LED2、LED3、LED4、LED5的引脚为输出模式 */
GPX2.CON |= (0x1 << 28);
GPX1.CON |= (0x1 << 0);
GPF3.CON |= (0x1 << 16);
GPF3.CON |= (0x1 << 20);
}
/**
* @description: ADC初始化
* @param {*}
* @return {*}
*/
void ADC_Init()
{
/* 配置ADC分辨率 12bit*/
ADCCON |= (1 << 16);
/* 打开分频器 */
ADCCON |= (1 << 14);
/* 配置分频系数 100,转换周期为 5/(100Mhz/100) = 5us*/
ADCCON = ADCCON & (~(0xFF << 6)) | (99 << 6);
/* 关闭低功耗模式 */
ADCCON &= (~(1 << 2));
/* 关闭连续转换模式 */
ADCCON &= (~(1 << 1));
/* 选择转换通道 */
ADCMUX = 0x3;
}
/**
* @description: 获取转化的电压
* @param {*}
* @return {*}
*/
unsigned int ADC_do()
{
unsigned int ADCvalue;
/* 打开单次转换模式 */
ADCCON |= 1;
/* 检查转换是否完成 */
while(!(ADCCON & (1 << 15)));
/* 接收数据 */
ADCvalue = ADCDAT & 0xFFF;
/* 转化数据,单位:mv,m*(1.8/2^12)*1000 */
ADCvalue *= 0.44;
return ADCvalue;
}
int main()
{
unsigned int ADCvalue;
ADC_Init();
LED_Init();
while(1)
{
ADCvalue = ADC_do();
if(ADCvalue <= 1800 && ADCvalue >= 1501)
{
LED2_ON;
LED3_ON;
LED4_ON;
LED5_ON;
}
else if(ADCvalue <= 1500 && ADCvalue >= 1001)
{
LED2_ON;
LED3_ON;
LED4_ON;
LED5_OFF;
}
else if(ADCvalue <= 1000 && ADCvalue >= 501)
{
LED2_ON;
LED3_ON;
LED4_OFF;
LED5_OFF;
}
else if(ADCvalue <= 500 && ADCvalue >0)
{
LED3_OFF;
LED4_OFF;
LED5_OFF;
LED2_ON;
delay(1000000);
LED2_OFF;
delay(1000000);
}
printf("ADCvalue =%dmv\n", ADCvalue);
}
return 0;
}
七、程序烧入与实验现象
1、程序烧入
1.输入make
生成.bin文件
2.将.bin文件
复制到共享文件夹
①
②
③
输入:
cp ARM_LED.bin /mnt/hgfs/cca
将文件复制到cc文件夹
3.打开serial-com8
,连接开发板(COM2
接口),烧入程序
①查看端口
②打开serial-com8设置
③接通开发板电源,迅速按enter
键,使其快速进入裸机模式。
④烧入程序
输入:
loadb 40008000
选择可执行文件烧入
烧入成功:
⑤执行程序
输入:
go 40008000
2、实验现象
到这里就结束啦!