Drain batteries through an LM324 controlled CEB6030L from a defunct graphics card

Dependencies:   mbed FastAnalogIn PID mbed-rtos

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?

UserRevisionLine numberNew 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 }