#define MCpin 20
#define ICGpin 10
#define SHpin 12
#include <ADC.h>
volatile int runCode = 0;
volatile bool inter = false;
int aa;
unsigned long t1;
unsigned long t2;
unsigned long dt;
int bb;
int loops = 0;
#define BUFSIZE 3694
uint8_t data_buffer[BUFSIZE];
ADC *adc = new ADC(); // adc object
volatile unsigned long ticks = 0;
void setup() {
ARM_DEMCR |= ARM_DEMCR_TRCENA;
ARM_DWT_CTRL |= ARM_DWT_CTRL_CYCCNTENA;
memset(data_buffer,0,sizeof(data_buffer));
pinMode(ICGpin, OUTPUT);
digitalWriteFast(ICGpin, HIGH);
pinMode(SHpin, OUTPUT);
pinMode(MCpin, OUTPUT);
pinMode(11, OUTPUT);
digitalWriteFast(11, HIGH);
pinMode(19, INPUT);
attachInterrupt(19, isrService, RISING); // interrrupt 1 is data ready
Serial.begin(115200);
//Serial.println("Starting");
analogWriteResolution(5);
analogWriteFrequency(MCpin, 1000000);
analogWrite(MCpin, 16);
adc->setAveraging(1);
adc->setResolution(8);
adc->setConversionSpeed(ADC_VERY_HIGH_SPEED);
adc->setSamplingSpeed(ADC_VERY_HIGH_SPEED);
adc->startContinuous(A0, ADC_0);
adc->analogReadContinuous(ADC_0);
digitalWriteFast(SHpin, LOW);
}
void loop()
{
//turn interrupts on, these will be used for syncronization of the signals
interrupts();
// increment loops to allow us to make decisions based on how many reads have been performed
loops += 1;
//if (loops>20){digitalWriteFast(11, HIGH);}
// ticks tracks the main PWM, should be at 1 MHZ
ticks = 0;
// wait for first PWM tick, the main interrupt based on the PWM increments the ticks value
while (ticks < 1){};
// cycle ICG low
digitalWriteFast(ICGpin, LOW);
// loop used for timing, checked wait time with oscilliscope, has weird jumps in wait time based on number of loops, must be optimized by the compiler?
// not sure why I didn't use the tick counter for this timing, pretty sure tick counter was only reliable for longer waits
// see sensor sheet for timing reasons, using the default here i think
for (bb=0;bb<20 ;bb++){};
digitalWriteFast(SHpin, HIGH);
while (ticks < 6){};
digitalWriteFast(SHpin, LOW); //for norm
while (ticks < 10){};
digitalWriteFast(ICGpin, HIGH);
// turn off interrupts for the main loop where we read the analog signal
// in order for loop to run uninterrupted, cycles through all data
noInterrupts();
for (aa=0;aa<923;aa++){
digitalWriteFast(SHpin, HIGH);
for (bb=0;bb<60;bb++){};
data_buffer[2*aa] = adc->analogReadContinuous(ADC_0);
for (bb=0;bb<60;bb++){};
digitalWriteFast(SHpin, LOW);
for (bb=0;bb<60;bb++){};
data_buffer[2*aa+1] = adc->analogReadContinuous(ADC_0);
for (bb=0;bb<60;bb++){};
}
digitalWriteFast(SHpin, HIGH);
for (aa=0;aa<923;aa++){
digitalWriteFast(SHpin, HIGH);
for (bb=0;bb<60;bb++){};
data_buffer[923+2*aa] = adc->analogReadContinuous(ADC_0);
for (bb=0;bb<60;bb++){};
digitalWriteFast(SHpin, LOW);
for (bb=0;bb<60;bb++){};
data_buffer[923+2*aa+1] = adc->analogReadContinuous(ADC_0);
for (bb=0;bb<60;bb++){};
}
//t2 = ARM_DWT_CYCCNT;
interrupts();
ticks = 0;
while (ticks < 1){};
// digitalWriteFast(ICGpin, LOW);
adc->analogReadContinuous(ADC_0);
digitalWriteFast(SHpin, HIGH);
while (ticks < 6){};
digitalWriteFast(SHpin, LOW);
// turn off interrupts so can send serial data uninterrupted
// print out every reading, can change if we want to print every X
noInterrupts();
if (loops > 0){
for (aa=0;aa<3694;aa++){
Serial.print(data_buffer[aa]);
Serial.print(" ");
data_buffer[aa] = 0;
}
Serial.println(" end");
loops = 0;
//delay(100);
}
interrupts();
delay(3000);
}
void isrService()
{
ticks = ticks + 1;
}