Drain batteries through an LM324 controlled CEB6030L from a defunct graphics card
Dependencies: mbed FastAnalogIn PID mbed-rtos
main.cpp@3:08488e544b3e, 2016-07-05 (annotated)
- Committer:
- eisd
- Date:
- Tue Jul 05 12:39:11 2016 +0000
- Revision:
- 3:08488e544b3e
- Parent:
- 2:e7ce63ada1d2
- Child:
- 4:fb20b0b3f57d
Voltage calibration; lag filter wrapper
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
eisd | 0:e7492a4f4b2f | 1 | #include "mbed.h" |
eisd | 0:e7492a4f4b2f | 2 | #include "rtos.h" |
eisd | 0:e7492a4f4b2f | 3 | #include "FastAnalogIn.h" |
eisd | 2:e7ce63ada1d2 | 4 | #include "PID.h" |
eisd | 2:e7ce63ada1d2 | 5 | |
eisd | 2:e7ce63ada1d2 | 6 | PID I(10.0, 0.01, 0.0, 0.01); |
eisd | 0:e7492a4f4b2f | 7 | |
eisd | 0:e7492a4f4b2f | 8 | AnalogOut Iset(PTE30); |
eisd | 0:e7492a4f4b2f | 9 | FastAnalogIn Iget(PTE20); |
eisd | 0:e7492a4f4b2f | 10 | AnalogIn Vbat(PTB0); |
eisd | 2:e7ce63ada1d2 | 11 | bool active = true; |
eisd | 3:08488e544b3e | 12 | |
eisd | 3:08488e544b3e | 13 | class Lag { |
eisd | 3:08488e544b3e | 14 | float k, v; |
eisd | 3:08488e544b3e | 15 | public: |
eisd | 3:08488e544b3e | 16 | Lag(float seed, float factor = 0.005) { v = seed; k = factor; } |
eisd | 3:08488e544b3e | 17 | float operator()(float in) { return v = k * in + (1 - k) * v; } |
eisd | 3:08488e544b3e | 18 | operator float() { return v; } |
eisd | 3:08488e544b3e | 19 | }; |
eisd | 3:08488e544b3e | 20 | inline float Iin(float x) { return x * 32.9697 + 1/60.0; } |
eisd | 3:08488e544b3e | 21 | inline float Vin(float x) { return x * 34.08516 + 0.06567447; } |
eisd | 3:08488e544b3e | 22 | |
eisd | 3:08488e544b3e | 23 | Lag iget(Iin(Iget.read())), vbat(Vin(Vbat.read())), vbat_rest(Vin(Vbat.read())); |
eisd | 0:e7492a4f4b2f | 24 | void filter() { |
eisd | 2:e7ce63ada1d2 | 25 | if (active) { |
eisd | 3:08488e544b3e | 26 | iget(Iin(Iget.read())); |
eisd | 3:08488e544b3e | 27 | vbat(Vin(Vbat.read())); |
eisd | 2:e7ce63ada1d2 | 28 | } |
eisd | 0:e7492a4f4b2f | 29 | if (Iset.read() == 0) |
eisd | 3:08488e544b3e | 30 | vbat_rest(Vin(Vbat.read())); |
eisd | 0:e7492a4f4b2f | 31 | } |
eisd | 1:712b9b5470d4 | 32 | void rest(const void *) { |
eisd | 1:712b9b5470d4 | 33 | while (true) { |
eisd | 1:712b9b5470d4 | 34 | Thread::wait(5000); |
eisd | 2:e7ce63ada1d2 | 35 | if (Iset.read() > 0) { |
eisd | 2:e7ce63ada1d2 | 36 | active = false; |
eisd | 2:e7ce63ada1d2 | 37 | Iset.write_u16(16); |
eisd | 2:e7ce63ada1d2 | 38 | Thread::wait(400); |
eisd | 2:e7ce63ada1d2 | 39 | Iset.write_u16(0); |
eisd | 2:e7ce63ada1d2 | 40 | Thread::wait(100); |
eisd | 2:e7ce63ada1d2 | 41 | active = true; |
eisd | 2:e7ce63ada1d2 | 42 | } |
eisd | 2:e7ce63ada1d2 | 43 | } |
eisd | 2:e7ce63ada1d2 | 44 | } |
eisd | 2:e7ce63ada1d2 | 45 | int flop = 0; |
eisd | 2:e7ce63ada1d2 | 46 | void adjust() { |
eisd | 2:e7ce63ada1d2 | 47 | //flop = (flop + 1) % 4; |
eisd | 2:e7ce63ada1d2 | 48 | //Iset.write(flop == 0? 0.2/4.61 : 0); |
eisd | 2:e7ce63ada1d2 | 49 | if (active) { |
eisd | 2:e7ce63ada1d2 | 50 | I.setProcessValue(iget); |
eisd | 2:e7ce63ada1d2 | 51 | Iset = I.compute(); |
eisd | 1:712b9b5470d4 | 52 | } |
eisd | 1:712b9b5470d4 | 53 | } |
eisd | 2:e7ce63ada1d2 | 54 | |
eisd | 2:e7ce63ada1d2 | 55 | Serial pc(USBTX, USBRX); |
eisd | 2:e7ce63ada1d2 | 56 | void ui(const void*) { |
eisd | 2:e7ce63ada1d2 | 57 | while (true) { |
eisd | 2:e7ce63ada1d2 | 58 | Thread::wait(100); |
eisd | 2:e7ce63ada1d2 | 59 | while (pc.readable()) { |
eisd | 2:e7ce63ada1d2 | 60 | pc.getc(); |
eisd | 2:e7ce63ada1d2 | 61 | I = I + 0.1; |
eisd | 2:e7ce63ada1d2 | 62 | } |
eisd | 2:e7ce63ada1d2 | 63 | } |
eisd | 2:e7ce63ada1d2 | 64 | } |
eisd | 2:e7ce63ada1d2 | 65 | |
eisd | 0:e7492a4f4b2f | 66 | int main() |
eisd | 0:e7492a4f4b2f | 67 | { |
eisd | 2:e7ce63ada1d2 | 68 | pc.baud(115200); |
eisd | 2:e7ce63ada1d2 | 69 | |
eisd | 2:e7ce63ada1d2 | 70 | I.setInputLimits(0, 100); |
eisd | 2:e7ce63ada1d2 | 71 | I.setOutputLimits(0, 1); |
eisd | 2:e7ce63ada1d2 | 72 | I = 0; |
eisd | 2:e7ce63ada1d2 | 73 | I.setMode(AUTO_MODE); |
eisd | 2:e7ce63ada1d2 | 74 | |
eisd | 0:e7492a4f4b2f | 75 | Ticker t2; |
eisd | 0:e7492a4f4b2f | 76 | t2.attach_us(&filter, 1000); |
eisd | 2:e7ce63ada1d2 | 77 | Ticker t; |
eisd | 2:e7ce63ada1d2 | 78 | t.attach(&adjust, I.getInterval()); |
eisd | 1:712b9b5470d4 | 79 | Thread t3(&rest); |
eisd | 2:e7ce63ada1d2 | 80 | Thread t4(&ui); |
eisd | 0:e7492a4f4b2f | 81 | |
eisd | 0:e7492a4f4b2f | 82 | while (true) { |
eisd | 0:e7492a4f4b2f | 83 | //pc.printf("Iset %f Iget %6d %f Vbat %6d %f \r", Iset.read(), Iget.read_u16(), Iget.read(), Vbat.read_u16(), Vbat.read()); |
eisd | 3:08488e544b3e | 84 | pc.printf("Iset %f Iget %8d %f %f", Iset.read(), Iget.read_u16(), Iin(Iget.read()), (float)iget); |
eisd | 3:08488e544b3e | 85 | pc.printf(" Vbat %8d %f %f %f\r", Vbat.read_u16(), Vin(Vbat.read()), (float)vbat, (float)vbat_rest); |
eisd | 1:712b9b5470d4 | 86 | Thread::wait(500); |
eisd | 0:e7492a4f4b2f | 87 | } |
eisd | 0:e7492a4f4b2f | 88 | } |