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.
 
 
 
 

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