|
|
@@ -11,41 +11,44 @@ int send_data = 0; |
|
|
|
uint16_t send_adc, send_dac; |
|
|
|
|
|
|
|
/* Outside these thresholds, we step the DAC value */ |
|
|
|
#define ADC_MIN 0x0100 |
|
|
|
#define ADC_MAX 0x0e00 |
|
|
|
#define ADC_MIN 0x074b |
|
|
|
#define ADC_MAX 0x08b3 |
|
|
|
|
|
|
|
/* Max/min DAC output value */ |
|
|
|
#define DAC_MIN 0x0000 |
|
|
|
#define DAC_MAX 0x0fff |
|
|
|
#define DAC_MAX 0xffff |
|
|
|
|
|
|
|
/* Shift the DAC value left this far when writing it out */ |
|
|
|
#define DAC_SHIFT 4 |
|
|
|
/* A DAC step is this many counts */ |
|
|
|
#define DAC_STEP 0x0080 |
|
|
|
|
|
|
|
uint16_t dac_cmd = ((uint32_t)DAC_MAX + DAC_MIN) / 2; |
|
|
|
|
|
|
|
/* 128 KHz, after each ADC sample */ |
|
|
|
void fast_callback(void) |
|
|
|
{ |
|
|
|
uint16_t v = adc_dmabuf[adc_offset]; |
|
|
|
|
|
|
|
if (v < ADC_MIN && dac_cmd < DAC_MAX) |
|
|
|
dac_cmd ++; |
|
|
|
else if (v > ADC_MAX && dac_cmd > DAC_MIN) |
|
|
|
dac_cmd --; |
|
|
|
else |
|
|
|
return; /* No new command */ |
|
|
|
|
|
|
|
/* Write new value to DAC */ |
|
|
|
dac_write(dac_cmd << DAC_SHIFT); |
|
|
|
} |
|
|
|
|
|
|
|
/* 8 KHz, after DMA buffer filled */ |
|
|
|
void slow_callback(void) |
|
|
|
{ |
|
|
|
/* Get most recent sample. */ |
|
|
|
uint16_t v = adc_dmabuf[adc_offset]; |
|
|
|
|
|
|
|
/* Send most recent sample to PC */ |
|
|
|
send_adc = adc_dmabuf[adc_offset]; |
|
|
|
send_adc = v; |
|
|
|
send_dac = dac_cmd; |
|
|
|
send_data = 1; |
|
|
|
|
|
|
|
/* Update DAC if necessary */ |
|
|
|
/* TODO: Increase step depending on how far from ADC_MIN/ADC_MAX we are */ |
|
|
|
if (v < ADC_MIN && dac_cmd < (DAC_MAX - DAC_STEP)) { |
|
|
|
dac_cmd += DAC_STEP; |
|
|
|
dac_write(dac_cmd); |
|
|
|
} else if (v > ADC_MAX && dac_cmd > (DAC_MIN + DAC_STEP)) { |
|
|
|
dac_cmd -= DAC_STEP; |
|
|
|
dac_write(dac_cmd); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void send_to_pc(void) |
|
|
@@ -69,8 +72,9 @@ int main(void) |
|
|
|
dac_init(); |
|
|
|
adc_init(); |
|
|
|
// adc_adc_callback = fast_callback; |
|
|
|
// adc_dma_callback = slow_callback; |
|
|
|
adc_dma_callback = slow_callback; |
|
|
|
|
|
|
|
/* |
|
|
|
{ |
|
|
|
int16_t i = 0; |
|
|
|
while(1) { |
|
|
@@ -80,6 +84,7 @@ int main(void) |
|
|
|
uart1_crlf(); |
|
|
|
} |
|
|
|
} |
|
|
|
*/ |
|
|
|
|
|
|
|
while(1) { |
|
|
|
if (send_data) { |
|
|
|