mylife1213 发表于 2014-11-7 15:12:13

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

本帖最后由 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()函数读取的

unsigned char data;
void setup() {

pinMode(13, OUTPUT);
pinMode(A0,INPUT);
}

void loop() {

digitalWrite(13,HIGH);

data=analogRead(A0);

digitalWrite(13,LOW);

}   



可以看到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 ,误差真大!后续放出的库会集成对应这颗温度传感器的访问函数



http://v.youku.com/v_show/id_XODIxOTYxMjI4.html

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

byte data;
void setup() {               
Serial.begin(9600);
}

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

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

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


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

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

carney 发表于 2014-11-7 16:05:09

学习下,同时也想问问有没有优化过的PWM库

mylife1213 发表于 2014-11-7 16:11:58

carney 发表于 2014-11-7 16:05 static/image/common/back.gif
学习下,同时也想问问有没有优化过的PWM库

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

carney 发表于 2014-11-7 16:15:23

mylife1213 发表于 2014-11-7 16:11 static/image/common/back.gif
有,使用timer1 和timer2 定时器写的,改天有时间再发出来,因为库文件自己在用,分享出来有些东西要修改一下

非常感谢楼主分享。支持了

PPeach 发表于 2014-11-7 22:11:51

精品必顶,楼主分享的都是好东西

PINKWALKMAN 发表于 2014-11-8 09:27:13

说实在的arduino的ADC采样频率一直困扰我好久。做的遥控小车由于ADC采样控制信号太慢,好多特技都无法展示。

mylife1213 发表于 2014-11-8 09:43:37

PINKWALKMAN 发表于 2014-11-8 09:27 static/image/common/back.gif
说实在的arduino的ADC采样频率一直困扰我好久。做的遥控小车由于ADC采样控制信号太慢,好多特技都无法展示。 ...

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

lyili 发表于 2014-11-8 17:44:25

楼主又放好东西了,强烈支持~

mylife1213 发表于 2014-11-9 10:22:00

本帖最后由 mylife1213 于 2014-11-9 10:59 编辑

.......................

mylife1213 发表于 2014-11-9 10:27:16

本帖最后由 mylife1213 于 2014-11-9 10:59 编辑

......................................

leicheng 发表于 2014-12-26 17:14:07

顶!不知道这个原理能否用在Serial.Write()上? 用Serial.Write()每写一个字节,大概花11us左右,大批量写数据时,耗时有点多。

GrayPillow 发表于 2015-11-23 18:03:32

感谢~~~~~~~~~~~~~~~~~~~

宋天 发表于 2017-11-6 22:11:57

楼主,请问这个高速率79kHZ,是对一路采样来说的,还是对于8路同时采样的速率呀??如果我要8路同时进行采样的话,速率是不是会有影响呢,在loop里面顺序读取8路的值这样?
页: [1]
查看完整版本: 冷知识-这次讲ADC采样率-11月8号更新-上传高速率采样库-后续加入示波器库