111 #define AUTOMATIC_MODE_DISPLAY_DELAY 1000 112 #define SCAN_MODE_DISPLAY_DELAY 10000
118 const char ack_error[] =
"Error: No Acknowledge. Check I2C Address.";
133 Serial.begin(115200);
143 Serial.println(
"Did not read ID String, attempting to proceed anyway...\nPlease ensure I2C lines of Linduino are connected to the LTC device");
156 static uint8_t mAh_or_Coulombs = 0;
157 static uint8_t celcius_or_kelvin = 0;
159 static uint16_t prescalarValue = 4096;
164 if (Serial.available())
167 if (user_command !=
'm')
168 Serial.println(user_command);
171 switch (user_command)
174 ack |=
menu_1_automatic_mode(mAh_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode);
177 ack |=
menu_2_scan_mode(mAh_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode);
180 ack |=
menu_3_manual_mode(mAh_or_Coulombs, celcius_or_kelvin, prescalar_mode, prescalarValue, alcc_mode);
183 ack |=
menu_4_sleep_mode(mAh_or_Coulombs, prescalar_mode, prescalarValue, alcc_mode);
189 ack |=
menu_6_settings(&mAh_or_Coulombs, &celcius_or_kelvin, &prescalar_mode, &prescalarValue, &alcc_mode);
194 Serial.print(F(
"*************************"));
204 Serial.println(F(
"\n*****************************************************************"));
205 Serial.print(F(
"* DC1812A Demonstration Program *\n"));
206 Serial.print(F(
"* *\n"));
207 Serial.print(F(
"* This program communicates with the LTC2943 Multicell Coulomb *\n"));
208 Serial.print(F(
"* Counter found on the DC1812A demo board. *\n"));
209 Serial.print(F(
"* Set the baud rate to 115200 and select the newline terminator.*\n"));
210 Serial.print(F(
"* *\n"));
211 Serial.print(F(
"*****************************************************************\n"));
217 Serial.print(F(
"\n1-Automatic Mode\n"));
218 Serial.print(F(
"2-Scan Mode\n"));
219 Serial.print(F(
"3-Manual Mode\n"));
220 Serial.print(F(
"4-Sleep Mode\n"));
221 Serial.print(F(
"5-Shutdown Mode\n"));
222 Serial.print(F(
"6-Settings\n"));
223 Serial.print(F(
"Enter a command: "));
227 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)
238 Serial.print(F(
"*************************\n\n"));
240 uint8_t status_code, hightemp_code, lowtemp_code;
241 uint16_t charge_code, current_code, voltage_code, temperature_code;
254 Serial.print(
"Coulombs: ");
255 Serial.print(charge, 4);
256 Serial.print(F(
" C\n"));
261 Serial.print(
"mAh: ");
262 Serial.print(charge, 4);
263 Serial.print(F(
" mAh\n"));
270 Serial.print(F(
"Current "));
271 Serial.print(current, 4);
272 Serial.print(F(
" A\n"));
274 Serial.print(F(
"Voltage "));
275 Serial.print(voltage, 4);
276 Serial.print(F(
" V\n"));
279 if (celcius_or_kelvin)
282 Serial.print(F(
"Temperature "));
283 Serial.print(temperature, 4);
284 Serial.print(F(
" K\n"));
289 Serial.print(F(
"Temperature "));
290 Serial.print(temperature, 4);
291 Serial.print(F(
" C\n"));
296 Serial.print(F(
"m-Main Menu\n\n"));
301 while (Serial.available() ==
false && !(ack));
307 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)
318 Serial.print(F(
"*************************\n\n"));
321 uint16_t charge_code, current_code, voltage_code, temperature_code;
334 Serial.print(
"Coulombs: ");
335 Serial.print(charge, 4);
336 Serial.print(F(
" C\n"));
341 Serial.print(
"mAh: ");
342 Serial.print(charge, 4);
343 Serial.print(F(
" mAh\n"));
351 Serial.print(F(
"Current "));
352 Serial.print(current, 4);
353 Serial.print(F(
" A\n"));
355 Serial.print(F(
"Voltage "));
356 Serial.print(voltage, 4);
357 Serial.print(F(
" V\n"));
360 if (celcius_or_kelvin)
363 Serial.print(F(
"Temperature "));
364 Serial.print(temperature, 4);
365 Serial.print(F(
" K\n"));
370 Serial.print(F(
"Temperature "));
371 Serial.print(temperature, 4);
372 Serial.print(F(
" C\n"));
376 Serial.print(F(
"m-Main Menu\n\n"));
381 while (Serial.available() ==
false && !(ack));
388 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)
401 Serial.print(F(
"*************************\n\n"));
404 uint16_t charge_code, current_code, voltage_code, temperature_code;
418 Serial.print(
"Coulombs: ");
419 Serial.print(charge, 4);
420 Serial.print(F(
" C\n"));
425 Serial.print(
"mAh: ");
426 Serial.print(charge, 4);
427 Serial.print(F(
" mAh\n"));
435 Serial.print(F(
"Current "));
436 Serial.print(current, 4);
437 Serial.print(F(
" A"));
438 if (staleData) Serial.print(F(
" ***** Stale Data ******\n"));
439 else Serial.println(
"");
441 Serial.print(F(
"Voltage "));
442 Serial.print(voltage, 4);
443 Serial.print(F(
" V"));
444 if (staleData) Serial.print(F(
" ***** Stale Data ******\n"));
445 else Serial.println(
"");
448 if (celcius_or_kelvin)
451 Serial.print(F(
"Temperature "));
452 Serial.print(temperature, 4);
453 Serial.print(F(
" K"));
458 Serial.print(F(
"Temperature "));
459 Serial.print(temperature, 4);
460 Serial.print(F(
" C"));
462 if (staleData) Serial.print(F(
" ***** Stale Data ******\n"));
463 else Serial.println(
"");
469 Serial.print(F(
"m-Main Menu\n\n"));
475 while (Serial.available() ==
false && !(ack));
481 int8_t
menu_4_sleep_mode(int8_t mAh_or_Coulombs ,uint16_t prescalar_mode, uint16_t prescalarValue, uint16_t alcc_mode)
493 Serial.print(F(
"*************************\n\n"));
496 uint16_t charge_code;
507 Serial.print(
"Coulombs: ");
508 Serial.print(charge, 4);
509 Serial.print(F(
" C\n"));
514 Serial.print(
"mAh: ");
515 Serial.print(charge, 4);
516 Serial.print(F(
" mAh\n"));
519 Serial.print(F(
"Current "));
520 Serial.print(F(
" ADC Sleep...\n"));
523 Serial.print(F(
"Voltage "));
524 Serial.print(F(
" ADC Sleep...\n"));
526 Serial.print(F(
"Temperature "));
527 Serial.print(F(
" ADC Sleep...\n"));
529 Serial.print(F(
"m-Main Menu\n\n"));
536 while (Serial.available() ==
false || (ack));
547 Serial.print(
"LTC2943 Has Been ShutDown\n");
551 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)
558 Serial.print(F(
"*************************\n\n"));
559 Serial.print(F(
"1-Set Alert Thresholds\n"));
560 Serial.print(F(
"2-Set Prescalar Value\n"));
561 Serial.print(F(
"3-Set AL#/CC# Pin State\n"));
562 Serial.print(F(
"4-Set Units\n"));
563 Serial.print(F(
"m-Main Menu\n\n"));
564 Serial.print(F(
"Enter a command: "));
567 if (user_command ==
'm')
570 Serial.println(user_command);
572 switch (user_command)
591 if (user_command !=
'm')
592 Serial.println(
"Incorrect Option");
596 while (!((user_command ==
'm') || (ack)));
609 Serial.print(F(
"*************************\n\n"));
610 Serial.print(F(
"1-Set Charge Thresholds\n"));
611 Serial.print(F(
"2-Set Voltage Thresholds\n"));
612 Serial.print(F(
"3-Set Current Thresholds\n"));
613 Serial.print(F(
"4-Set Temperature Thresholds\n"));
614 Serial.print(F(
"m-Main Menu\n\n"));
615 Serial.print(F(
"Enter a command: "));
618 if (user_command ==
'm')
621 Serial.println(user_command);
623 switch (user_command)
638 if (user_command !=
'm')
639 Serial.println(
"Incorrect Option");
643 while (!((user_command ==
'm') || (ack)));
652 Serial.print(F(
"Enter RAW Max Charge Threshold:"));
654 uint16_t max_charge_threshold;
656 Serial.println(max_charge_threshold);
660 Serial.print(F(
"Enter RAW Min Charge Threshold:"));
662 float min_charge_threshold;
664 Serial.println(min_charge_threshold);
676 Serial.print(F(
"Enter Max Voltage Threshold:"));
678 float max_voltage_threshold;
680 Serial.print(max_voltage_threshold, 3);
687 Serial.print(F(
"Enter Min Voltage Threshold:"));
689 float min_voltage_threshold;
691 Serial.println(min_voltage_threshold, 3);
704 Serial.print(F(
"Enter Max Current Threshold:"));
706 float max_current_threshold;
708 Serial.print(max_current_threshold, 3);
715 Serial.print(F(
"Enter Min Current Threshold:"));
717 float min_current_threshold;
719 Serial.print(min_current_threshold, 3);
733 Serial.print(F(
"Enter Max Temperature Threshold in Celcius:"));
735 float max_temperature_threshold;
737 Serial.print(max_temperature_threshold, 2);
745 Serial.print(F(
"Enter Min Temperature Threshold in Celcius:"));
747 float min_temperature_threshold;
749 Serial.print(min_temperature_threshold, 2);
767 Serial.print(F(
"*************************\n\n"));
768 Serial.print(F(
"1-Set Prescalar M = 1\n"));
769 Serial.print(F(
"2-Set Prescalar M = 4\n"));
770 Serial.print(F(
"3-Set Prescalar M = 16\n"));
771 Serial.print(F(
"4-Set Prescalar M = 64\n"));
772 Serial.print(F(
"5-Set Prescalar M = 256\n"));
773 Serial.print(F(
"6-Set Prescalar M = 1024\n"));
774 Serial.print(F(
"7-Set Prescalar M = 4096\n"));
775 Serial.print(F(
"m-Main Menu\n\n"));
776 Serial.print(F(
"Enter a command: "));
779 if (user_command ==
'm')
782 Serial.println(user_command);
784 switch (user_command)
789 Serial.println(F(
"\nPrescalar Set to 1\n"));
794 Serial.println(F(
"\nPrescalar Set to 4\n"));
798 *prescalarValue = 16;
799 Serial.println(F(
"\nPrescalar Set to 16\n"));
803 *prescalarValue = 64;
804 Serial.println(F(
"\nPrescalar Set to 64\n"));
808 *prescalarValue = 256;
809 Serial.println(F(
"\nPrescalar Set to 256\n"));
813 *prescalarValue = 1024;
815 Serial.println(F(
"\nPrescalar Set to 1024\n"));
819 *prescalarValue = 4096;
820 Serial.println(F(
"\nPrescalar Set to 4096\n"));
823 if (user_command !=
'm')
824 Serial.println(
"Incorrect Option");
828 while (!((user_command ==
'm') || (ack)));
840 Serial.print(F(
"*************************\n\n"));
841 Serial.print(F(
"1-Enable Alert Mode\n"));
842 Serial.print(F(
"2-Enable Charge Complete Mode\n"));
843 Serial.print(F(
"3-Disable AL#/CC# Pin\n"));
844 Serial.print(F(
"m-Main Menu\n\n"));
845 Serial.print(F(
"Enter a command: "));
848 if (user_command ==
'm')
851 Serial.println(user_command);
853 switch (user_command)
857 Serial.println(F(
"\nAlert Mode Enabled\n"));
861 Serial.println(F(
"\nCharge Mode Enabled\n"));
865 Serial.println(F(
"\nAL#/CC# Pin Disabled\n"));
868 if (user_command !=
'm')
869 Serial.println(
"Incorrect Option");
873 while (!((user_command ==
'm') || (ack)));
885 Serial.print(F(
"*************************\n\n"));
886 Serial.print(F(
"1-Set Charge Units to mAh\n"));
887 Serial.print(F(
"2-Set Charge Units to Coulombs\n"));
888 Serial.print(F(
"3-Set Temperature Units to Celsius\n"));
889 Serial.print(F(
"4-Set Temperature Units to Kelvin\n"));
890 Serial.print(F(
"m-Main Menu\n\n"));
891 Serial.print(F(
"Enter a command: "));
894 if (user_command ==
'm')
897 Serial.println(user_command);
899 switch (user_command)
902 *mAh_or_Coulombs = 0;
903 Serial.println(F(
"\nCharge Units Set to mAh\n"));
906 *mAh_or_Coulombs = 1;
907 Serial.println(F(
"\nCharge Units Set to Coulombs\n"));
910 *celcius_or_kelvin = 0;
911 Serial.println(F(
"\nTemperature Units Set to Celcius\n"));
914 *celcius_or_kelvin = 1;
915 Serial.println(F(
"\nTemperature Units Set to Kelvin\n"));
918 if (user_command !=
'm')
919 Serial.println(
"Incorrect Option");
924 while (!((user_command ==
'm') || (ack)));
933 return((1<<position)&value);
941 Serial.print(F(
"\n***********************\n"));
942 Serial.print(F(
"Alert: "));
943 Serial.print(F(
"Current Alert\n"));
944 Serial.print(F(
"***********************\n"));
948 Serial.print(F(
"\n***********************\n"));
949 Serial.print(F(
"Alert: "));
950 Serial.print(F(
"Charge Over/Under Flow Alert\n"));
951 Serial.print(F(
"***********************\n"));
955 Serial.print(F(
"\n***********************\n"));
956 Serial.print(F(
"Alert: "));
957 Serial.print(F(
"Temperature Alert\n"));
958 Serial.print(F(
"***********************\n"));
962 Serial.print(F(
"\n***********************\n"));
963 Serial.print(F(
"Alert: "));
964 Serial.print(F(
"Charge High Alert\n"));
965 Serial.print(F(
"***********************\n"));
969 Serial.print(F(
"\n***********************\n"));
970 Serial.print(F(
"Alert: "));
971 Serial.print(F(
"Charge Low Alert\n"));
972 Serial.print(F(
"***********************\n"));
976 Serial.print(F(
"\n***********************\n"));
977 Serial.print(F(
"Alert: "));
978 Serial.print(F(
"Voltage Alert\n"));
979 Serial.print(F(
"***********************\n"));
983 Serial.print(F(
"\n***********************\n"));
984 Serial.print(F(
"Alert: "));
985 Serial.print(F(
"UVLO Alert\n"));
986 Serial.print(F(
"***********************\n"));
#define AUTOMATIC_MODE_DISPLAY_DELAY
The delay between readings in automatic mode.
static uint8_t alert_code
Value stored or read from ALERT register.
unsigned char user_command
#define LTC2943_ALERT_MODE
#define LTC2943_PRESCALAR_M_64
const float resistor
resistor value on demo board
static uint8_t menu_6_alert_menu_3_set_allcc_state(uint16_t *alcc_mode)
AL#/CC# Pin Mode Menu.
#define LTC2943_CURRENT_THRESH_LOW_MSB_REG
#define LTC2943_SCAN_MODE
#define LTC2943_TEMPERATURE_THRESH_HIGH_REG
#define LTC2943_PRESCALAR_M_1
#define LTC2943_STATUS_REG
Header File for Linduino Libraries and Demo Code.
#define LTC2943_CHARGE_COMPLETE_MODE
static int8_t menu_6_settings_menu_1_set_alert_thresholds()
Alert Threshold Menu.
const char ack_error[]
Error message.
#define LTC2943_TEMPERATURE_THRESH_LOW_REG
#define LTC2943_CONTROL_REG
#define LTC2943_ACCUM_CHARGE_MSB_REG
#define LTC2943_I2C_ADDRESS
#define LTC2943_VOLTAGE_THRESH_LOW_MSB_REG
float LTC2943_code_to_mAh(uint16_t adc_code, float resistor, uint16_t prescalar)
Calculate the LTC2943 charge in mAh.
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.
static int8_t menu_6_alert_menu_3_set_current_thresholds()
Set Current Thresholds.
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.
const float LTC2943_FULLSCALE_CURRENT
static int8_t menu_6_settings_menu_2_set_prescalar_values(uint16_t *prescalar_mode, uint16_t *prescalarValue)
Prescalar Menu.
#define LTC2943_TEMPERATURE_MSB_REG
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 LTC2943_MANUAL_MODE
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.
int8_t LTC2943_read_16_bits(uint8_t i2c_address, uint8_t adc_command, uint16_t *adc_code)
Reads a 16-bit adc_code from LTC2943.
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.
#define LTC2943_PRESCALAR_M_256
static void loop()
Repeats Linduino loop.
int8_t discover_demo_board(char *demo_name)
Read the ID string from the EEPROM and determine if the correct board is connected.
#define LTC2943_SLEEP_MODE
#define LTC2943_PRESCALAR_M_16
static int8_t restore_alert_settings()
#define LTC2943_CHARGE_THRESH_HIGH_MSB_REG
float LTC2943_code_to_celcius_temperature(uint16_t adc_code)
Calculate the LTC2943 temperature.
static void setup()
Initialize Linduino.
float LTC2943_code_to_kelvin_temperature(uint16_t adc_code)
Calculate the LTC2943 temperature.
static int8_t menu_6_alert_menu_4_set_temperature_thresholds()
Set Temperature Thresholds.
#define LTC2943_PRESCALAR_M_4
static int8_t menu_6_alert_menu_2_set_voltage_thresholds()
Set Voltage Thresholds.
#define LTC2943_VOLTAGE_MSB_REG
#define LTC2943_DISABLE_ALCC_PIN
static void print_title()
Print the title block.
LT_I2C: Routines to communicate with ATmega328P's hardware I2C port.
char demo_name[]
Demo Board Name stored in QuikEval EEPROM.
#define LTC2943_CHARGE_THRESH_LOW_MSB_REG
LTC2943: Multicell Battery Gas Gauge with Temperature, Voltage and Current Measurement.
float LTC2943_code_to_voltage(uint16_t adc_code)
Calculate the LTC2943 SENSE+ voltage.
float LTC2943_code_to_current(uint16_t adc_code, float resistor)
Calculate the LTC2943 current with a sense resistor.
const float LTC2943_FULLSCALE_TEMPERATURE
#define SCAN_MODE_DISPLAY_DELAY
The delay between readings in scan mode.
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.
#define LTC2943_CURRENT_THRESH_HIGH_MSB_REG
float LTC2943_code_to_coulombs(uint16_t adc_code, float resistor, uint16_t prescalar)
Calculate the LTC2943 charge in Coulombs.
#define LTC2943_SHUTDOWN_MODE
static int8_t demo_board_connected
Set to 1 if the board is connected.
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.
#define LTC2943_VOLTAGE_THRESH_HIGH_MSB_REG
static int8_t menu_6_alert_menu_1_set_charge_thresholds()
Set Charge Threshold Function.
int8_t LTC2943_read(uint8_t i2c_address, uint8_t adc_command, uint8_t *adc_code)
Reads an 8-bit adc_code from LTC2943.
void quikeval_I2C_init(void)
Initializes Linduino I2C port.
void quikeval_I2C_connect(void)
Switch MUX to connect I2C pins to QuikEval connector.
#define LTC2943_CURRENT_MSB_REG
static void store_alert_settings()
#define LTC2943_PRESCALAR_M_4096
bool isBitSet(uint8_t value, uint8_t position)
Checks to see if a bit in a certain position is set.
const float LTC2943_FULLSCALE_VOLTAGE
static uint16_t current
the current measurement from the LTC3335's counter test mode.
int8_t LTC2943_write(uint8_t i2c_address, uint8_t adc_command, uint8_t code)
Write an 8-bit code to the LTC2943.
static int8_t menu_5_shutdown_mode()
Shutdown Mode.
#define LTC2943_PRESCALAR_M_1024
static void print_prompt()
Print the Prompt.
#define LTC2943_AUTOMATIC_MODE
int8_t LTC2943_write_16_bits(uint8_t i2c_address, uint8_t adc_command, uint16_t code)
Write a 16-bit code to the LTC2943.