You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

167 lines
2.7 KiB

  1. #include "config.h"
  2. #include "adc.h"
  3. #include "dac.h"
  4. #include "uart.h"
  5. #include "timer.h"
  6. #include <stdio.h>
  7. #include <math.h>
  8. #include "calibrate.h"
  9. #include "util.h"
  10. #include "led.h"
  11. #include "mode.h"
  12. static uint16_t dac = DAC_MID;
  13. void sweep(void)
  14. {
  15. int32_t d;
  16. int16_t a;
  17. #define SWEEP ((DAC_HIGH - DAC_LOW) * (int32_t)2000 / 65535)
  18. /* sweep range */
  19. for (d = (int32_t)dac - SWEEP; d < (int32_t)dac + SWEEP; d++) {
  20. if (d < DAC_LOW) {
  21. uart1_put_dec(DAC_LOW);
  22. uart1_put_string(" 0\r\n");
  23. continue;
  24. }
  25. if (d > DAC_HIGH) {
  26. uart1_put_dec(DAC_HIGH);
  27. uart1_put_string(" 0\r\n");
  28. continue;
  29. }
  30. dac_write(d);
  31. msleep(1);
  32. a = adc_get();
  33. uart1_put_dec(d);
  34. uart1_put(' ');
  35. uart1_put_dec(a);
  36. uart1_crlf();
  37. }
  38. }
  39. void run_debug(void)
  40. {
  41. int16_t adc;
  42. int32_t v;
  43. char buf[4];
  44. uart1_init(115200);
  45. led_pattern(0b10101010);
  46. uart1_put_string("Zoom NILM Debug\r\n");
  47. while (1) {
  48. dac = dac & DAC_HIGH; // mask off invalid bits
  49. dac_write(dac);
  50. uart1_put_hex16(dac);
  51. uart1_put(' ');
  52. uart1_put_dec(dac_get_actual_16bit(dac));
  53. uart1_put(' ');
  54. uart1_put(' ');
  55. adc = adc_get();
  56. uart1_put_hex16(adc);
  57. uart1_put(' ');
  58. uart1_put_dec(adc);
  59. uart1_crlf();
  60. switch (uart1_get()) {
  61. // small step
  62. case '[':
  63. dac--;
  64. break;
  65. case ']':
  66. dac++;
  67. break;
  68. // medium step
  69. case '-':
  70. dac -= 16;
  71. break;
  72. case '+':
  73. case '=':
  74. dac += 16;
  75. break;
  76. // big step
  77. case ',':
  78. case '<':
  79. dac -= 1024;
  80. break;
  81. case '.':
  82. case '>':
  83. dac += 1024;
  84. break;
  85. // set DAC to midpoint
  86. case '0':
  87. dac = DAC_MID;
  88. break;
  89. // set DAC to specified hex value
  90. case 'v':
  91. case 'V':
  92. buf[0] = uart1_get();
  93. buf[1] = uart1_get();
  94. buf[2] = uart1_get();
  95. buf[3] = uart1_get();
  96. v = hex_to_u16(buf);
  97. if (v < 0)
  98. uart1_put_string("bad value\r\n");
  99. else
  100. dac = v;
  101. break;
  102. // maintain ADC input at zero
  103. case 'z':
  104. case 'Z':
  105. uart1_put_string("zeroing input...\r\n");
  106. while (!uart1_can_get())
  107. dac = seek(dac, 1024);
  108. uart1_get();
  109. break;
  110. // test seeking
  111. case '1':
  112. uart1_put_string("seek 512\r\n");
  113. dac = seek(dac, 512);
  114. break;
  115. case '2':
  116. uart1_put_string("seek 1536\r\n");
  117. dac = seek(dac, 1536);
  118. break;
  119. // run calibration
  120. case 'c':
  121. case 'C':
  122. uart1_put_string("calibrating...\r\n");
  123. dac = do_calibrate();
  124. uart1_put_string("new g_scale ");
  125. uart1_put_float(g_scale);
  126. uart1_crlf();
  127. break;
  128. // sweep DAC
  129. case 's':
  130. case 'S':
  131. uart1_put_string("sweep around ");
  132. uart1_put_dec(dac);
  133. uart1_crlf();
  134. sweep();
  135. break;
  136. // dump raw ADC value
  137. case 'r':
  138. case 'R':
  139. while(!uart1_can_get()) {
  140. uart1_put_hex16(adc_get_raw());
  141. uart1_crlf();
  142. }
  143. uart1_get();
  144. break;
  145. }
  146. }
  147. }