From a16510eb1fef4e8fdec4b2796a28f337d7f1e96d Mon Sep 17 00:00:00 2001 From: jim Date: Fri, 29 Feb 2008 16:50:47 +0000 Subject: [PATCH] Sort of works. git-svn-id: https://bucket.mit.edu/svn/nilm/zoom@6034 ddd99763-3ecb-0310-9145-efcb8ce7c51f --- firmware/zoom.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/firmware/zoom.c b/firmware/zoom.c index f27c173..296da10 100644 --- a/firmware/zoom.c +++ b/firmware/zoom.c @@ -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) {