102 #define AUTOMATIC_MODE_DISPLAY_DELAY 1000 103 #define SCAN_MODE_DISPLAY_DELAY 10000
104 const float resistor = .100;
107 const char ack_error[] =
"Error: No Acknowledge. Check I2C Address.";
122 Serial.begin(115200);
132 Serial.println(
"Did not read ID String, attempting to proceed anyway...\nPlease ensure I2C lines of Linduino are connected to the LTC device");
145 static uint8_t mAh_or_Coulombs = 0;
146 static uint8_t celcius_or_kelvin = 0;
148 static uint16_t prescalarValue = 4096;
153 if (Serial.available())
156 if (user_command !=
'm')
157 Serial.println(user_command);
160 switch (user_command)
163 ack |=
menu_1_automatic_mode(mAh_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode);
166 ack |=
menu_2_scan_mode(mAh_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode);
169 ack |=
menu_3_manual_mode(mAh_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode);
172 ack |=
menu_4_sleep_mode(mAh_or_Coulombs, prescalar_mode, prescalarValue, alcc_mode);
178 ack |=
menu_6_settings(&mAh_or_Coulombs, &celcius_or_kelvin, &prescalar_mode, &prescalarValue, &alcc_mode);
183 Serial.print(F(
"*************************"));
193 Serial.println(F(
"\n*****************************************************************"));
194 Serial.print(F(
"* DC1812A Demonstration Program *\n"));
195 Serial.print(F(
"* *\n"));
196 Serial.print(F(
"* This program communicates with the LTC2944 Multicell Coulomb *\n"));
197 Serial.print(F(
"* Counter found on the DC1812A demo board. *\n"));
198 Serial.print(F(
"* Set the baud rate to 115200 and select the newline terminator.*\n"));
199 Serial.print(F(
"* *\n"));
200 Serial.print(F(
"*****************************************************************\n"));
206 Serial.print(F(
"\n1-Automatic Mode\n"));
207 Serial.print(F(
"2-Scan Mode\n"));
208 Serial.print(F(
"3-Manual Mode\n"));
209 Serial.print(F(
"4-Sleep Mode\n"));
210 Serial.print(F(
"5-Shutdown Mode\n"));
211 Serial.print(F(
"6-Settings\n"));
212 Serial.print(F(
"Enter a command: "));
216 int8_t
menu_1_automatic_mode(int8_t mAh_or_Coulombs, int8_t celcius_or_kelvin ,uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode)
227 Serial.print(F(
"*************************\n\n"));
229 uint8_t status_code, hightemp_code, lowtemp_code;
230 uint16_t charge_code, current_code, voltage_code, temperature_code;
243 Serial.print(
"Coulombs: ");
244 Serial.print(charge, 4);
245 Serial.print(F(
" C\n"));
250 Serial.print(
"mAh: ");
251 Serial.print(charge, 4);
252 Serial.print(F(
" mAh\n"));
259 Serial.print(F(
"Current "));
260 Serial.print(current, 4);
261 Serial.print(F(
" A\n"));
263 Serial.print(F(
"Voltage "));
264 Serial.print(voltage, 4);
265 Serial.print(F(
" V\n"));
268 if (celcius_or_kelvin)
271 Serial.print(F(
"Temperature "));
272 Serial.print(temperature, 4);
273 Serial.print(F(
" K\n"));
278 Serial.print(F(
"Temperature "));
279 Serial.print(temperature, 4);
280 Serial.print(F(
" C\n"));
285 Serial.print(F(
"m-Main Menu\n\n"));
290 while (Serial.available() ==
false && !(ack));
296 int8_t
menu_2_scan_mode(int8_t mAh_or_Coulombs , int8_t celcius_or_kelvin ,uint16_t prescalar_mode,uint16_t prescalarValue, uint16_t alcc_mode)
307 Serial.print(F(
"*************************\n\n"));
310 uint16_t charge_code, current_code, voltage_code, temperature_code;
323 Serial.print(
"Coulombs: ");
324 Serial.print(charge, 4);
325 Serial.print(F(
" C\n"));
330 Serial.print(
"mAh: ");
331 Serial.print(charge, 4);
332 Serial.print(F(
" mAh\n"));
340 Serial.print(F(
"Current "));
341 Serial.print(current, 4);
342 Serial.print(F(
" A\n"));
344 Serial.print(F(
"Voltage "));
345 Serial.print(voltage, 4);
346 Serial.print(F(
" V\n"));
349 if (celcius_or_kelvin)
352 Serial.print(F(
"Temperature "));
353 Serial.print(temperature, 4);
354 Serial.print(F(
" K\n"));
359 Serial.print(F(
"Temperature "));
360 Serial.print(temperature, 4);
361 Serial.print(F(
" C\n"));
365 Serial.print(F(
"m-Main Menu\n\n"));
370 while (Serial.available() ==
false && !(ack));
377 int8_t
menu_3_manual_mode(int8_t mAh_or_Coulombs ,int8_t celcius_or_kelvin ,uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode)
390 Serial.print(F(
"*************************\n\n"));
393 uint16_t charge_code, current_code, voltage_code, temperature_code;
407 Serial.print(
"Coulombs: ");
408 Serial.print(charge, 4);
409 Serial.print(F(
" C\n"));
414 Serial.print(
"mAh: ");
415 Serial.print(charge, 4);
416 Serial.print(F(
" mAh\n"));
424 Serial.print(F(
"Current "));
425 Serial.print(current, 4);
426 Serial.print(F(
" A"));
427 if (staleData) Serial.print(F(
" ***** Stale Data ******\n"));
428 else Serial.println(
"");
430 Serial.print(F(
"Voltage "));
431 Serial.print(voltage, 4);
432 Serial.print(F(
" V"));
433 if (staleData) Serial.print(F(
" ***** Stale Data ******\n"));
434 else Serial.println(
"");
437 if (celcius_or_kelvin)
440 Serial.print(F(
"Temperature "));
441 Serial.print(temperature, 4);
442 Serial.print(F(
" K"));
447 Serial.print(F(
"Temperature "));
448 Serial.print(temperature, 4);
449 Serial.print(F(
" C"));
451 if (staleData) Serial.print(F(
" ***** Stale Data ******\n"));
452 else Serial.println(
"");
458 Serial.print(F(
"m-Main Menu\n\n"));
464 while (Serial.available() ==
false && !(ack));
470 int8_t
menu_4_sleep_mode(int8_t mAh_or_Coulombs ,uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode)
482 Serial.print(F(
"*************************\n\n"));
485 uint16_t charge_code;
496 Serial.print(
"Coulombs: ");
497 Serial.print(charge, 4);
498 Serial.print(F(
" C\n"));
503 Serial.print(
"mAh: ");
504 Serial.print(charge, 4);
505 Serial.print(F(
" mAh\n"));
508 Serial.print(F(
"Current "));
509 Serial.print(F(
" ADC Sleep...\n"));
512 Serial.print(F(
"Voltage "));
513 Serial.print(F(
" ADC Sleep...\n"));
515 Serial.print(F(
"Temperature "));
516 Serial.print(F(
" ADC Sleep...\n"));
518 Serial.print(F(
"m-Main Menu\n\n"));
525 while (Serial.available() ==
false || (ack));
536 Serial.print(
"LTC2944 Has Been ShutDown\n");
540 int8_t
menu_6_settings(uint8_t *mAh_or_Coulombs, uint8_t *celcius_or_kelvin, uint16_t *prescalar_mode, uint16_t *prescalarValue, uint16_t *alcc_mode)
547 Serial.print(F(
"*************************\n\n"));
548 Serial.print(F(
"1-Set Alert Thresholds\n"));
549 Serial.print(F(
"2-Set Prescalar Value\n"));
550 Serial.print(F(
"3-Set AL#/CC# Pin State\n"));
551 Serial.print(F(
"4-Set Units\n"));
552 Serial.print(F(
"m-Main Menu\n\n"));
553 Serial.print(F(
"Enter a command: "));
556 if (user_command ==
'm')
559 Serial.println(user_command);
561 switch (user_command)
580 if (user_command !=
'm')
581 Serial.println(
"Incorrect Option");
585 while (!((user_command ==
'm') || (ack)));
598 Serial.print(F(
"*************************\n\n"));
599 Serial.print(F(
"1-Set Charge Thresholds\n"));
600 Serial.print(F(
"2-Set Voltage Thresholds\n"));
601 Serial.print(F(
"3-Set Current Thresholds\n"));
602 Serial.print(F(
"4-Set Temperature Thresholds\n"));
603 Serial.print(F(
"m-Main Menu\n\n"));
604 Serial.print(F(
"Enter a command: "));
607 if (user_command ==
'm')
610 Serial.println(user_command);
612 switch (user_command)
627 if (user_command !=
'm')
628 Serial.println(
"Incorrect Option");
632 while (!((user_command ==
'm') || (ack)));
641 Serial.print(F(
"Enter RAW Max Charge Threshold:"));
643 uint16_t max_charge_threshold;
645 Serial.println(max_charge_threshold);
649 Serial.print(F(
"Enter RAW Min Charge Threshold:"));
651 float min_charge_threshold;
653 Serial.println(min_charge_threshold);
665 Serial.print(F(
"Enter Max Voltage Threshold:"));
667 float max_voltage_threshold;
669 Serial.print(max_voltage_threshold, 3);
676 Serial.print(F(
"Enter Min Voltage Threshold:"));
678 float min_voltage_threshold;
680 Serial.println(min_voltage_threshold, 3);
693 Serial.print(F(
"Enter Max Current Threshold:"));
695 float max_current_threshold;
697 Serial.print(max_current_threshold, 3);
704 Serial.print(F(
"Enter Min Current Threshold:"));
706 float min_current_threshold;
708 Serial.print(min_current_threshold, 3);
722 Serial.print(F(
"Enter Max Temperature Threshold in Celcius:"));
724 float max_temperature_threshold;
726 Serial.print(max_temperature_threshold, 2);
734 Serial.print(F(
"Enter Min Temperature Threshold in Celcius:"));
736 float min_temperature_threshold;
738 Serial.print(min_temperature_threshold, 2);
756 Serial.print(F(
"*************************\n\n"));
757 Serial.print(F(
"1-Set Prescalar M = 1\n"));
758 Serial.print(F(
"2-Set Prescalar M = 4\n"));
759 Serial.print(F(
"3-Set Prescalar M = 16\n"));
760 Serial.print(F(
"4-Set Prescalar M = 64\n"));
761 Serial.print(F(
"5-Set Prescalar M = 256\n"));
762 Serial.print(F(
"6-Set Prescalar M = 1024\n"));
763 Serial.print(F(
"7-Set Prescalar M = 4096\n"));
764 Serial.print(F(
"m-Main Menu\n\n"));
765 Serial.print(F(
"Enter a command: "));
768 if (user_command ==
'm')
771 Serial.println(user_command);
773 switch (user_command)
778 Serial.println(F(
"\nPrescalar Set to 1\n"));
783 Serial.println(F(
"\nPrescalar Set to 4\n"));
787 *prescalarValue = 16;
788 Serial.println(F(
"\nPrescalar Set to 16\n"));
792 *prescalarValue = 64;
793 Serial.println(F(
"\nPrescalar Set to 64\n"));
797 *prescalarValue = 256;
798 Serial.println(F(
"\nPrescalar Set to 256\n"));
802 *prescalarValue = 1024;
804 Serial.println(F(
"\nPrescalar Set to 1024\n"));
808 *prescalarValue = 4096;
809 Serial.println(F(
"\nPrescalar Set to 4096\n"));
812 if (user_command !=
'm')
813 Serial.println(
"Incorrect Option");
817 while (!((user_command ==
'm') || (ack)));
829 Serial.print(F(
"*************************\n\n"));
830 Serial.print(F(
"1-Enable Alert Mode\n"));
831 Serial.print(F(
"2-Enable Charge Complete Mode\n"));
832 Serial.print(F(
"3-Disable AL#/CC# Pin\n"));
833 Serial.print(F(
"m-Main Menu\n\n"));
834 Serial.print(F(
"Enter a command: "));
837 if (user_command ==
'm')
840 Serial.println(user_command);
842 switch (user_command)
846 Serial.println(F(
"\nAlert Mode Enabled\n"));
850 Serial.println(F(
"\nCharge Mode Enabled\n"));
854 Serial.println(F(
"\nAL#/CC# Pin Disabled\n"));
857 if (user_command !=
'm')
858 Serial.println(
"Incorrect Option");
862 while (!((user_command ==
'm') || (ack)));
874 Serial.print(F(
"*************************\n\n"));
875 Serial.print(F(
"1-Set Charge Units to mAh\n"));
876 Serial.print(F(
"2-Set Charge Units to Coulombs\n"));
877 Serial.print(F(
"3-Set Temperature Units to Celsius\n"));
878 Serial.print(F(
"4-Set Temperature Units to Kelvin\n"));
879 Serial.print(F(
"m-Main Menu\n\n"));
880 Serial.print(F(
"Enter a command: "));
883 if (user_command ==
'm')
886 Serial.println(user_command);
888 switch (user_command)
891 *mAh_or_Coulombs = 0;
892 Serial.println(F(
"\nCharge Units Set to mAh\n"));
895 *mAh_or_Coulombs = 1;
896 Serial.println(F(
"\nCharge Units Set to Coulombs\n"));
899 *celcius_or_kelvin = 0;
900 Serial.println(F(
"\nTemperature Units Set to Celcius\n"));
903 *celcius_or_kelvin = 1;
904 Serial.println(F(
"\nTemperature Units Set to Kelvin\n"));
907 if (user_command !=
'm')
908 Serial.println(
"Incorrect Option");
913 while (!((user_command ==
'm') || (ack)));
922 return((1<<position)&value);
930 Serial.print(F(
"\n***********************\n"));
931 Serial.print(F(
"Alert: "));
932 Serial.print(F(
"Current Alert\n"));
933 Serial.print(F(
"***********************\n"));
937 Serial.print(F(
"\n***********************\n"));
938 Serial.print(F(
"Alert: "));
939 Serial.print(F(
"Charge Over/Under Flow Alert\n"));
940 Serial.print(F(
"***********************\n"));
944 Serial.print(F(
"\n***********************\n"));
945 Serial.print(F(
"Alert: "));
946 Serial.print(F(
"Temperature Alert\n"));
947 Serial.print(F(
"***********************\n"));
951 Serial.print(F(
"\n***********************\n"));
952 Serial.print(F(
"Alert: "));
953 Serial.print(F(
"Charge High Alert\n"));
954 Serial.print(F(
"***********************\n"));
958 Serial.print(F(
"\n***********************\n"));
959 Serial.print(F(
"Alert: "));
960 Serial.print(F(
"Charge Low Alert\n"));
961 Serial.print(F(
"***********************\n"));
965 Serial.print(F(
"\n***********************\n"));
966 Serial.print(F(
"Alert: "));
967 Serial.print(F(
"Voltage Alert\n"));
968 Serial.print(F(
"***********************\n"));
972 Serial.print(F(
"\n***********************\n"));
973 Serial.print(F(
"Alert: "));
974 Serial.print(F(
"UVLO Alert\n"));
975 Serial.print(F(
"***********************\n"));
#define LTC2944_ALERT_MODE
#define LTC2944_AUTOMATIC_MODE
unsigned char user_command
#define LTC2944_SLEEP_MODE
#define LTC2944_I2C_ADDRESS
#define LTC2944_PRESCALAR_M_1024
static uint8_t alert_code
Value stored or read from ALERT register.
#define LTC2944_TEMPERATURE_MSB_REG
static int8_t menu_3_manual_mode(int8_t mAh_or_Coulombs, int8_t celcius_or_kelvin, uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode)
Manual Mode.
static int8_t menu_6_settings_menu_2_set_prescalar_values(uint16_t *prescalar_mode, uint16_t *prescalarValue)
Prescalar Menu.
#define LTC2944_CHARGE_COMPLETE_MODE
#define LTC2944_SCAN_MODE
#define LTC2944_ACCUM_CHARGE_MSB_REG
const float LTC2944_FULLSCALE_CURRENT
Header File for Linduino Libraries and Demo Code.
bool isBitSet(uint8_t value, uint8_t position)
Checks to see if a bit in a certain position is set.
static void setup()
Initialize Linduino.
#define LTC2944_PRESCALAR_M_64
#define LTC2944_CHARGE_THRESH_LOW_MSB_REG
static void checkAlerts(uint8_t status_code)
Check Alerts Function - Checks to see if an alert has been set in the status register. If an alert has been set, it prints out the appropriate message.
static int8_t menu_1_automatic_mode(int8_t mAh_or_Coulombs, int8_t celcius_or_kelvin, uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode)
Automatic Mode.
static int8_t menu_6_settings(uint8_t *mAh_or_Coulombs, uint8_t *celcius_or_kelvin, uint16_t *prescalar_mode, uint16_t *prescalarValue, uint16_t *alcc_mode)
Settings Menu.
static uint8_t menu_6_alert_menu_4_set_units(uint8_t *mAh_or_Coulombs, uint8_t *celcius_or_kelvin)
Set Charge and Temperature Units Menu.
#define LTC2944_STATUS_REG
static uint8_t menu_6_alert_menu_3_set_allcc_state(uint16_t *alcc_mode)
AL#/CC# Pin Mode Menu.
static void print_title()
Print the title block.
#define LTC2944_DISABLE_ALCC_PIN
#define LTC2944_CURRENT_THRESH_HIGH_MSB_REG
float LTC2944_code_to_celcius_temperature(uint16_t adc_code)
Calculate the LTC2944 temperature.
#define LTC2944_VOLTAGE_THRESH_HIGH_MSB_REG
static int8_t menu_6_alert_menu_1_set_charge_thresholds()
Set Charge Threshold Function.
#define LTC2944_CONTROL_REG
#define LTC2944_PRESCALAR_M_4
float LTC2944_code_to_mAh(uint16_t adc_code, float resistor, uint16_t prescalar)
Calculate the LTC2944 charge in mAh.
int8_t LTC2944_read(uint8_t i2c_address, uint8_t adc_command, uint8_t *adc_code)
Reads an 8-bit adc_code from LTC2944.
#define LTC2944_CURRENT_THRESH_LOW_MSB_REG
static int8_t menu_2_scan_mode(int8_t mAh_or_Coulombs, int8_t celcius_or_kelvin, uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode)
Scan Mode.
const float LTC2944_FULLSCALE_VOLTAGE
const char ack_error[]
Error message.
#define LTC2944_MANUAL_MODE
static void print_prompt()
Print the Prompt.
#define LTC2944_PRESCALAR_M_1
#define LTC2944_VOLTAGE_THRESH_LOW_MSB_REG
static int8_t menu_5_shutdown_mode()
Shutdown Mode.
#define LTC2944_PRESCALAR_M_4096
static int8_t menu_6_settings_menu_1_set_alert_thresholds()
Alert Threshold Menu.
#define LTC2944_CHARGE_THRESH_HIGH_MSB_REG
float LTC2944_code_to_kelvin_temperature(uint16_t adc_code)
Calculate the LTC2944 temperature.
int8_t discover_demo_board(char *demo_name)
Read the ID string from the EEPROM and determine if the correct board is connected.
float LTC2944_code_to_voltage(uint16_t adc_code)
Calculate the LTC2944 SENSE+ voltage.
#define LTC2944_TEMPERATURE_THRESH_LOW_REG
#define LTC2944_TEMPERATURE_THRESH_HIGH_REG
const float LTC2944_FULLSCALE_TEMPERATURE
#define AUTOMATIC_MODE_DISPLAY_DELAY
The delay between readings in automatic mode.
static void loop()
Repeats Linduino loop.
#define SCAN_MODE_DISPLAY_DELAY
The delay between readings in scan mode.
int8_t LTC2944_write_16_bits(uint8_t i2c_address, uint8_t adc_command, uint16_t code)
Write a 16-bit code to the LTC2944.
static int8_t menu_6_alert_menu_4_set_temperature_thresholds()
Set Temperature Thresholds.
LT_I2C: Routines to communicate with ATmega328P's hardware I2C port.
int8_t LTC2944_read_16_bits(uint8_t i2c_address, uint8_t adc_command, uint16_t *adc_code)
Reads a 16-bit adc_code from LTC2944.
char demo_name[]
Demo Board Name stored in QuikEval EEPROM.
static int8_t restore_alert_settings()
#define LTC2944_CURRENT_MSB_REG
#define LTC2944_PRESCALAR_M_16
LTC2944: Multicell Battery Gas Gauge with Temperature, Voltage and Current Measurement.
void quikeval_I2C_init(void)
Initializes Linduino I2C port.
static int8_t menu_6_alert_menu_3_set_current_thresholds()
Set Current Thresholds.
void quikeval_I2C_connect(void)
Switch MUX to connect I2C pins to QuikEval connector.
static int8_t demo_board_connected
Set to 1 if the board is connected.
static uint16_t current
the current measurement from the LTC3335's counter test mode.
static int8_t menu_4_sleep_mode(int8_t mAh_or_Coulombs, uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode)
Sleep Mode.
#define LTC2944_SHUTDOWN_MODE
#define LTC2944_PRESCALAR_M_256
float LTC2944_code_to_current(uint16_t adc_code, float resistor)
Calculate the LTC2944 current with a sense resistor.
static int8_t menu_6_alert_menu_2_set_voltage_thresholds()
Set Voltage Thresholds.
int8_t LTC2944_write(uint8_t i2c_address, uint8_t adc_command, uint8_t code)
Write an 8-bit code to the LTC2944.
static void store_alert_settings()
const float resistor
resistor value on demo board
#define LTC2944_VOLTAGE_MSB_REG
float LTC2944_code_to_coulombs(uint16_t adc_code, float resistor, uint16_t prescalar)
Calculate the LTC2944 charge in Coulombs.