This commit is contained in:
commit
991ef776bd
1 changed files with 49 additions and 0 deletions
49
arduino-due_high-speed-ADC.ino
Normal file
49
arduino-due_high-speed-ADC.ino
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
#undef HID_ENABLED
|
||||
|
||||
// Arduino Due ADC->DMA->USB 1MSPS
|
||||
// by stimmer
|
||||
// from http://forum.arduino.cc/index.php?topic=137635.msg1136315#msg1136315
|
||||
// Input: Analog in A0
|
||||
// Output: Raw stream of uint16_t in range 0-4095 on Native USB Serial/ACM
|
||||
|
||||
// on linux, to stop the OS cooking your data:
|
||||
// stty -F /dev/ttyACM0 raw -iexten -echo -echoe -echok -echoctl -echoke -onlcr
|
||||
|
||||
volatile int bufn,obufn;
|
||||
uint16_t buf[4][256]; // 4 buffers of 256 readings
|
||||
|
||||
void ADC_Handler(){ // move DMA pointers to next buffer
|
||||
int f=ADC->ADC_ISR;
|
||||
if (f&(1<<27)){
|
||||
bufn=(bufn+1)&3;
|
||||
ADC->ADC_RNPR=(uint32_t)buf[bufn];
|
||||
ADC->ADC_RNCR=256;
|
||||
}
|
||||
}
|
||||
|
||||
void setup(){
|
||||
SerialUSB.begin(0);
|
||||
while(!SerialUSB);
|
||||
pmc_enable_periph_clk(ID_ADC);
|
||||
adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST);
|
||||
ADC->ADC_MR |=0x80; // free running
|
||||
|
||||
ADC->ADC_CHER=0x80;
|
||||
|
||||
NVIC_EnableIRQ(ADC_IRQn);
|
||||
ADC->ADC_IDR=~(1<<27);
|
||||
ADC->ADC_IER=1<<27;
|
||||
ADC->ADC_RPR=(uint32_t)buf[0]; // DMA buffer
|
||||
ADC->ADC_RCR=256;
|
||||
ADC->ADC_RNPR=(uint32_t)buf[1]; // next DMA buffer
|
||||
ADC->ADC_RNCR=256;
|
||||
bufn=obufn=1;
|
||||
ADC->ADC_PTCR=1;
|
||||
ADC->ADC_CR=2;
|
||||
}
|
||||
|
||||
void loop(){
|
||||
while(obufn==bufn); // wait for buffer to be full
|
||||
SerialUSB.write((uint8_t *)buf[obufn],512); // send it - 512 bytes = 256 uint16_t
|
||||
obufn=(obufn+1)&3;
|
||||
}
|
||||
Loading…
Reference in a new issue