ADC,就是模数转换器,什么是模数转换器?

模数转换器,在电子技术中即是将模拟信号转换成数字信号,也称为数字量化。

当然还有一种叫DAC,就是数模转换,意思相反,即是将数字信号转换成模拟信号。

在友善之臂ARM-contexA9这款开发板上的4412芯片本身就自带了一个ADC的接口,我们来看看基本介绍:

数据手册开篇介绍了这么多,最有用的一句话:精度10位或12位CMOS模数转换器(ADC)包括多路模拟输入。灵敏度为1M,一共有4路输入,支持较低的电源模式等。

接下来我们还是跟以前一样:

1、先看电路原理图:

从原理图和核心板上可以看出可调电阻的IO对应数据手册的是AIN[0]。

2、看数字手册相关的寄存器

(1)ADC控制寄存器

寄存器的地址为:0x126C0000

在这里,我们要如何配置呢?

[0] 第0位:判断A/D转换有没有开始

[2] 第2位:配置模式位(正常的,标准的,我们这里选择默认为0)

[6:13]第6~13位:这里要配置预分频系数,我们配置为49,对应的公式就是:ADCCLK=PCLK/(49+10)=100MHZ / 50 =2MHZ

[14]第14位:选择使能预分频,写1到这个位去就可以了

[15]第15位:判断A/D转换结束了没有

[16]第16位:设置转换的精度(10或者12,自己选)

(2)ADC数据寄存器



基地址:0x126C000C

[11:0] 第0~11位:ADC转换的数据

(2)ADC通道选择寄存器



基地址:0x12C001C

ADCMUX[0:3]:这里我们配置为0000,也就是通道0

3、写代码

config.h

<span style="font-size:18px;">#ifndef	__CONFIG_H__
#define __CONFIG_H__

#define udelay	((void (*)(unsigned int ))0x43e25e88)     //定义udelay在uboot中的地址,这样我们就可以使用这个函数
#define print	((int (*)(const char *, ...))0x43e11434)  //定义printf在uboot中的地址

typedef unsigned int u32;
typedef volatile u32 v32;
//设置位
#define set_one(reg, bit)	\
				((*(v32 *)reg) |= (1<<bit))
#define set_zero(reg, bit)	\
				((*(v32 *)reg) &= (~(1<<bit)))
#define set_bit(reg, bit, val)	\
				(*(v32 *)reg = (((*(v32 *)reg) & (~(1<<bit))) | (val << bit)))
#define set_2bit(reg, bit, val)	\
				(*(v32 *)reg = (((*(v32 *)reg) & (~(3<<bit))) | (val << bit)))
#define set_nbit(reg, bit, n, val)	\
				(*(v32 *)reg = (((*(v32 *)reg) & (~( ((1<<n)-1) <<bit))) \
									| (val << bit)))
#define set_val(reg, val)	\
				((*(v32 *)reg) = val)

#define get_bit(reg, bit)	\
				(((*(v32 *)reg) & (1<<bit)) >> bit)
#define get_2bit(reg, bit)	\
				(((*(v32 *)reg) & (3<<bit)) >> bit)
#define get_nbit(reg, bit, n)	\
				(((*(v32 *)reg) & (((1<<n)-1) <<bit)) >> bit)
#define get_val(reg)		\
				(*(v32 *)reg)

#endif</span>

adc.h

<span style="font-size:18px;">#ifndef	__ADC_H__
#define __ADC_H__

#define ADCCON 0x126C0000     //ADC控制寄存器
#define ADCDAT 0x126C000C     //ADC数据寄存器
#define ADCMUX 0x126C001C     //ADC通道寄存器
#define CLRINTADC	0x126C0018  //清除ADC中断

#endif</span>

adc.c

<span style="font-size:18px;">#include <adc.h>
#include <config.h>

void select_mux(void)
{
	set_nbit(ADCMUX, 0, 4, 0x0);   //设置通道为通道0
}

void adc_init(void)
{
	set_val(ADCCON, ((1<<16)|(1<<14)|(49<<6)));	//按照数据手册参数来配置adc控制寄存器的初始化部分
}

void adc_start(void)
{
	set_one(ADCCON, 0);   //adc转换开始的配置,默认参数为0
}

int adc_wait_flag(void)
{
	return get_bit(ADCCON, 15);<span style="white-space:pre">	</span>//AD转换是否成功
}

int adc_data(void)
{
	return get_nbit(ADCDAT, 0, 12); //获取ADC数据
}	

void clear_adc(void)
{
	set_val(CLRINTADC, 0);<span style="white-space:pre">	</span>//清ADC
}</span>

main.c

<span style="font-size:18px;">#include <config.h>
#include <adc.h>
int main(void)
{
	//设置ADC通道为通道0
	select_mux();
	//adc初始化
	adc_init();
	//adc转换开始
	adc_start();
	while(1)
	{
		//判断是否已经转换
		if(adc_wait_flag())
		{
			//打印相应的数据
			print("data = %d\n",adc_data());
			//重新adc转换开始
			adc_start();
		}
	}
	return 0;
}</span>

4、makefile略

5、观察结果

先让uboot启动



然后用dnw下载程序:



最后旋转电阻观察数据变化:



基于友善之臂ARM-ContexA9-ADC驱动开发的更多相关文章

  1. 基于DM642 RAW采集格式的视频驱动开发及应用

    摘 要:为解决C64X系列数字信号处理器(DSP)视频驱动不能应用于原始数据格式(RAW)采集格式的问题,设计了DM642和电耦合元件(CCD)高清传感器的数据传输接口,并分析.修改用于标准格式的视频 ...

  2. 手把手教你从零实现Linux misc设备驱动一(基于友善之臂4412开发板)

    关于怎样来写一个misc设备,在前面有篇文章已经介绍了大致的流程,如今就让我们来实现一个最简单的misc设备驱动. http://blog.csdn.net/morixinguan/article/d ...

  3. 手把手教你写Linux设备驱动---中断(三)--workqueue实现(基于友善之臂4412开发板) 【转】

    转自:http://blog.csdn.net/morixinguan/article/details/69680909 上节,我们讲到如何来实现tasklet小任务机制 http://blog.cs ...

  4. 基于友善之臂ARM-tiny4412--uboot源码分析

    /* * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core * * Copyright (c) 2004 Texas Instrument ...

  5. 基于友善之臂ARM-tiny4412--uboot源代码分析

    /* * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core * * Copyright (c) 2004 Texas Instrument ...

  6. ARM&Linux 下驱动开发第二节

    驱动文件:qudong.c,make生成qudong.ko文件,烧录到ARM板上 #include<linux/init.h> #include<linux/module.h> ...

  7. ARM&Linux 下驱动开发第三节

    后台驱动代码如下:比较昨天的,添加了读写指针位置移动操作 #include<linux/init.h> #include<linux/module.h> #include< ...

  8. ARM&Linux 下驱动开发第一节(小试牛刀)

    #include<linux/init.h> #include<linux/module.h> static int __init hello_init(void) { pri ...

  9. 【6集iCore3_ADP触摸屏驱动讲解视频】6-2 基于FSMC总线的ARM与FPGA通信

    视频简介: 该视频介绍基于FSMC总线的ARM与FPGA通信   源视频包下载地址: 链接:http://pan.baidu.com/s/1slJDoQD 密码:tmw7   银杏科技优酷视频发布区: ...

随机推荐

  1. Android 网络图片加载之cude 框架

    偶然发现了这个框架,阿里图片加载用的这个框架.非常简单操作步骤. 1.首先下载软件包,直接搜Cube ImageLoader 这个. 2.加入jar文件 3.使用前的配置: public class ...

  2. webstorm工具使用详解

    webstorm简单介绍 官网地址:http://www.jetbrains.com/webstorm/features/index.html 参考地址:http://www.html5jscss.c ...

  3. Nginx的负载均衡 - 一致性哈希 (Consistent Hash)

    Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd 算法介绍 当后端是缓存服务器时,经常使用一致性哈希算法来进行负载均衡. 使用一致性哈希的好处在于,增减 ...

  4. FORM当前状态分析

     变量  SYSTEM.RECORD_STATUS 确定当前记录状态.有四种返回值:CHANGED表示记录从数据库取来,并且该记录至少一个基表列被更新:INSERT表示给一个非取自数据库记录的基表 ...

  5. 【环境配置】配置maven

    Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Maven 的缺 ...

  6. 海量并发的无锁编程 (lock free programming)

    最近在做在线架构的实现,在线架构和离线架构近线架构最大的区别是服务质量(SLA,Service Level Agreement,SLA 99.99代表10K的请求最多一次失败或者超时)和延时.而离线架 ...

  7. 【java线程系列】java线程系列之线程间的交互wait()/notify()/notifyAll()及生产者与消费者模型

    关于线程,博主写过java线程详解基本上把java线程的基础知识都讲解到位了,但是那还远远不够,多线程的存在就是为了让多个线程去协作来完成某一具体任务,比如生产者与消费者模型,因此了解线程间的协作是非 ...

  8. ajax post请求request.getParameter("")取值为null

    今天在写提交一个json数据到后台,然后后台返回一个json数据类型.但是发现后台通过request.getParamter("")取到的值为null. 于是写一个简单的ajax ...

  9. UNIX网络编程——网络层:IP

    一.IP数据报格式 IP数据报格式如下: 版本:IP协议版本号,长度为4位,IPv4此字段值为4,IPv6此字段值为6 首部长度:以32位的字为单位,该字段长度为4位,最小值为5,即不带任何选项的IP ...

  10. [GitHub]第八讲:GitHub Pages

    Github Pages 是 github 公司提供的免费的静态网站托管服务,用起来方便而且功能强大,不仅没有空间限制,还可以绑定自己的域名.在 https://pages.github.com/ 首 ...