#define SAMPLE_BUFFER_SIZE 2800
volatile int sample_buffer[SAMPLE_BUFFER_SIZE] = {999};sample_buffer[SAMPLE_BUFFER_SIZE];
volatile bool sample_buffer_full = 0;
volatile int sample_buffer_idx = 0;
void adcm_init() {
pmc_enable_periph_clk(ID_ADC); // To use peripheral, we must enable clock distributon to it
adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST); // initialize, set maximum posibble speed
adc_disable_interrupt(ADC, 0xFFFFFFFF);
adc_set_resolution(ADC, ADC_12_BITS);
adc_configure_power_save(ADC, 0, 0); // Disable sleep
adc_configure_timing(ADC, 0, ADC_SETTLING_TIME_3, 1); // Set timings - standard values
adc_set_bias_current(ADC, 1); // Bias current - maximum performance over current consumption
adc_stop_sequencer(ADC); // not using it
adc_disable_tag(ADC); // it has to do with sequencer, not using it
adc_disable_ts(ADC); // deisable temperature sensor
adc_disable_channel_differential_input(ADC, ADC_CHANNEL_7);
adc_configure_trigger(ADC, ADC_TRIG_SW, 1); // triggering from software, freerunning mode
adc_disable_all_channel(ADC);
adc_enable_channel(ADC, ADC_CHANNEL_7); // just one channel enabled
adc_enable_interrupt(ADC, ADC_IER_DRDY); // Data Ready Interrupt Enable
NVIC_EnableIRQ(ADC_IRQn);
adc_start(ADC);
}
void ADC_Handler(void) {
if (!sample_buffer_full) {
if ((adc_get_status(ADC) & ADC_ISR_DRDY) == ADC_ISR_DRDY) {
sample_buffer[sample_buffer_idx] = adc_get_latest_value(ADC);
sample_buffer_idx++;
if (sample_buffer_idx == SAMPLE_BUFFER_SIZE) {
sample_buffer_full = 1;
sample_buffer_idx = 0;
}
}
}
}
void setup()
{
adcm_init();
Serial.begin(115200);
}
void loop() {
Serial.print("Loop\n");
if (sample_buffer_full) {
for (int i = 0; i < SAMPLE_BUFFER_SIZE; i++) {
Serial.print(sample_buffer[i]);
Serial.print(" ");
}
Serial.print("\n");
sample_buffer_full = 0;
}
}