Browse Source

Sort of works.

git-svn-id: https://bucket.mit.edu/svn/nilm/zoom@6034 ddd99763-3ecb-0310-9145-efcb8ce7c51f
tags/zoom-1.0
jim 16 years ago
parent
commit
a16510eb1f
1 changed files with 22 additions and 17 deletions
  1. +22
    -17
      firmware/zoom.c

+ 22
- 17
firmware/zoom.c View File

@@ -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) {


Loading…
Cancel
Save