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

Dependencies:   mbed FastAnalogIn PID mbed-rtos

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?

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