audio adc read l_adc是什么意思

下次自动登录
现在的位置:
& 综合 & 正文
zigbee cc2530 adc转换
cc2530的通用datasheet上没怎么讲到adc的一些特性,
http://download.csdn.net/detail/songqqnew/5132088
而是下面这个文档有较多讲解www.ti.com/lit/ds/symlink/cc2530.pdf
#include "adc.h"
void main(void)
adcSampleSingle (ADC_REF_AVDD,ADC_12_BIT,ADC_AIN0);
1.源于basic代码
2.cc2530没有专门设置分辨率的寄存器,有一个抓取率,设置这个东东就相当于设置了分辨率和adc转换时间,(套餐,分辨率越高,转换时间越长)
单个测量时,分辨率最高为12位,达不到14位,
在抓取率是512时可以达到最大分辨率(同时也达到最慢的转换速率)。
datasheeet上如此介绍
The ADC supports up to 14-bit analog-to-digital conversion with up to 12 bits ENOB (Effective Number OfBits).
最高支持14位ad转换分辨率,但是有效位是12位。看看是那几位:
ADCH的最高位是符号位,对于单个测量,结果总是正,所以符号位总是0。所以用到bit6--bit0,计7位
ADCL的低2位(bit0,bit1)系统保留,bit2不用,所以用到bit7--bit3,计5位。
所以共12位。
当然其他抓取率时,有效分辨率如下:<span style="color:#ff decimation rate (7 bits ENOB)--ADCH低7位
01: 128 decimation rate (9 bits ENOB)--ADCH低7位+ADCH高2位
10: 256 decimation rate (10 bits ENOB)--ADCH低7位+ADCH高3位
11: 512 decimation rate (12 bits ENOB)--ADCH低7位+ADCL高5位
在分辨率是7位时,如果按照分辨率是12去取结果,是不太准确的。
3.参考电压#define ADC_REF_1_25_V
// Internal 1.25V reference
#define ADC_REF_P0_7
// External reference on AIN7 pin
#define ADC_REF_AVDD
// AVDD_SOC pin,=3.3v
#define ADC_REF_P0_6_P0_7
// External reference on AIN6-AIN7 differential input
其实如果连符号位和bit2也算上,最高分辨率是14位。
不过不如协议栈的adc转换函数更加可信:
直接使用即可
#include "hal_adc.h"
uint16 u16cvalu=HalAdcRead(HAL_ADC_CHANNEL_4,HAL_ADC_RESOLUTION_12);
分辨率设置为12位时,从源码可以看出,可用位是ADCH 8位+ADCH高4位,其中ADCH最高位是符号位,所以有11位的分辨率,0-2047
默认基准电压3.3V
uint16 HalAdcRead (uint8 channel, uint8 resolution)
reading = 0;
#if (HAL_ADC == TRUE)
adcChannel = 1;
/* store the previously set reference voltage selection */
reference = ADCCON3 & HAL_ADC_REF_BITS;
* If Analog input channel is AIN0..AIN7, make sure corresponing P0 I/O pin is enabled.
* does NOT disable the pin at the end of this function.
I think it is better to leave the pin
* enabled because the results will be more accurate.
Because of the inherent capacitance on the
* pin, it takes time for the voltage on the pin to charge up to its steady-state level.
* HalAdcRead() has to turn on the pin for every conversion, the results may show a lower voltage
* than actuality because the pin did not have time to fully charge.
if (channel & 8)
for (i=0; i & i++)
adcChannel &&= 1;
/* Enable channel */
ADCCFG |= adcC
/* Convert resolution to decimation rate */
switch (resolution)
case HAL_ADC_RESOLUTION_8:
resbits = HAL_ADC_DEC_064;
case HAL_ADC_RESOLUTION_10:
resbits = HAL_ADC_DEC_128;
case HAL_ADC_RESOLUTION_12:
resbits = HAL_ADC_DEC_256;
case HAL_ADC_RESOLUTION_14:
resbits = HAL_ADC_DEC_512;
/* read ADCL,ADCH to clear EOC */
tmp = ADCL;
tmp = ADCH;
/* Setup Sample */
adctemp = ADCCON3;
adctemp &= ~(HAL_ADC_CHN_BITS | HAL_ADC_DEC_BITS | HAL_ADC_REF_BITS);
adctemp |= channel | resbits | (reference);
/* writing to this register starts the extra conversion */
/* Wait for the conversion to be done */
while (!(ADCCON1 & HAL_ADC_EOC));
/* Disable channel after done conversion */
ADCCFG &= (adcChannel ^ 0xFF);
/* Read the result */
reading = (int16) (ADCL);
reading |= (int16) (ADCH && 8);
/* Treat small negative as 0 */
if (reading & 0)
reading = 0;
switch (resolution)
case HAL_ADC_RESOLUTION_8:
reading &&= 8;
case HAL_ADC_RESOLUTION_10:
reading &&= 6;
case HAL_ADC_RESOLUTION_12:
reading &&= 4;
case HAL_ADC_RESOLUTION_14:
reading &&= 2;
// unused arguments
return ((uint16)reading);
&&&&推荐文章:
【上篇】【下篇】王者荣耀玩家所说的ADC是什么意思?【游界吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:28贴子:
王者荣耀玩家所说的ADC是什么意思?收藏
王者荣耀玩家所说的ADC是什么意思?我本人之前都是玩单机游戏的,听说《王者荣耀》这个游戏是非常火,身边的朋友玩这个游戏的也是不少,一直都是非常喜欢使用鲁班七号或者是虞姬,两个英雄伤害都是很高,伤害也是很高。但是上次在对局中遇到了一个名词却是赶到非常奇怪,在我选择鲁班七号之后,有队友选择李元芳对我说:我打ADC!我不懂这个ADC到底是什么意思?在游戏中新赛季射手并不是多么吃香,所以高端局中基本上没有玩家再去选择这个位置,不过这对于新手玩家们来说并不影响对于射手的热爱。在对局中射手们有着一个别称叫做ADC,这个名词在很早之前就有了,之前在打《英雄联盟》的时候就听说过这个名词,对于游戏中这些字母代词我给您讲解一下。游戏中分为AD和AP两种分类,AD的意思是物理攻击型英雄,一般战士、刺客、射手都是属于AD英雄;AP的意思是法术攻击型英雄,这一下就概括了整个法师一族,一些坦克和战士利用法术打出伤害的也算是AP。其中ADC的意思就是主要物理输出英雄,普遍都是指的是射手,在后期射手的伤害都是很爆炸,也是玩家们需要保护的位置,团战时能够打出很高的伤害。而AP中也是有着APC的存在,一般是指队伍中法术伤害最高的英雄,因为王者荣耀队伍中最多也就是两个法师英雄,所以我们在对局中一般不会说这个代词。ADC是在后期团战中最主要的位置,在没有射手的情况下是很难打出伤害来,我们就拿新手们最爱玩的鲁班七号来说,后期的爆发能力相信大家都是知道的,如果对面刺客不过来切掉我们可以打出巨高的伤害,射手在团战开启之前最好是能够靠近辅助或者坦克,从而提升自身的生存能力。 说到这很多人会好奇,一个队伍中能不能出现多个ADC呢?这个肯定是不行的!在对战中一般都是一个法师、射手、辅助、坦克(战士)、刺客,把任何一个人换做一个射手都是不行的,三个人去保护两个人肯定是非常困难的,如果对面的刺客冲过来快速的秒杀掉两个主要输出,这场团战是肯定崩盘的,所以我们在对局中最好还是不要选择多名ADC!
登录百度帐号推荐应用博客访问: 266366
博文数量: 281
博客积分: 0
博客等级: 民兵
技术积分: 2765
注册时间:
痴爱嵌入式技术的蜗牛
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
6. 用户态 ADC 编程&& &
&& &EasyARM-iMX283A 提供了两种不同速度的 ADC 数据采集通道,一种 Low-Resolution
&& &ADC( LRADC 低分辨率),底板引出 3 路: ADC0、 ADC1、 ADC6;另一种为 High-Speed
&& &ADC(HSADC 高速 ADC,每秒可达 2MSPS),只有 1 路。 4 路 ADC 分别对应 EasyARMiMX283A
&& &排母的 A0、 A1、 A6、 HSADC。
&& &ADC0、 ADC1、 ADC6 三路通道内部含有一个除 2 模拟电路,在未开启内部除 2 电路
&& &时,其量程为 0~1.85V,开启除 2 电路时,量程为 0~3.7V。 ADC 参考源来自内部参考电压
&& &1.85V。另外,驱动提供了一个内部读取电池电压的接口,此通道内部有除 4 电路。 HSADC
&& &为 2M 采样率的高速 ADC,可用于摄像头数据采集。
6.1 ADC 驱动模块的加载
&& &EasyARM-iMX283A ADC 的驱动有两种,一种是 LRADC 对应的驱动。另一种为 HSADC
&& &对应的驱动。下面分别对两种驱动加载方式作出介绍。
&& &1. LRADC 对应的驱动加载
&& &&& &ADC0、 ADC1、 ADC6 对应的驱动是以动态加载模块的形式提供,因此在 ADC 操作之
&& &&& &前要先安装 lradc 驱动模块。
&& &&& &驱动模块在哪里?
&& &&& &root@EasyARM-iMX283 ~# insmod /root/lradc.ko
&& &&& &adc module init!
&& &2. HSADC 对应的驱动加载
&& &&& &内核默认以动态加载模块方式编译 HSADC 驱动。在 EasyARM-iMX283A 光盘镜像的
&& &&& &linux 内核目录执行下面命令:
&& &&& &root@Linux-host:~/linux-2.6.35.3# make modules
&& &&& &就可以在“ linux-2.6.35.3/driver/misc/” 生成“ mxs-hsadc.ko” HSADC 驱动模块。加载动态
&& &&& &驱动模块与上面介绍的“ 安装 lradc 驱动” 方式相同。
&& &&& &如果需要静态加载此驱动,需要配置驱动为静态加载模式:
&& &&& &root@Linux-host:~/linux-2.6.35.3# make menuconfig
&& &&& &在内核选项里选择“ MX28 High Speed ADC”。选项路径:
&& &&& &Device Drivers->
&& &&& &[*] Misc devices --->
&& &&& &&& & MX28 High Speed ADC
&& &&& &&& &
&& &&& &按空格键可以切换模块编译方式。选择“ *”,内核编译时会将高速 ADC 驱动以静态方
&& &&& &式编译。重新烧写内核后高速 ADC 驱动就会生效。
6.2 操作接口
&& &本着简单易用原则, ADC 使用字符设备文件操作。下面分别介绍。
&& &1. LRADC 操作接口
&& &&& &LRADC 操作仅使用了 ioctl 函数,读取电压操作代码如下:
&& &&& &...
&& &&& &#include "lradc.h"
&& &&& &#define LRADC_DEV && &&& &/dev/magic-adc"
&& &&& &#define CMD_VOLTAGE && &IMX28_ADC_CH0 && &&& &/* 通道 0 读取命令 */
&& &&& &....
&& &&& &int value, fd,;
&& &&& &fd = open(LRADC_DEV, 0); /* 打开 ADC 设备 */
&& &&& &....
&& &&& &ioctl(fd, , CMD_VOLTAGE, &value); /* 发送采集命令,采集数据保存在 value 中*/
&& &&& &其中, value 为读取的电压值, IMX28_ADC_CH0 读取通道 0 命令号,命令号定义位于
&& &&& &“ lradc.h”头文件中,通过 ioctl 系统调用后,返回值保存在 value 中,需要将这个值转换为
&& &&& &电压值。具体转化见文档。
&& &2. HSADC 操作接口
&& &&& &当加载内核自带的驱动mxs-hsadc.ko时,将会生成内核文件/dev/mxs-hsadc0:
&& &&& &root@EasyARM-iMX283 /mnt/app_for_hardware# insmod mxs-hsadc.ko
&& &&& &root@EasyARM-iMX283 /mnt/app_for_hardware# lsmod
&& &&& &Module&&&&&&&&&&&&&&&&& Size& Used by
&& &&& &mxs_hsadc&&&&&&&&&&&&&& 4378& 0
&& &&& &root@EasyARM-iMX283 /mnt/app_for_hardware# ls /dev/mxs-hsadc0 -l
&& &&& &crw-rw----&&& 1 root&&&& root&&&&& 250,&& 0 Jan& 1 01:22 /dev/mxs-hsadc0
&& &&& &手动建立一个字符设备节点:
&& &&& &HSADC 为字符设备,主设备号为 250,次设备号为 0,设备节点需要用户创建。创建命令如下:
&& &&& &root@EasyARM-iMX283A ~# mknod /dev/hsadc c 250 0
&& &&& &HSADC 只要通过 read 系统调用实现。驱动程序默认使用 12 位精度采集数据。下面的
&& &&& &示例代码实现了读取 len 个数据到 buff 中。
&& &&& &#define HRADC_DEV "/dev/hsadc" /* 高速设备名 */
&& &&& &int read_hsadc(short *buff, int len)
&& &&& &&& &static int fd,flag = 0;
&& &&& &&& &int ret,i,
&& &&& &&& &fd = open (HRADC_DEV,0);
&& &&& &&& &....
&& &&& &&& &ret = read (fd ,buff,len); /* read 系统调用,返回采集数据*/
&& &&& &&& &....
&& &&& &&& &for(i=0;i<i++)
&& &&& &&& &{
&& &&& &&& &&& &buff[i] &= 0x3 /* 数据低 12 位有效 */
&& &&& &&& &}
6.3 C 程序操作示例
&& &下面分别给出 LRADC 和 HSADC 的 C 程序操作范例。
&& &1. C 程序操作 LRADC
&& &&& &程序清单 6.1 所示例程实现的功能是:读取 AP-283Demo 学习套件的电阻电压和 R32
&& &&& &发热电阻温度。
&& &&& &代码执行流程:首先获取用户需要读取数据量。然后打开设备,发送读取命令并打印返
&& &&& &回电压值,然后将读取的温度传感器的电压转化为温度并打印。
&& &&& &程序清单 6.1 ADC 操作示例
&&&&&&&&&&
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>
#include <sys/ioctl.h>
#include "lradc.h"
#define LRADC_DEV&&&&&&&&"/dev/magic-adc"&&&&/* adc 设备文件名 */
#define CMD_VOLTAGE &&&&IMX28_ADC_CH0&&&&&&&&/* 通道 0 读取命令 */
#define CMD_TEMPTURE&&&&IMX28_ADC_CH1&&&&&&&&/* 通道 1 通读读取命令 */
#define R33 &&&&&&&&&&&&2000
#define V_ADC&&&&&&&&&&&&3.3
#define T1&&&&&&&&&&&&&&&&(273.15 + 25)
#define R1&&&&&&&&&&&&&&&&27600
#define B&&&&&&&&&&&&&&&&3435*1000
int main(int argc,char **argv)
&&&&short buff[100];
&&&&int i, fd, value_R, value_T, cmd, ret, len = 2;
&&&&float voltage, RT, temp,resistance;
&&&&fd = open (LRADC_DEV,O_RDONLY); /* 打开 ADC 设备 */
&&&&if (fd < 0) {
&&&&&&&&perror("open");
&&&&&&&&close(fd);
&&&&&&&&return 0;
&&&&while(1)
&&&&&&&&usleep(1000000);
&&&&&&&&ret = ioctl(fd, CMD_VOLTAGE, &value_R); /* 读取通道 0 */
&&&&&&&&if(ret != 0){
&&&&&&&&&&&&perror("ioctl");
&&&&&&&&&&&&return -1;
&&&&&&&&ret = ioctl(fd, CMD_TEMPTURE, &value_T); /* 读取通道 1 */
&&&&&&&&//close(fd);
&&&&&&&&if(ret != 0) {
&&&&&&&&&&&&perror("ioctl");
&&&&&&&&&&&&return -1;
&&&&&&&&resistance&&&&= (value_R*1.85)/4096.0; /* 计算通道 0 测量电压 */
&&&&&&&&voltage &&&&= (value_T*1.85)/4096.0; /* 计算通道 1 测量电压 */
&&&&&&&&RT&&&&&&&&&&&&= (V_ADC/voltage - 1)*R33; /* 计算热敏电阻的阻值 */
&&&&&&&&temp&&&&&&&&= 3435/log(10*RT) - 273.15; /* 计算热敏电阻的温度 */
&&&&&&&&printf("A10 Voltage: %fV ;A11 Temperature: %f\n", resistance, temp);&&&&&&&&
&&&&close(fd);
&&&&return 0;
&& &注意,执行 adc 代码前,必须要加载 lradc.ko 模块。编译代码指令如下:
&& &编译应用程序:
&& &# arm-linux-gcc -o lradc_app -lm lradc_app.c
&& &编译驱动程序:lradc.ko
&& &root@Linux-host:/nfsroot/app_for_hardware/6th_adc/lradc/lradc_driver# make
&& &root@Linux-host:/nfsroot/app_for_hardware/6th_adc/lradc/lradc_driver# ls
&& &built-in.o& lradc.h&& lradc.mod.c& lradc.o&& modules.order&& README.txt
&& &lradc.c&&&& lradc.ko& lradc.mod.o& Makefile& Module.symvers
&& &加载驱动:
&& &# insmod lradc.ko
&& &执行程序:
&& &# ./lradc_app
&& &可以看到打印的温度信息:
&& &root@EasyARM-iMX283 /mnt/app_hardware/6th_adc/lradc/lradc_appTest# ./lradc_app
&& &A10 Voltage: 0.812085V ;A11 Temperature: 16.143188
&& &程序1:只打印一次sensor的值。
&& &程序2:每隔一秒打印一次,一直打印。
&& &2. C 程序操作 HSADC
&& &&& &程序清单 6.2 实现的功能是:读取 AP-283Demo 学习套件的发热电阻温度。
&& &&& &代码执行流程:首先获取用户需要读取数据量。然后打开设备,使用 read 系统调用读
&& &&& &取数据,然后将数据取平均值并转换为温度并打印。&& &
&& &&& &程序清单 6.2 HSADC 操作示例
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>
#define R33 &&&&&&&&2000
#define V_ADC &&&&&&&&3.3
#define T1 &&&&&&&&&&&&(273.15 + 25)
#define R1 &&&&&&&&&&&&27600
#define B &&&&&&&&&&&&3435*1000
#define HSADC &&&&&&&&"/dev/mxs-hsadc0"
int main(int argc,char **argv)
&&&&unsigned int buff[100];
&&&&int i, fd, value = 0, cmd, ret, len = 2;
&&&&float voltage, RT, temp,tmp;
&&&&int cnt;
&&&&if(argv[1] == NULL) {
&&&&&&&&printf("uasge: ./hsadc [data length]\n");
&&&&&&&&printf("data length >= 1\n");
&&&&&&&&return 0;
&&&&fd = open (HSADC,O_RDONLY); /* 打开 ADC 设备 */
&&&&if (fd < 0) {
&&&&&&&&perror("open");
&&&&&&&&close(fd);
&&&&&&&&return 0;
&&&&while(1)
&&&&&&&&usleep(1000000); // 1 second
&&&&&&&&cnt = atoi(argv[1])*2;
&&&&&&&&ret = read(fd, buff, cnt); /* 读取 HSADC */
&&&&&&&&printf("ret: %d, cnt: %d\n", ret, cnt);
&&&&&&&&if(ret < 0){
&&&&&&&&&&&&perror("ioctl");
&&&&&&&&&&&&return -1;
&&&&&&&&//close(fd);
&&&&&&&&ret >>= 1;
&&&&&&&&printf("ret: %d\n", ret);
&&&&&&&&for(i = 0; i < ret; i++)
&&&&&&&&&&&&value += (buff[i] & 0xfff);
&&&&&&&&value &&&&= value/ret;
&&&&&&&&voltage = (value*1.85)/4096.0; &&&&&&&&/* 计算通道 1 测量电压 */
&&&&&&&&RT &&&&&&&&= (V_ADC/voltage - 1)*R33; &&&&/* 计算热敏电阻的阻值 */
&&&&&&&&temp &&&&= 3435/log(10*RT) - 273.15; /* 计算热敏电阻的温度 */
&&&&&&&&printf("A11 Temperature: %f\n",temp);
&&&&close(fd);
&&&&return 0;
&& &注意,执行 adc 代码前,必须要加载 mxs-hsadc.ko 模块或内核已经有静态 hsadc 驱动。
&& &驱动路径:/drivers/misc/mxs-hsadc.ko
&& &加载驱动
&& &&& &#insmod mxs-hsadc.ko
&& &可以看到生成的设备文件为:/dev/mxs-hsadc0
&& &编译应用程序:hsadc
&& &# arm-linux-gcc -o hsadc hsadc.c -lm
&& &把编译好的可执行文件 adc 下载到开发板,设置可执行权限。
&& &root@EasyARM-iMX283 ~# chmod 777 hsadc
&& &将 AP-283Dem 配板排针插入 EasyARM-iMX283A 排母, 并使用杜邦线将排母对应的
&& &A1 与 HSADC 短接(就是母排J1的第17脚和第19脚短接), 执行代码。
&& &root@EasyARM-iMX283 ~# ./hsadc 10
&& &执行命令中,数字 10 表示需要读取 10 次采样的平均值。
阅读(113) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。当前位置: &
ADC即模拟数字转换器(英语:Analog-to-digital converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量。与之相对的设备成为数字模拟转换器。
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。然而,有一些模拟数字转换器并非纯的电子设备,例如旋转编码器,也可以被视为模拟数字转换器。}

我要回帖

更多关于 readline是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信