极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26384|回复: 12

冷知识-这次讲ADC采样率-11月8号更新-上传高速率采样库-后续加入示波器库

[复制链接]
发表于 2014-11-7 15:12:13 | 显示全部楼层 |阅读模式
本帖最后由 mylife1213 于 2014-11-8 20:39 编辑

     经过上一帖讲的模拟比较器后继续来讲基于ATmega328P arduino的冷知识,充分利用这颗芯片.
10 位 精度
0.5 LSB 的非线性度
± 2 LSB 的绝对精度
65 - 260 μs 的转换时间
8位分辨率下采样率79kSPS , 最高分辨率时采样率高达15 kSPS
8 路复用的单端输入通道
7 路差分输入通道
2 路可选增益为10x 与200x 的差分输入通道(1)
可选的左对齐ADC 读数
0 - VCC 的 ADC 输入电压范围
可选的1.1V ADC 参考电压
连续转换或单次转换模式
通过自动触发中断源启动ADC 转换
ADC 转换结束中断
基于睡眠模式的噪声抑制器

下面我使用逻辑分析仪来给大家讲解
这是使用官方analogRead()函数读取的

  1. unsigned char data;
  2. void setup() {
  3.   
  4.   pinMode(13, OUTPUT);
  5.   pinMode(A0,INPUT);
  6. }

  7. void loop() {

  8.   digitalWrite(13,HIGH);
  9.   
  10.   data=analogRead(A0);
  11.   
  12.   digitalWrite(13,LOW);
  13.   
  14. }
复制代码
  



可以看到analogRead()读取耗时0.115毫秒
  

下图是重新配置的ADC采样率



达到79k采样率需要牺牲分辨率,也就是10位分辨率需要降低到8位,原理是ADC用的是逼近式转换电压成数字信号,在79k采样率下不注意支撑10位分辨率.
  对应需要高速度采样的应用其实对分辨率没什么要求.

有一个冷知识不知道大家有没有知道: 其实arduino 处理器里面有集成一个温度传感器;
   Temperature Measurement
The temperature measurement is based on an on-chip temperature sensor that is coupled to a single ended
ADC8 channel. Selecting the ADC8 channel by writing the MUX3...0 bits in ADMUX register to "1000" enables
the temperature sensor. The internal 1.1V voltage reference must also be selected for the ADC voltage
reference source in the temperature sensor measurement. When the temperature sensor is enabled, the ADC
converter can be used in single conversion mode to measure the voltage over the temperature sensor.
The measured voltage has a linear relationship to the temperature as described in Table 24-2. The voltage
sensitivity is approximately 1 mV/°C and the accuracy of the temperature measurement is +/- 10°C.


英语太差就不翻译了,自行谷歌.
大概意思就是说访问ADC8通道可以取得随温度变化的线性电压,精度是正负10°C ,误差真大!后续放出的库会集成对应这颗温度传感器的访问函数





现在提供ADC高速率采样库,使用库可以使ADC达到8位79k的频率采样;
  1. #include<ADC.h>

  2. byte data;
  3. void setup() {               
  4.   Serial.begin(9600);
  5. }

  6. void loop() {
  7.     data=ADC_8bit(1);//8位79k采样,ADC_8bit(ADC端口),端口号A1写成1 A0 写0就可以了
  8.     Serial.println(data);
  9.     delay(100);
  10.    
  11. }
复制代码


还有上次说的关于arduino集成的温度传感器访问函数是ADC_8bit(8); 返回的不是直接的温度,而是随温度变化的ADC读取电压,上图有关于温度传感器温度和电压的关系,需要的朋友自行进行调试;

上面的代码是运行函数,ADC_8bit(填入ADC端口,不用A);返回值是一个0-255,高速率采样是有代价的,代价就是从0-1023变成现在的0-255,不过我觉得对于需要高速率采样的这点牺牲绝对值得!


下次更新加入多arduino示波器组合采样

未完待续........

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-11-7 16:05:09 | 显示全部楼层
学习下,同时也想问问有没有优化过的PWM库
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-7 16:11:58 | 显示全部楼层
carney 发表于 2014-11-7 16:05
学习下,同时也想问问有没有优化过的PWM库

有,使用timer1 和timer2 定时器写的,改天有时间再发出来,因为库文件自己在用,分享出来有些东西要修改一下
回复 支持 反对

使用道具 举报

发表于 2014-11-7 16:15:23 | 显示全部楼层
mylife1213 发表于 2014-11-7 16:11
有,使用timer1 和timer2 定时器写的,改天有时间再发出来,因为库文件自己在用,分享出来有些东西要修改一下

非常感谢楼主分享。支持了
回复 支持 反对

使用道具 举报

发表于 2014-11-7 22:11:51 | 显示全部楼层
精品必顶,楼主分享的都是好东西
回复 支持 反对

使用道具 举报

发表于 2014-11-8 09:27:13 | 显示全部楼层
说实在的arduino的ADC采样频率一直困扰我好久。做的遥控小车由于ADC采样控制信号太慢,好多特技都无法展示。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-8 09:43:37 | 显示全部楼层
PINKWALKMAN 发表于 2014-11-8 09:27
说实在的arduino的ADC采样频率一直困扰我好久。做的遥控小车由于ADC采样控制信号太慢,好多特技都无法展示。 ...

等下次更新一起放出组合示波器与79k采样频率扩展库
回复 支持 反对

使用道具 举报

发表于 2014-11-8 17:44:25 | 显示全部楼层
楼主又放好东西了,强烈支持~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-9 10:22:00 | 显示全部楼层
本帖最后由 mylife1213 于 2014-11-9 10:59 编辑

.......................
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-9 10:27:16 | 显示全部楼层
本帖最后由 mylife1213 于 2014-11-9 10:59 编辑

......................................
回复 支持 反对

使用道具 举报

发表于 2014-12-26 17:14:07 | 显示全部楼层
顶!不知道这个原理能否用在Serial.Write()上? 用Serial.Write()每写一个字节,大概花11us左右,大批量写数据时,耗时有点多。
回复 支持 反对

使用道具 举报

发表于 2015-11-23 18:03:32 | 显示全部楼层
感谢~~~~~~~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2017-11-6 22:11:57 | 显示全部楼层
楼主,请问这个高速率79kHZ,是对一路采样来说的,还是对于8路同时采样的速率呀??如果我要8路同时进行采样的话,速率是不是会有影响呢,在loop里面顺序读取8路的值这样?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 02:35 , Processed in 0.045297 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表