167 lines
2.7 KiB
C
167 lines
2.7 KiB
C
#include "config.h"
|
|
#include "adc.h"
|
|
#include "dac.h"
|
|
#include "uart.h"
|
|
#include "timer.h"
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#include "calibrate.h"
|
|
#include "util.h"
|
|
#include "led.h"
|
|
#include "mode.h"
|
|
|
|
static uint16_t dac = DAC_MID;
|
|
|
|
void sweep(void)
|
|
{
|
|
int32_t d;
|
|
int16_t a;
|
|
|
|
#define SWEEP ((DAC_HIGH - DAC_LOW) * (int32_t)2000 / 65535)
|
|
|
|
/* sweep range */
|
|
for (d = (int32_t)dac - SWEEP; d < (int32_t)dac + SWEEP; d++) {
|
|
if (d < DAC_LOW) {
|
|
uart1_put_dec(DAC_LOW);
|
|
uart1_put_string(" 0\r\n");
|
|
continue;
|
|
}
|
|
if (d > DAC_HIGH) {
|
|
uart1_put_dec(DAC_HIGH);
|
|
uart1_put_string(" 0\r\n");
|
|
continue;
|
|
}
|
|
dac_write(d);
|
|
msleep(1);
|
|
a = adc_get();
|
|
uart1_put_dec(d);
|
|
uart1_put(' ');
|
|
uart1_put_dec(a);
|
|
uart1_crlf();
|
|
}
|
|
}
|
|
|
|
void run_debug(void)
|
|
{
|
|
int16_t adc;
|
|
int32_t v;
|
|
char buf[4];
|
|
uart1_init(115200);
|
|
|
|
led_pattern(0b10101010);
|
|
|
|
uart1_put_string("Zoom NILM Debug\r\n");
|
|
|
|
while (1) {
|
|
dac = dac & DAC_HIGH; // mask off invalid bits
|
|
dac_write(dac);
|
|
uart1_put_hex16(dac);
|
|
uart1_put(' ');
|
|
uart1_put_dec(dac_get_actual_16bit(dac));
|
|
uart1_put(' ');
|
|
uart1_put(' ');
|
|
adc = adc_get();
|
|
uart1_put_hex16(adc);
|
|
uart1_put(' ');
|
|
uart1_put_dec(adc);
|
|
uart1_crlf();
|
|
switch (uart1_get()) {
|
|
|
|
// small step
|
|
case '[':
|
|
dac--;
|
|
break;
|
|
case ']':
|
|
dac++;
|
|
break;
|
|
|
|
// medium step
|
|
case '-':
|
|
dac -= 16;
|
|
break;
|
|
case '+':
|
|
case '=':
|
|
dac += 16;
|
|
break;
|
|
|
|
// big step
|
|
case ',':
|
|
case '<':
|
|
dac -= 1024;
|
|
break;
|
|
case '.':
|
|
case '>':
|
|
dac += 1024;
|
|
break;
|
|
|
|
// set DAC to midpoint
|
|
case '0':
|
|
dac = DAC_MID;
|
|
break;
|
|
|
|
// set DAC to specified hex value
|
|
case 'v':
|
|
case 'V':
|
|
buf[0] = uart1_get();
|
|
buf[1] = uart1_get();
|
|
buf[2] = uart1_get();
|
|
buf[3] = uart1_get();
|
|
v = hex_to_u16(buf);
|
|
if (v < 0)
|
|
uart1_put_string("bad value\r\n");
|
|
else
|
|
dac = v;
|
|
break;
|
|
|
|
// maintain ADC input at zero
|
|
case 'z':
|
|
case 'Z':
|
|
uart1_put_string("zeroing input...\r\n");
|
|
while (!uart1_can_get())
|
|
dac = seek(dac, 1024);
|
|
uart1_get();
|
|
break;
|
|
|
|
// test seeking
|
|
case '1':
|
|
uart1_put_string("seek 512\r\n");
|
|
dac = seek(dac, 512);
|
|
break;
|
|
|
|
case '2':
|
|
uart1_put_string("seek 1536\r\n");
|
|
dac = seek(dac, 1536);
|
|
break;
|
|
|
|
// run calibration
|
|
case 'c':
|
|
case 'C':
|
|
uart1_put_string("calibrating...\r\n");
|
|
dac = do_calibrate();
|
|
uart1_put_string("new g_scale ");
|
|
uart1_put_float(g_scale);
|
|
uart1_crlf();
|
|
break;
|
|
|
|
// sweep DAC
|
|
case 's':
|
|
case 'S':
|
|
uart1_put_string("sweep around ");
|
|
uart1_put_dec(dac);
|
|
uart1_crlf();
|
|
sweep();
|
|
break;
|
|
// dump raw ADC value
|
|
case 'r':
|
|
case 'R':
|
|
while(!uart1_can_get()) {
|
|
uart1_put_hex16(adc_get_raw());
|
|
uart1_crlf();
|
|
}
|
|
uart1_get();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|