基于友善之臂ARM-ContexA9-ADC驱动开发
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驱动开发的更多相关文章
- 基于DM642 RAW采集格式的视频驱动开发及应用
摘 要:为解决C64X系列数字信号处理器(DSP)视频驱动不能应用于原始数据格式(RAW)采集格式的问题,设计了DM642和电耦合元件(CCD)高清传感器的数据传输接口,并分析.修改用于标准格式的视频 ...
- 手把手教你从零实现Linux misc设备驱动一(基于友善之臂4412开发板)
关于怎样来写一个misc设备,在前面有篇文章已经介绍了大致的流程,如今就让我们来实现一个最简单的misc设备驱动. http://blog.csdn.net/morixinguan/article/d ...
- 手把手教你写Linux设备驱动---中断(三)--workqueue实现(基于友善之臂4412开发板) 【转】
转自:http://blog.csdn.net/morixinguan/article/details/69680909 上节,我们讲到如何来实现tasklet小任务机制 http://blog.cs ...
- 基于友善之臂ARM-tiny4412--uboot源码分析
/* * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core * * Copyright (c) 2004 Texas Instrument ...
- 基于友善之臂ARM-tiny4412--uboot源代码分析
/* * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core * * Copyright (c) 2004 Texas Instrument ...
- ARM&Linux 下驱动开发第二节
驱动文件:qudong.c,make生成qudong.ko文件,烧录到ARM板上 #include<linux/init.h> #include<linux/module.h> ...
- ARM&Linux 下驱动开发第三节
后台驱动代码如下:比较昨天的,添加了读写指针位置移动操作 #include<linux/init.h> #include<linux/module.h> #include< ...
- ARM&Linux 下驱动开发第一节(小试牛刀)
#include<linux/init.h> #include<linux/module.h> static int __init hello_init(void) { pri ...
- 【6集iCore3_ADP触摸屏驱动讲解视频】6-2 基于FSMC总线的ARM与FPGA通信
视频简介: 该视频介绍基于FSMC总线的ARM与FPGA通信 源视频包下载地址: 链接:http://pan.baidu.com/s/1slJDoQD 密码:tmw7 银杏科技优酷视频发布区: ...
随机推荐
- C语言诠释--为什么内存是线性分布的。
Author:伟易达集团软件工程师 II 杨源鑫Date :2016.11.11Subject:内存为什么是线性分布的 今天有位小伙伴问了我一个问题,问题大概是这样描述的: 师兄,我如何能够 ...
- 多线程并发之java内存模型JMM
多线程概念的引入是人类又一次有效压寨计算机的体现,而且这也是非常有必要的,因为一般运算过程中涉及到数据的读取,例如从磁盘.其他系统.数据库等,CPU的运算速度与数据读取速度有一个严重的不平衡,期间如果 ...
- FFmpeg的HEVC解码器源代码简单分析:解析器(Parser)部分
===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...
- JDOM生成、解析XML实例
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...
- Effective C++ ——让自己习惯C++
条款一:视C++为一个语言联邦 为了理解C++,你必须认识其主要的次语言.幸运的是总共只有四个: C:C++是由C语言继承而来的,必然对C有很好的兼容性,这一部分主要包括C中的一些语言,库函数等.但当 ...
- linux及windows文件共享
http://blog.csdn.net/pipisorry/article/details/51812022 本文主要说明 linux和windows文件共享, windows和ubuntu互相访问 ...
- [supervisor] 使用小记(入门教程)
之前到现在很久没有用了,还是从安装说下,做个简单的实验,系统为Ubuntu14.04 快速安装配置 sudo pip_python install supervisor sudo echo_super ...
- 皮尔森相似度计算举例(R语言)
整理了一下最近对协同过滤推荐算法中的皮尔森相似度计算,顺带学习了下R语言的简单使用,也复习了概率统计知识. 一.概率论和统计学概念复习 1)期望值(Expected Value) 因为这里每个数都是等 ...
- 后端分布式系列:分布式存储-HDFS 架构解析
本文以 Hadoop 提供的分布式文件系统(HDFS)为例来进一步展开解析分布式存储服务架构设计的要点. 架构目标 任何一种软件框架或服务都是为了解决特定问题而产生的.还记得我们在 <分布式存储 ...
- 2、MyEclipse和Eclipse调优,MyEclipse配置(tomcat和jdk的内存设置),jar引入相关知识点,将Java项目编程web项目的办法
1.WindowàPreferenceàGeneralàWorkspaceàText file encoding都改成UTF-8 2.WindowàPreferenceàGeneralàEdito ...