ADCの扱い

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)
/media/uploads/EndoTsunenobu/adctimeing.jpg

DigitalOut testPin(p10);

short           flag = 1;
unsigned int    adcData;

while(1) {
    testPin = flag;
    adcData = adcIn.read_u16()& 0xffff;
    flag = !flag;
}


2 comments on ADCの扱い:

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.cppadc.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)

/media/uploads/EndoTsunenobu/mbedadcfullrimeing.jpg
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.
	}
}
12 Jul 2011

割込みと組み合わせると遅くなる


ADCの読み込みは割込みで行うと、AnlogIn()で読むより遅くなる。前出の高速ADC読込みの最も高速読み込みが出来るBurst Modeでも90μS (11k/s)程度が限界。
割り込みが遅い訳でもなく、Burst Modeが遅い訳ではない。組み合わせると遅くなる!

/media/uploads/EndoTsunenobu/adcandinterrupt.jpg
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)と高速。
/media/uploads/EndoTsunenobu/adcburst.jpg

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)と高速になのに組み合わせると遅くなるのはなぜ?
/media/uploads/EndoTsunenobu/interruptonly.jpg

void portChange() {
	testPin = !testPin;
}

int main() {
	int	n;
	while(1) {
		n++;
	}
}

Please log in to post comments.