Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SPI_TFTx2 SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2 mbed
Fork of CANary_9341 by
Revision 102:fd19f777a0b4, committed 2013-06-20
- Comitter:
- TickTock
- Date:
- Thu Jun 20 05:35:36 2013 +0000
- Branch:
- Metric
- Parent:
- 101:94b8aca2d47a
- Child:
- 103:1389e9efe8c3
- Commit message:
- Added Ah, SOH, and more precise temperature measurement.
Changed in this revision
--- a/common.h Sat Jun 15 19:05:32 2013 +0000 +++ b/common.h Thu Jun 20 05:35:36 2013 +0000 @@ -24,13 +24,22 @@ #define canTimeout 5 #define userTimeout 15 -#define BatDataBaseG1 0x24 -#define BatDataBaseG2 0x00 // Cell Pair data -#define BatDataBaseG3 0x2B -#define BatDataBaseG4 0x20 // Temperature data 0x20 * 7 = 224 -#define BatDataBaseG5 0x31 +//#define BatDataBaseG1 0x24 +//#define BatDataBaseG2 0x00 // Cell Pair data +//#define BatDataBaseG3 0x2B +//#define BatDataBaseG4 0x20 // Temperature data 0x20 * 7 = 224 +//#define BatDataBaseG5 0x31 +//#define BatDataBufMax 0x1B2 // 7 x 3E bytes + +#define BatDataBaseG1 0x00 // 6 frames - SOH, SOC, Ah +#define BatDataBaseG2 0x06 // 29 frames - Cell Pair data +#define BatDataBaseG3 0x23 // 5 frames +#define BatDataBaseG4 0x28 // 3 frames - Temperature data +#define BatDataBaseG5 0x2B // 11 frames +#define BatDataBaseG6 0x36 #define BatDataBufMax 0x1B2 // 7 x 3E bytes + // gg - 4x4 touch // #define tNavRow = 2 ; // for 3x3 extern unsigned char tNavRow ; // gg - 4x4
--- a/displayModes.cpp Sat Jun 15 19:05:32 2013 +0000
+++ b/displayModes.cpp Thu Jun 20 05:35:36 2013 +0000
@@ -73,9 +73,11 @@
void mainDisplay (bool force, bool showButtons){
unsigned short gids, SOC, packV;
- static unsigned short lgids=0, lSOC=0, lpackV=0, maxPS=0;
- static unsigned char lbattTemp_x4=0;
+ static unsigned short lgids=0, lSOC=0, lSOH=0, lpackV=0, maxPS=0;
+ //static unsigned char lbattTemp_x4=0;
+ static signed short lbattTemp_x10=0;
static float lkW=0, laccV=0, lmpkWh=0;
+ static unsigned long lAh=0;
CANMessage msg;
msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids
@@ -102,7 +104,7 @@
printf("%4.1f kWh \n",(float)(gids-5)*0.075);
tt.set_font((unsigned char*) SCProSB31x55);
tt.foreground(Green);
- tt.locate(60,96);
+ tt.locate(60,106);
printf("%4.1f %s \n",convertDistance(mpkWh[dtePeriod]*((float)(gids-5)*.075)),distanceUnit()); //LM - add metric conversion
lgids=gids;
lmpkWh=mpkWh[dtePeriod];
@@ -119,10 +121,13 @@
printf("%4.1fV \n",(float)packV/2);
lpackV=packV;
}
- if(force||battTemp_x4!=lbattTemp_x4){
+ //if(force||battTemp_x4!=lbattTemp_x4){
+ if(force||battTemp_x10!=lbattTemp_x10){
tt.locate(200,170);
- printf("%4.1f%s\n",convertTemperature((float)battTemp_x4*0.25f),temperatureUnit());
- lbattTemp_x4=battTemp_x4;
+ //printf("%4.1f%s\n",convertTemperature((float)battTemp_x4*0.25f),temperatureUnit());
+ printf("%4.1f%s\n",convertTemperature((float)battTemp_x10*0.1f),temperatureUnit());
+ //lbattTemp_x4=battTemp_x4;
+ lbattTemp_x10=battTemp_x10;
}
if(force||accV!=laccV){
tt.locate(20,200);
@@ -130,11 +135,21 @@
laccV=accV;
}
if(force||kW[0]!=lkW){
- tt.locate(180,40);
+ tt.locate(180,70);
printf("%3.2fkW \n",kW[0]);
//printf("%3.1f mpkWh \n",mpkWh[0]);
lkW=kW[0];
}
+ if(force||Ah_x10000!=lAh){
+ tt.locate(10,70);
+ printf("%4.2fAh \n",(float)Ah_x10000/10000);
+ lAh=Ah_x10000;
+ }
+ if(force||SOH_x100!=lSOH){
+ tt.locate(180,40);
+ printf("%3.1f%s\n",(float)SOH_x100/100,"% ");
+ lSOH=SOH_x100;
+ }
}else {//if(skin==ggSkin){
if(force||gids!=lgids){
tt.locate(10,10);
@@ -350,13 +365,13 @@
break;
case 1:
tt.locate(0,6);
- // BatDataBaseG4 * 7 = 224
+ // BatDataBaseG4 * 7 = 280
char* sTemperatureUnit = temperatureUnit();
printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %2.0f%s %2.0f%s %2.0f%s %2.0f%s\n\n",
- max,min,avg,jv, convertTemperature(battData[224+5]),sTemperatureUnit,convertTemperature(battData[224+8]),sTemperatureUnit,
- convertTemperature(battData[224+11]),sTemperatureUnit,convertTemperature(battData[224+14]),sTemperatureUnit);
+ max,min,avg,jv, convertTemperature(battData[(BatDataBaseG4*7)+5]),sTemperatureUnit,convertTemperature(battData[(BatDataBaseG4*7)+8]),sTemperatureUnit,
+ convertTemperature(battData[(BatDataBaseG4*7)+11]),sTemperatureUnit,convertTemperature(battData[(BatDataBaseG4*7)+14]),sTemperatureUnit);
//printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",
- // max,min,avg,jv, battData[224+5],battData[224+8],battData[224+11],battData[224+14]);
+ // max,min,avg,jv, battData[(BatDataBaseG4*7)+5],battData[(BatDataBaseG4*7)+8],battData[(BatDataBaseG4*7)+11],battData[(BatDataBaseG4*7)+14]);
tt.rect(8+0*41,16,40+0*41,28,Green);
tt.rect(8+1*41,16,40+1*41,28,Yellow);
//tt.rect(8+2*41,16,40+2*41,28,White);
@@ -510,10 +525,10 @@
}
// values, for now
- // BatDataBaseG4 * 7 = 224
+ // BatDataBaseG4 * 7 = 280
tt.locate( 0, yWinMax+40 );
printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",
- max,min,avg,jv, battData[224+5],battData[224+8], battData[224+11],battData[224+14]);
+ max,min,avg,jv, battData[(BatDataBaseG4*7)+5],battData[(BatDataBaseG4*7)+8], battData[(BatDataBaseG4*7)+11],battData[(BatDataBaseG4*7)+14]);
// label the X axis (approximate)
tt.locate( 2, yWinMax+5); printf("%04d", min );
@@ -633,10 +648,10 @@
}
// the values, for now
- // BatDataBaseG4 * 7 = 224
+ // BatDataBaseG4 * 7 = 280
tt.locate( 0, yWinMax+40 );
printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",
- max,min,avg,jv, battData[224+5],battData[224+8], battData[224+11],battData[224+14]);
+ max,min,avg,jv, battData[(BatDataBaseG4*7)+5],battData[(BatDataBaseG4*7)+8], battData[(BatDataBaseG4*7)+11],battData[(BatDataBaseG4*7)+14]);
//---------------
// show the bars
--- a/displayModes.h Sat Jun 15 19:05:32 2013 +0000
+++ b/displayModes.h Thu Jun 20 05:35:36 2013 +0000
@@ -41,6 +41,10 @@
extern unsigned char tNavRow; // gg - 4x4
extern unsigned short pointerSep; // log write buffer pointer separation
extern unsigned char battTemp_x4;
+extern signed short battTemp_x10;
+extern unsigned long Ah_x10000;
+extern unsigned long SOC_x10000;
+extern unsigned short SOH_x100;
extern bool metric;
extern "C" {
--- a/main.cpp Sat Jun 15 19:05:32 2013 +0000
+++ b/main.cpp Thu Jun 20 05:35:36 2013 +0000
@@ -2,7 +2,7 @@
//To Do:
// * USB device detect
-// * Ability to update binary from the thumb-drive (requires file timestamp)
+// * Enable file timestamps
// * Audible friction brake feedback
// * User-configurable watchpoint
// * Add 50% charge option
@@ -10,6 +10,20 @@
// * Fix bug in playback while connected to canbus (hangs)
// * Fix no power displayed while charging
// * Force regen display to zero when in neutral
+// * Add coasting regen to regen/braking display
+// * Change semilog efficiancy graph to linear with 10 minute values
+// * Add Trip meter (kWh and efficiency for current trip)
+// * Make unique sound when log file write fails and logging disabled
+// * Make display updates interruptable for log writes
+// * Add additional 79b bank readouts
+// * Add algorithmic temperature using raw ADC for better accuracy
+// * Display max temperature instead of average
+// * Ignore the missing 4th pemperature sensor on 2013 models
+// * Add ability to transfer settings config file to/from USB
+// * Add Ah & Health
+
+//Bugs:
+// *** Average temperature seems to only get 3 out of 4 on the first read
#include "mbed.h"
#include "CAN.h"
@@ -129,6 +143,10 @@
unsigned short pointerSep;
unsigned char reqMsgCnt = 99;
unsigned char battTemp_x4 = 0;
+unsigned long Ah_x10000 = 0;
+unsigned long SOC_x10000 = 0;
+unsigned short SOH_x100 = 0;
+signed short battTemp_x10 = 0;
bool metric = false;
int main() {
--- a/utility.cpp Sat Jun 15 19:05:32 2013 +0000
+++ b/utility.cpp Thu Jun 20 05:35:36 2013 +0000
@@ -50,6 +50,7 @@
char sTemp[40];
unsigned char changed;
unsigned short i; // was unsigned char
+ signed short j;
signed short packV;
signed short packA;
signed long imWs_x4;
@@ -258,14 +259,35 @@
lasti=i; //remember the msb to detect rollover next time around
i+=bdi;
//-------
- if(i==BatDataBaseG4+2){ // Last of Temperature data
+ if(i==BatDataBaseG5){ // Last of Temperature data was loaded last time
logCP=yesBattLog; // Only log if logging enabled
showCP=true; // Always show
- battTemp_x4=battData[224+5]+battData[224+8]+battData[224+11]+battData[224+14];
+ // 2013 models only have three sensors
+ battTemp_x4=battData[(BatDataBaseG4*7)+5]+battData[(BatDataBaseG4*7)+8]+battData[(BatDataBaseG4*7)+11]+battData[(BatDataBaseG4*7)+14];
+ // Or =25+(467-ADC)/9.33 (C)
+ // Find hottest temperature
+ battTemp_x10=467-(battData[(BatDataBaseG4*7)+3]*0x100+battData[(BatDataBaseG4*7)+4]);
+ j=467-(battData[(BatDataBaseG4*7)+6]*0x100+battData[(BatDataBaseG4*7)+7]);
+ if(j>battTemp_x10){
+ battTemp_x10=j;
+ }
+ j=467-(battData[(BatDataBaseG4*7)+9]*0x100+battData[(BatDataBaseG4*7)+10]);
+ if(j>battTemp_x10){
+ battTemp_x10=j;
+ }
+ j=467-(battData[(BatDataBaseG4*7)+12]*0x100+battData[(BatDataBaseG4*7)+13]);
+ if(j>battTemp_x10){
+ battTemp_x10=j;
+ }
+ battTemp_x10*=100;
+ battTemp_x10/=93;
+ battTemp_x10+=250;
+ SOH_x100=battData[(BatDataBaseG1*7)+29]*0x100+battData[(BatDataBaseG1*7)+30];
+ Ah_x10000=battData[(BatDataBaseG1*7)+36]*0x10000+battData[(BatDataBaseG1*7)+37]*0x100+battData[(BatDataBaseG1*7)+38];
+ SOC_x10000=battData[(BatDataBaseG1*7)+32]*0x10000+battData[(BatDataBaseG1*7)+33]*0x100+battData[(BatDataBaseG1*7)+34];
}
//-------
i*=7;
- //if(i<0xfa){ // Is there a better way to do this?
if(i+6 < BatDataBufMax) {
battData[i+0]=canRXmsg.data[1];
battData[i+1]=canRXmsg.data[2];
@@ -337,36 +359,36 @@
static char data[8] = {0x02, 0x21, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff};
if(reqMsgCnt<99){
switch (reqMsgCnt){
- case 0:
+ case BatDataBaseG1:
can1.monitor(false); // set to active mode
can1SleepMode = 0; // enable TX
data[0]=0x02; //change to request group 1
data[1]=0x21;
data[2]=0x01;
break;
- case 6: // group 1 has 6 frames
+ case BatDataBaseG2: // group 1 has 6 frames
can1.monitor(false); // set to active mode
can1SleepMode = 0; // enable TX
data[0]=0x02; //change to request group 2 (cp data)
data[1]=0x21;
data[2]=0x02;
break;
- case 35: // group 2 has 29 frames
+ case BatDataBaseG3: // group 2 has 29 frames
data[0]=0x02; //change to request group 3
data[1]=0x21;
data[2]=0x03;
break;
- case 40: // group 3 has 5 frames
+ case BatDataBaseG4: // group 3 has 5 frames
data[0]=0x02; //change to request group 4 (temperature)
data[1]=0x21;
data[2]=0x04;
break;
- case 43: // group 4 has 3 frames
+ case BatDataBaseG5: // group 4 has 3 frames
data[0]=0x02; //change to request group 5
data[1]=0x21;
data[2]=0x05;
break;
- case 54: // group 5 has 11 frames
+ case BatDataBaseG6: // group 5 has 11 frames
reqMsgCnt = 99;
can1SleepMode = 1; // disable TX
can1.monitor(true); // set to snoop mode
@@ -474,9 +496,9 @@
// NOTE: calibrates screen 1 first, then screen 0.
saveConfig();
} else {
- ledHi = 0.823;
+ ledHi = 0.8;
ledLo = 0.1;
- pollInt = 300;
+ pollInt = 60;
scale12V = 16.2;
skin = ttSkin;
fscanf(cfile, "format %d\r\n", &ff );
@@ -623,9 +645,9 @@
if(bfile!=NULL) {
strftime(sTemp, 40, "%a %m/%d/%Y %X", &t);
fprintf(bfile,"%s,%d,%5.1f%%,%5.1f,%5.1f,%d,%d,%d,%d,%d",sTemp,gids,(float)SOC/10,(float)packV/2,(float)packA/2,max,min,avg,max-min,jv);
- // BatDataBaseG4 * 7 = 224
- fprintf(bfile,"%d,%d,%d,%d,",(battData[224+ 3]<<8)+battData[224+ 4],battData[224+ 5],(battData[224+ 6]<<8)+battData[224+ 7],battData[224+ 8]);
- fprintf(bfile,"%d,%d,%d,%d", (battData[224+ 9]<<8)+battData[224+10],battData[224+11],(battData[224+12]<<8)+battData[224+13],battData[224+14]);
+ // BatDataBaseG4 * 7 = (BatDataBaseG4*7)
+ fprintf(bfile,"%d,%d,%d,%d,",(battData[(BatDataBaseG4*7)+ 3]<<8)+battData[(BatDataBaseG4*7)+ 4],battData[(BatDataBaseG4*7)+ 5],(battData[(BatDataBaseG4*7)+ 6]<<8)+battData[(BatDataBaseG4*7)+ 7],battData[(BatDataBaseG4*7)+ 8]);
+ fprintf(bfile,"%d,%d,%d,%d", (battData[(BatDataBaseG4*7)+ 9]<<8)+battData[(BatDataBaseG4*7)+10],battData[(BatDataBaseG4*7)+11],(battData[(BatDataBaseG4*7)+12]<<8)+battData[(BatDataBaseG4*7)+13],battData[(BatDataBaseG4*7)+14]);
for(i=0; i<96; i++) {
bd=(battData[i*2+3]<<8)+battData[i*2+4];
fprintf(bfile,",%d",bd);
--- a/utility.h Sat Jun 15 19:05:32 2013 +0000 +++ b/utility.h Thu Jun 20 05:35:36 2013 +0000 @@ -55,6 +55,10 @@ extern Beep spkr; extern unsigned char reqMsgCnt; extern unsigned char battTemp_x4; +extern signed short battTemp_x10; +extern unsigned long Ah_x10000; +extern unsigned long SOC_x10000; +extern unsigned short SOH_x100; extern bool metric; extern unsigned char lastDMode[2]; extern unsigned char whichTouched;
