Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
ThaDipshit
Date:
Tue Jun 30 18:48:35 2015 +0000
Commit message:
Gauge dingen

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jun 30 18:48:35 2015 +0000
@@ -0,0 +1,134 @@
+#include "mbed.h"
+ 
+ I2C master(P0_29, P0_28);
+ Serial pc(USBTX, USBRX); // tx, rx
+ int gauge = 0x34 << 1;
+ DigitalOut led_full(P0_17);
+ DigitalOut led_low(P0_21);
+ 
+const char *byte_to_binary(int x)
+{
+    static char b[9];
+    b[0] = '\0';
+
+    int z;
+    for (z = 128; z > 0; z >>= 1)
+    {
+        strcat(b, ((x & z) == z) ? "1" : "0");
+    }
+
+    return b;
+}
+ 
+void write_register(int address, int value){
+    char data[2] = {address, value};
+    int status = master.write(gauge, data, 2);
+    printf( "  \"i2c.write()\" done. status = 0x%02X\r\n", status );
+}
+    
+    
+ int read_register(int address){
+    char reg_address[1] = {address};
+    char stored_value[2];
+    int readfail1, readfail2;
+    readfail1 = master.write(gauge, reg_address, 1, true);
+    readfail2 = master.read(gauge, stored_value, 1);
+    if (readfail1 | readfail2) {
+        pc.printf(" read failed ");
+    }
+    return (int)stored_value[0]; 
+}
+ 
+ 
+int read_voltage (void){
+    char data[2], volt_reg[1];     
+    volt_reg[0] = 0x0c;
+    int writefail, readfail;
+    writefail = master.write(gauge, volt_reg, 1, true);
+    readfail = master.read(gauge, data, 2);
+    //pc.printf("voltage readfail: %d, voltage writefail: %d \r\n", readfail,writefail);
+    int rawVolt= (((data[0] &~(1<<7))<<3)|((data[1]>>5)&0xF));
+    return (float)(rawVolt*4.88);      
+}
+
+int read_current(void) {
+    char data[2], curReg[1];
+    curReg[0] = 0x0E;
+    int rawCur;
+    master.write(gauge, curReg, 1, true);
+    master.read(gauge, data, 2);
+    if (data[0]>>7 == 1) {
+        rawCur = (((data[0]<<8)|data[1])^0xFFFF)+1;
+    } else {
+        rawCur = (((data[0]<<8)|data[1]));   
+    }
+    return (float)(rawCur*0.07813);
+}
+ 
+ int main() {
+    wait(4);   
+    int i = 0;
+    master.frequency(100000);
+
+        int ACRmsbA = 0x10, ACRlsbA = 0x11;
+        int ctrlA = 0x60, ABA = 0x61, acmsbA = 0x62, aclsbA = 0x63, vchgA = 0x64, iminA = 0x65, vaeA = 0x66, iaeA = 0x67, ae40A = 0x68, rsnsA = 0x69, full40msbA = 0x6a;
+        int full40lsbA = 0x6b, full3040A = 0x6c, full2030A = 0x6d, full1020A = 0x6e, full0010A = 0x6F, AE3040A = 0x70, AE2030A = 0x71, AE1020A = 0x72, AE0010A = 0x73;
+        int SE3040A = 0x74, SE2030A = 0x75, SE1020A = 0x76, SE0010A = 0x77;
+        
+        int ACRmsbV = 0x01; //estimation of current mAh msb, where lsb has a resolution of 312.5e-6 Ah
+        int ACRlsbV = 0xBD; //estimation of current mAh lsb, this totals 0x01BD (=4445) * 312.5e-6 = 0.139 Ah
+        int ctrlV = 0x40;
+        int ABV = 0x00; // accumulation bias = 0
+        int acmsbV = 0x01; //aging capacity, set to rated capacity for defaults
+        int aclsbV = 0xF0; // 0x07a0 (=1952) * 312.5e-6* = 0.610 Ah (grote batterij) 0x01F0 (=496) * 312.5e-6 = 0.155 Ah
+        int vchgV = 0xD0; // fully charged voltage = 0xD0 (=208) * 0.01952 = 4.06016 V
+        int iminV = 0x20; // maximum current to detect a fully charged state: 0x20 (=32) * 0.0025 [A] = 80 mA
+        int vaeV = 0xa0; //active empty voltage 0xa0 (=160) * 0.01952 = 3.1232 V
+        int iaeV = 0x03; //active empty current 0x03 (=3) * 0.01 [A] = 30 mA
+        int ae40V = 0x05; //zie ds2780 guide
+        int rsnsV = 0x32; // 1/0.02=50
+        int full40msbV = 0x01; //slightly less than rated capacity, which is stored in AC
+        int full40lsbV = 0xEA;
+        int full3040V = 0x0e, full2030V = 0x13, full1020V = 0x33, full0010V = 0x3b;
+        int AE3040V = 0x05, AE2030V = 0x0b, AE1020V = 0x12, AE0010V = 0x27;
+        int SE3040V = 0x03, SE2030V = 0x04, SE1020V = 0x07, SE0010V = 0x17;
+        
+        // niet vergeten vooraan addresses te zetten mocht learn niet lukken: ACRmsbA, ACRlsbA
+        // niet vergeten vooraan values te zetten mocht learn niet lukken: ACRmsbV, ACRlsbV
+        int addresses[] = {ctrlA, ABA, acmsbA, aclsbA, vchgA, iminA, vaeA, iaeA, ae40A, rsnsA, full40msbA, full40lsbA, full3040A, full2030A, full1020A, full0010A, AE3040A, AE2030A, AE1020A, AE0010A, SE3040A, SE2030A, SE1020A, SE0010A};
+        int values[] = {ctrlV, ABV, acmsbV, aclsbV, vchgV, iminV, vaeV, iaeV, ae40V, rsnsV, full40msbV, full40lsbV, full3040V, full2030V, full1020V, full0010V, AE3040V, AE2030V, AE1020V, AE0010V, SE3040V, SE2030V, SE1020V, SE0010V};
+        
+        //for ( i = 0; i <=  sizeof(addresses)/4-1; i++){
+        //    pc.printf("Writing into register: %d \t value: %d\r\n",addresses[i], values[i]); 
+        //    write_register( addresses[i], values[i] ); //write the register values to the shadow ram
+        //}
+        
+        //write_register( 0xFE, 0x44 ); // write the shadow ram to the EEPROM
+        write_register( 0xFE, 0xB4 ); // write the EEPROM values back to the registers
+        
+    while(1) {  
+        wait(2);
+        pc.printf("ingevulde registers:\n\r");               
+        for ( i = 0; i <= sizeof(addresses)/4-1; i++){
+            //test = read_register( addresses[i] );
+            pc.printf( "Reading from register: %d \t value: %d\n\r", addresses[i], read_register(addresses[i]) );
+        }
+        pc.printf("IAVG_msb: %d \t IAVG_lsb: %d \r\n", read_register(0x08), read_register(0x09));
+        pc.printf("current_msb: %d \t current_lsb: %d \r\n", read_register(0x0E), read_register(0x0F));
+        pc.printf("Status: %s\r\n", byte_to_binary(read_register(0x01)));
+        pc.printf("voltage: %d mV\r\n", read_voltage());
+        pc.printf("current: %d mA\r\n", read_current());
+        pc.printf("RARC : %d \r\n", read_register(0x06));
+        pc.printf("RAAC : %d \r\n", read_register(0x03));
+        if (read_register(0x06) >= 100) {
+            led_full = 1;
+        } else {
+            led_full = 0;
+        }
+        if (read_register(0x06) <= 15) {
+            led_low = 1;
+        } else {
+            led_low = 0;
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Jun 30 18:48:35 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/cbbeb26dbd92
\ No newline at end of file