Drain batteries through an LM324 controlled CEB6030L from a defunct graphics card
Dependencies: mbed FastAnalogIn PID mbed-rtos
main.cpp@2:e7ce63ada1d2, 2016-07-05 (annotated)
- Committer:
- eisd
- Date:
- Tue Jul 05 11:57:09 2016 +0000
- Revision:
- 2:e7ce63ada1d2
- Parent:
- 1:712b9b5470d4
- Child:
- 3:08488e544b3e
PID and current calibration
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 | 0:e7492a4f4b2f | 12 | float k = 0.01, iget = Iget.read(), vbat = Vbat.read(), vbat_rest = Vbat.read(); |
eisd | 0:e7492a4f4b2f | 13 | void filter() { |
eisd | 2:e7ce63ada1d2 | 14 | if (active) { |
eisd | 2:e7ce63ada1d2 | 15 | iget = k * Iget.read() * 32.9697 + 0.0001666 + (1 - k) * iget; |
eisd | 2:e7ce63ada1d2 | 16 | vbat = k * Vbat.read() * 36.7538 + (1 - k) * vbat; |
eisd | 2:e7ce63ada1d2 | 17 | } |
eisd | 0:e7492a4f4b2f | 18 | if (Iset.read() == 0) |
eisd | 2:e7ce63ada1d2 | 19 | vbat_rest = k * Vbat.read() * 36.7538 + (1 - k) * vbat_rest; |
eisd | 0:e7492a4f4b2f | 20 | } |
eisd | 1:712b9b5470d4 | 21 | void rest(const void *) { |
eisd | 1:712b9b5470d4 | 22 | while (true) { |
eisd | 1:712b9b5470d4 | 23 | Thread::wait(5000); |
eisd | 2:e7ce63ada1d2 | 24 | if (Iset.read() > 0) { |
eisd | 2:e7ce63ada1d2 | 25 | active = false; |
eisd | 2:e7ce63ada1d2 | 26 | Iset.write_u16(16); |
eisd | 2:e7ce63ada1d2 | 27 | Thread::wait(400); |
eisd | 2:e7ce63ada1d2 | 28 | Iset.write_u16(0); |
eisd | 2:e7ce63ada1d2 | 29 | Thread::wait(100); |
eisd | 2:e7ce63ada1d2 | 30 | active = true; |
eisd | 2:e7ce63ada1d2 | 31 | } |
eisd | 2:e7ce63ada1d2 | 32 | } |
eisd | 2:e7ce63ada1d2 | 33 | } |
eisd | 2:e7ce63ada1d2 | 34 | int flop = 0; |
eisd | 2:e7ce63ada1d2 | 35 | void adjust() { |
eisd | 2:e7ce63ada1d2 | 36 | //flop = (flop + 1) % 4; |
eisd | 2:e7ce63ada1d2 | 37 | //Iset.write(flop == 0? 0.2/4.61 : 0); |
eisd | 2:e7ce63ada1d2 | 38 | if (active) { |
eisd | 2:e7ce63ada1d2 | 39 | I.setProcessValue(iget); |
eisd | 2:e7ce63ada1d2 | 40 | Iset = I.compute(); |
eisd | 1:712b9b5470d4 | 41 | } |
eisd | 1:712b9b5470d4 | 42 | } |
eisd | 2:e7ce63ada1d2 | 43 | |
eisd | 2:e7ce63ada1d2 | 44 | Serial pc(USBTX, USBRX); |
eisd | 2:e7ce63ada1d2 | 45 | void ui(const void*) { |
eisd | 2:e7ce63ada1d2 | 46 | while (true) { |
eisd | 2:e7ce63ada1d2 | 47 | Thread::wait(100); |
eisd | 2:e7ce63ada1d2 | 48 | while (pc.readable()) { |
eisd | 2:e7ce63ada1d2 | 49 | pc.getc(); |
eisd | 2:e7ce63ada1d2 | 50 | I = I + 0.1; |
eisd | 2:e7ce63ada1d2 | 51 | } |
eisd | 2:e7ce63ada1d2 | 52 | } |
eisd | 2:e7ce63ada1d2 | 53 | } |
eisd | 2:e7ce63ada1d2 | 54 | |
eisd | 0:e7492a4f4b2f | 55 | int main() |
eisd | 0:e7492a4f4b2f | 56 | { |
eisd | 2:e7ce63ada1d2 | 57 | pc.baud(115200); |
eisd | 2:e7ce63ada1d2 | 58 | |
eisd | 2:e7ce63ada1d2 | 59 | I.setInputLimits(0, 100); |
eisd | 2:e7ce63ada1d2 | 60 | I.setOutputLimits(0, 1); |
eisd | 2:e7ce63ada1d2 | 61 | I = 0; |
eisd | 2:e7ce63ada1d2 | 62 | I.setMode(AUTO_MODE); |
eisd | 2:e7ce63ada1d2 | 63 | |
eisd | 0:e7492a4f4b2f | 64 | Ticker t2; |
eisd | 0:e7492a4f4b2f | 65 | t2.attach_us(&filter, 1000); |
eisd | 2:e7ce63ada1d2 | 66 | Ticker t; |
eisd | 2:e7ce63ada1d2 | 67 | t.attach(&adjust, I.getInterval()); |
eisd | 1:712b9b5470d4 | 68 | Thread t3(&rest); |
eisd | 2:e7ce63ada1d2 | 69 | Thread t4(&ui); |
eisd | 0:e7492a4f4b2f | 70 | |
eisd | 0:e7492a4f4b2f | 71 | while (true) { |
eisd | 0:e7492a4f4b2f | 72 | //pc.printf("Iset %f Iget %6d %f Vbat %6d %f \r", Iset.read(), Iget.read_u16(), Iget.read(), Vbat.read_u16(), Vbat.read()); |
eisd | 2:e7ce63ada1d2 | 73 | pc.printf("Iset %f Iget %8d %f %f", Iset.read(), Iget.read_u16(), Iget.read() * 32.9697 + 0.0001666, iget); |
eisd | 2:e7ce63ada1d2 | 74 | pc.printf(" Vbat %8d %f %f %f\r", Vbat.read_u16(), Vbat.read() * 36.7538, vbat, vbat_rest); |
eisd | 1:712b9b5470d4 | 75 | Thread::wait(500); |
eisd | 0:e7492a4f4b2f | 76 | } |
eisd | 0:e7492a4f4b2f | 77 | } |