ADCの扱い
Page last updated
13 Jun 2011, by
Tsunenobu Endo.
2
replies
ADCの値をダイレクトに入手するには.read_u16を用いる。ADCが12bitにも関わらず、値は16bitで返ってくるので下位4bitはMaskするか、4bit右シフトして使う。
#define ADC_IN p20
AnalogIn adcIn(ASC_IN);
unsigned short analogHex = adcIn.read_u16() >> 4; // Get ADC data after adjsut 12bit
ADCのサンプル・タイミングは71μS(約14KHz)
DigitalOut testPin(p10);
short flag = 1;
unsigned int adcData;
while(1) {
testPin = flag;
adcData = adcIn.read_u16()& 0xffff;
flag = !flag;
}
2 comments on ADCの扱い:
EndoTsunenobu
#
13 Jun 2011
さらにサンプル速度をアップする方法
ADCを高速かつ、12bitの生データで入手する方法は
Simon Blandford氏のFull ADC driverを使用する。
氏のSummary、ココhttp://mbed.org/users/simonb/programs/ADC_test/5zlnn
からImportするか、zip fileをDownloadし
自身のProjectにADC_fullフォルダを作成し、その中に解凍したadc.cppとadc.hを追加する。
上記のdriverはフォーラムForum » mbed » ADC library internalshttp://mbed.org/forum/mbed/topic/479/の議論から提供されたものです。
サンプル速度は70μS(14KHz)から13μS(76kHz)にUpできる。(15μS程度としておけば十分)
2ch読むときは23μS(44KHz)〜25kHz(40kHz)
Test Codeは
#include "mbed.h"
#include "adc.h"
#define SAMPLE_RATE 150000
DigitalOut testPin(p10);
ADC adc(SAMPLE_RATE, 1);
int main() {
short adcData;
testPin = 1;
while(1) {
adc.setup(p20,1); // Set up ADC on pin 20
adc.setup(p19,1); // Set up ADC on pin 19
adc.select(p20); // Measure pin 20
adc.start(); // Start ADC conversion
while(!adc.done(p20)); // Wait for it to complete
adcData = adc.read(p20); // Get ADC data.
testPin = !testPin; // Invert test pin.
}
}
EndoTsunenobu
#
12 Jul 2011
割込みと組み合わせると遅くなる
ADCの読み込みは割込みで行うと、AnlogIn()で読むより遅くなる。前出の高速ADC読込みの最も高速読み込みが出来るBurst Modeでも90μS (11k/s)程度が限界。
割り込みが遅い訳でもなく、Burst Modeが遅い訳ではない。組み合わせると遅くなる!
Test Code
#include "adc.h"
#define SAMPLE_RATE 150000
DigitalOut testPin(p10);
ADC adc(SAMPLE_RATE, 1);
InterruptIn sensor(p12);
unsigned short chA;
void adcRead() {
::chA = adc.read(p20);
testPin = !testPin;
}
int main() {
char n = 0;
adc.startmode(0,0); // ADC Set up
adc.burst(1); // Burst mode Start
adc.setup(p20,1);
sensor.rise(&adcRead);
do {
n++; }
while (n < 100);
adc.burst(0);
adc.setup(p19,0);
}
ADCをBurst Modeで動かすだけなら、9μS(110k/s)と高速。
int main() {
unsigned short chA
char n = 0;
adc.startmode(0,0); // ADC Set up
adc.burst(1); // Burst mode Start
adc.setup(p20,1);
do {
chA = adc.read(p20);
testPin = !testPin;
n++;
}
while (n < 100);
adc.burst(0);
adc.setup(p19,0);
}
割り込みだけでも、2.33μS (429k/s)と高速になのに組み合わせると遅くなるのはなぜ?
void portChange() {
testPin = !testPin;
}
int main() {
int n;
while(1) {
n++;
}
}
Please log in to post comments.
さらにサンプル速度をアップする方法
ADCを高速かつ、12bitの生データで入手する方法は
Simon Blandford氏のFull ADC driverを使用する。 氏のSummary、ココhttp://mbed.org/users/simonb/programs/ADC_test/5zlnn からImportするか、zip fileをDownloadし
自身のProjectにADC_fullフォルダを作成し、その中に解凍したadc.cppとadc.hを追加する。
上記のdriverはフォーラムForum » mbed » ADC library internalshttp://mbed.org/forum/mbed/topic/479/の議論から提供されたものです。
サンプル速度は70μS(14KHz)から13μS(76kHz)にUpできる。(15μS程度としておけば十分)
2ch読むときは23μS(44KHz)〜25kHz(40kHz)
Test Codeは