7 uint16_t track_current_samples[16] = { 0 };
8 uint8_t track_current_head = 0;
9 volatile uint16_t track_current_sum = 0;
10 uint16_t overcurrent_limit = 1000<<4;
11 uint8_t overcurrent_sent = 0;
13 uint16_t input_voltage_samples[16] = { 0 };
14 uint8_t input_voltage_head = 0;
15 volatile uint16_t input_voltage_sum = 0;
17 volatile uint8_t adc_state = 0;
29 adc_read_async(adc_state>>1);
32 if(track_current_sum>overcurrent_limit)
39 serial_write(OVERCURRENT);
46 uint8_t monitor_command()
48 if(cmd_buf[0]==READ_TRACK_CURRENT)
54 serial_write(TRACK_CURRENT);
55 uint16_t value = track_current_sum>>4;
56 serial_write(value>>8);
59 else if(cmd_buf[0]==SET_OVERCURRENT_LIMIT)
67 overcurrent_limit = (cmd_buf[1]<<12) | (cmd_buf[2]<<4);
69 else if(cmd_buf[0]==READ_INPUT_VOLTAGE)
75 serial_write(INPUT_VOLTAGE);
76 uint16_t value = (input_voltage_sum>>3)*5;
77 serial_write(value>>8);
81 return INVALID_COMMAND;
86 static inline void adc_complete(uint16_t value)
90 // Convert to milliamps: (v*5/1024-2.5)*1000/0.185
91 if(value<512) // Ignore negative current readings
93 else if(value>663) // Limit range so averaging won't overflow
96 value = (value-512)*132/5;
98 uint8_t i = track_current_head;
99 track_current_sum -= track_current_samples[i];
100 track_current_samples[i] = value;
101 track_current_sum += value;
102 track_current_head = (i+1)&15;
104 else if(adc_state==3)
106 // Convert to centivolts: (v*5/1024)*100*11
107 if(value>744) // Limit range so averaging won't overflow
112 uint8_t i = input_voltage_head;
113 input_voltage_sum -= input_voltage_samples[i];
114 input_voltage_samples[i] = value;
115 input_voltage_sum += value;
116 input_voltage_head = (i+1)&15;
122 ADC_SET_CALLBACK(adc_complete)