#include "config.h" #include "adc.h" #include "dac.h" #include "uart.h" #include "timer.h" #include #include #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; } } }