|
|
@@ -11,15 +11,18 @@ int send_data = 0; |
|
|
|
uint16_t send_adc, send_dac; |
|
|
|
|
|
|
|
/* Outside these thresholds, we step the DAC value */ |
|
|
|
#define ADC_MIN 0x074b |
|
|
|
#define ADC_MAX 0x08b3 |
|
|
|
#define ADC_MIN 0x0700 |
|
|
|
#define ADC_MAX 0x0900 |
|
|
|
#define ADC_BIGMIN 0x0500 |
|
|
|
#define ADC_BIGMAX 0x0b00 |
|
|
|
|
|
|
|
/* Max/min DAC output value */ |
|
|
|
#define DAC_MIN 0x0000 |
|
|
|
#define DAC_MAX 0xffff |
|
|
|
|
|
|
|
/* A DAC step is this many counts */ |
|
|
|
#define DAC_STEP 0x0080 |
|
|
|
#define DAC_STEP 0x0180 |
|
|
|
#define DAC_BIGSTEP 0x0400 |
|
|
|
|
|
|
|
uint16_t dac_cmd = ((uint32_t)DAC_MAX + DAC_MIN) / 2; |
|
|
|
|
|
|
@@ -40,15 +43,37 @@ void slow_callback(void) |
|
|
|
send_dac = dac_cmd; |
|
|
|
send_data = 1; |
|
|
|
|
|
|
|
#undef EXPERIMENTAL |
|
|
|
#ifdef EXPERIMENTAL |
|
|
|
/* Update DAC. Add whatever is necessary to cause the ADC |
|
|
|
to recenter at 0x0800 */ |
|
|
|
{ |
|
|
|
int32_t adjustment = (0x0800 - (int32_t)v) * (10 / 10.8); |
|
|
|
int32_t newdac = dac_cmd + adjustment; |
|
|
|
if (adjustment) { |
|
|
|
if (newdac < DAC_MIN) |
|
|
|
dac_cmd = DAC_MIN; |
|
|
|
else if (newdac > DAC_MAX) |
|
|
|
dac_cmd = DAC_MAX; |
|
|
|
else |
|
|
|
dac_cmd = newdac; |
|
|
|
dac_write(dac_cmd); |
|
|
|
} |
|
|
|
} |
|
|
|
#else |
|
|
|
/* 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)) { |
|
|
|
if (v < ADC_BIGMIN && dac_cmd < (DAC_MAX - DAC_BIGSTEP)) |
|
|
|
dac_cmd += DAC_BIGSTEP; |
|
|
|
else 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)) { |
|
|
|
else if (v > ADC_BIGMAX && dac_cmd > (DAC_MIN + DAC_BIGSTEP)) |
|
|
|
dac_cmd -= DAC_BIGSTEP; |
|
|
|
else if (v > ADC_MAX && dac_cmd > (DAC_MIN + DAC_STEP)) |
|
|
|
dac_cmd -= DAC_STEP; |
|
|
|
dac_write(dac_cmd); |
|
|
|
} |
|
|
|
else |
|
|
|
return; |
|
|
|
dac_write(dac_cmd); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void send_to_pc(void) |
|
|
@@ -66,30 +91,59 @@ void send_to_pc(void) |
|
|
|
|
|
|
|
int main(void) |
|
|
|
{ |
|
|
|
int debug = 1; |
|
|
|
|
|
|
|
config_init(); |
|
|
|
uart1_init(500000); |
|
|
|
adcext_init(); |
|
|
|
dac_init(); |
|
|
|
adc_init(); |
|
|
|
// adc_adc_callback = fast_callback; |
|
|
|
adc_dma_callback = slow_callback; |
|
|
|
|
|
|
|
/* |
|
|
|
{ |
|
|
|
int16_t i = 0; |
|
|
|
while(1) { |
|
|
|
i++; |
|
|
|
dac_write(i); |
|
|
|
uart1_put_hex16(i); |
|
|
|
if (debug) { |
|
|
|
uart1_init(115200); |
|
|
|
|
|
|
|
uint16_t dac = 32768; |
|
|
|
while (1) { |
|
|
|
dac_write(dac); |
|
|
|
uart1_put_dec(dac); |
|
|
|
uart1_crlf(); |
|
|
|
switch (uart1_get()) { |
|
|
|
case '[': |
|
|
|
dac--; |
|
|
|
break; |
|
|
|
case ']': |
|
|
|
dac++; |
|
|
|
break; |
|
|
|
case '-': |
|
|
|
dac -= 16; |
|
|
|
break; |
|
|
|
case '+': |
|
|
|
case '=': |
|
|
|
dac += 16; |
|
|
|
break; |
|
|
|
case ',': |
|
|
|
case '<': |
|
|
|
dac -= 1024; |
|
|
|
break; |
|
|
|
case '.': |
|
|
|
case '>': |
|
|
|
dac += 1024; |
|
|
|
break; |
|
|
|
case '0': |
|
|
|
dac = 32768; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
*/ |
|
|
|
|
|
|
|
while(1) { |
|
|
|
if (send_data) { |
|
|
|
send_to_pc(); |
|
|
|
send_data = 0; |
|
|
|
} else { |
|
|
|
uart1_init(500000); |
|
|
|
|
|
|
|
//adc_adc_callback = fast_callback; |
|
|
|
adc_dma_callback = slow_callback; |
|
|
|
|
|
|
|
while(1) { |
|
|
|
if (send_data) { |
|
|
|
send_to_pc(); |
|
|
|
send_data = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |