#define DAC_SW 48 #define DAC_LED0 46 #define DAC_LED1 50 int dac_select = 0; bool dac_sw_pressed = false; #define ADC_SW 42 #define ADC_LED0 44 #define ADC_LED1 40 #define LP_IN_CLK 6 #define LP_OUT_CLK 7 int adc_select = 0; bool adc_sw_pressed = false; //max 12 #define BITS 12 //max 150000 #define FILT_FREQ 150000 void setup() { Serial.begin(115200); //analog analogWriteResolution(BITS); analogReadResolution(BITS); //DAC pinMode(DAC_SW, INPUT); digitalWrite(DAC_SW, HIGH); pinMode(DAC_LED0, OUTPUT); digitalWrite(DAC_LED0, HIGH); pinMode(DAC_LED1, OUTPUT); pinMode(DAC0, OUTPUT); pinMode(DAC1, OUTPUT); //ADC pinMode(ADC_SW, INPUT); digitalWrite(ADC_SW, HIGH); pinMode(ADC_LED0, OUTPUT); digitalWrite(ADC_LED0, HIGH); pinMode(ADC_LED1, OUTPUT); //PWM pinMode(LP_IN_CLK, OUTPUT); pinMode(LP_OUT_CLK, OUTPUT); //50% analogWrite(LP_IN_CLK, pow(2, BITS) / 2); analogWrite(LP_OUT_CLK, pow(2, BITS) / 2); PWMC_ConfigureClocks(FILT_FREQ * PWM_MAX_DUTY_CYCLE, 0, VARIANT_MCK); } bool check_switch(int in, int led0, int led1, int * select, bool * pressed) { if (digitalRead(in) == 0 && *pressed == false) { *pressed = true; *select = !(*select); digitalWrite(led0, *select == 0); digitalWrite(led1, *select == 1); return true; } if (digitalRead(in) == 1) *pressed = false; return false; } long x = 0; int64_t y = 0; int x_ptr = 0; #define TAPS 51 //********************************************************************** /* //1. floating point parameters #define MUL 1 float x_old[TAPS]; float b[TAPS] = {...}; //*/ /*//2. fixed point parameters 1000000 #define MUL 1000000 int64_t x_old[TAPS]; const int64_t b[TAPS] = {...}; //*/ /*//3. fixed point parameters 1048576 #define MUL 1048576 int64_t x_old[TAPS]; const int64_t b[TAPS] = {...}; //*/ //********************************************************************** void loop() { check_switch(DAC_SW, DAC_LED0, DAC_LED1, &dac_select, &dac_sw_pressed); check_switch(ADC_SW, ADC_LED0, ADC_LED1, &adc_select, &adc_sw_pressed); if (adc_select == 0) x = analogRead(A0); else x = analogRead(A1); x -= 2048; x_old[x_ptr] = x * MUL; y = 0; for (int i = 0; i < TAPS; i++) { int index; if (i <= x_ptr) index = x_ptr - i; else index = TAPS + x_ptr - i; y += (x_old[index] * b[i]) / ((int64_t)MUL * (int64_t)MUL); } x_ptr = (x_ptr + 1) % TAPS; y += 2048; if (dac_select == 0) analogWrite(DAC0, y); else analogWrite(DAC1, y); }