/************************************************************************************************************
Power Meter >> 1.008 gHz Clock
************************************************************************************************************/
// Begin Above Setup Amp Volts Calibration Stuff ============================================================
// Set Up 3000 Element Array ( Lookup Table ) For 3000 Millamps
volatile int ampVoltsCal[3000];
volatile int inputMillAmps;
volatile int outPutMilliAmps;
volatile float interpolatedPercent;
volatile int arrayLocationPointer;
volatile int interpolatedOutput;
volatile int upperStoredValueAddress;
volatile int lowerStoredValueAddress;
volatile int upperLowerAddressRange;
volatile int upperStoredValue;
volatile int lowerStoredValue;
volatile int upperLowerStoredValueRange;
int ampsCalibrateMode = 1 ; // 1 = Amps Calibration Mode, Display Un-Corrected Input
int ampsZeroOffsetMode = 1 ; // 1 = Zero Offset Calibration Mode, Display Un-Corrected Input
float ampsZeroOffset = 0; // Amps Zero Offset Correction.. Subtract This Value From Amps Before Correction
// End Above Setup Amp Volts Calibration Stuff ==============================================================
// Begin Above Setup Display Stuff ==========================================================================
#include <ILI9341_t3.h>
#include <font_Arial.h> // from ILI9341_t3
#include <XPT2046_Touchscreen.h>
// Colors To Be Used
#define BLACK 0x0000
#define WHITE 0xFFFF
#define RED 0xF800
#define CS_PIN 8
#define TFT_DC 9
#define TFT_CS 10
// MOSI=11, MISO=12, SCK=13 Standard SPI interface pins
XPT2046_Touchscreen ts(CS_PIN);
#define TIRQ_PIN 7 // Define Touch Screen Interrupt Pin I/O 7
ILI9341_t3 tft = ILI9341_t3(TFT_CS, TFT_DC);
// End Above Setup Display Stuff ============================================================================
// Begin Above Setup Current volts ADC Stuff ================================================================
const int ampVoltsDataPin = 17; // Define volts data Input Pin From volts LTC2314
// End Above Setup Current Amps & Volts Common ADC Stuff ====================================================
int byteBinaryTotal = 0; // Binary Equiv Of Volts ADC volts Input ( 1 Sample )
// Begin Above Setup Amp Volts ADC Stuff ====================================================================
long long int ampVoltsAccumTotal = 0; // Accumulated Current Volts Binary Total
float ampVoltsAveragedBinaryTotal = 0; // Current Volts Averaged Binary Total
float ampVolts = 0; // Final Calculated Current Voltage
float ampBinaryFactor = 0; // Multiplier Determined By The Number Of Bit Possibilities ( 12 = 4096 )
float referenceVoltage = 4.096; // ( Increasing This Number Increases Displayed Amps )
// End Above Setup Currrent Amp Volts
// Begin Above Setup Volt Volts ADC Stuff ===================================================================
long long int voltVoltsAccumTotal = 0; // Accumulated Volts Binary Total
float voltVoltsAveragedBinaryTotal = 0; // Volts Averaged Binary Total
float voltVolts = 0; // Final Calculated Current Voltage
float volts_A = 0; // Actual Volts For ADC
float novoltVolts = 0.264; // Voltage Output From Sensor A With Current Inputs Shorted
float voltBinaryFactor = 0; // Multiplier Determined By The Number Of Bit Possibilities ( 12 = 4096 )
// End Above Setup Volt Volts ADC Stuff =====================================================================
// Begin Above Setup volts @ Current Common Stuff ===========================================================
float averagevolts = 0; // Define Average Amp Volts
uint32_t sampleCount = 0; // Volts & Current Sample Count
// End Above Setup volts @ Current Common Stuff =============================================================
// **********************************************************************************************************
// **********************************************************************************************************
// Begin Setup
// **********************************************************************************************************
// **********************************************************************************************************
void setup()
{
// //Serial..begin(9600);
// Begin In Setup Amp Volts Calibration Setup Stuff ======================================================
// Store Known Values In ampVoltsCal Array
// todo: These Values Should Be Acquired Through Screen Accessed Calibration Routine
// todo: These Values Should Be Stored On SIM Card To Be Loaded At Boot
// To Calibrate...
// Connect Power Supply Directly Across Input Pins Of Current Sensor... Let The Sensor Be The Entire Load
// Set Power Supply to .100 Amp, The Enter ADC Displayed Value In First Column
// ADC Actual
// Value Value
ampVoltsCal[0] = 0;
ampVoltsCal[112] = 100;
ampVoltsCal[221] = 200;
ampVoltsCal[299] = 300;
ampVoltsCal[393] = 400;
ampVoltsCal[487] = 500;
ampVoltsCal[611] = 600;
ampVoltsCal[677] = 700;
ampVoltsCal[799] = 800;
ampVoltsCal[926] = 900;
ampVoltsCal[987] = 1000;
ampVoltsCal[1081] = 1100;
ampVoltsCal[1208] = 1200;
ampVoltsCal[1277] = 1300;
ampVoltsCal[1371] = 1400;
ampVoltsCal[1484] = 1500;
ampVoltsCal[1614] = 1600;
ampVoltsCal[1739] = 1700;
ampVoltsCal[1802] = 1800;
ampVoltsCal[1927] = 1900;
ampVoltsCal[1992] = 2000;
ampVoltsCal[2115] = 2100;
ampVoltsCal[2209] = 2200;
ampVoltsCal[2303] = 2300;
ampVoltsCal[2430] = 2400;
ampVoltsCal[2491] = 2500;
ampVoltsCal[2587] = 2600;
ampVoltsCal[2742] = 2700;
ampVoltsCal[2781] = 2800;
ampVoltsCal[2875] = 2900;
ampVoltsCal[2992] = 3000;
// End In Setup Amp Volts Calibration Setup Stuff ========================================================
// Begin In Setup Display Stuff ===========================================================================
tft.begin();
tft.setRotation(3);
tft.fillScreen(ILI9341_BLACK);
ts.begin();
ts.setRotation(3);
// End In Setup Display Stuff =============================================================================
// Begin In Setup LTC2314 Stuff ============================================================================
pinMode(ampVoltsDataPin, INPUT_PULLDOWN); // Set Input Pin For LTC2314
pinMode (23, OUTPUT); // Set Amp Volts LTC2314 ADC-A Chip Select Pin
pinMode(20, OUTPUT); // Output Pulse To Amp Volts LTC2314 Data Clock
//IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_08 = 0xFF; // Turn Off Slew On Pin 5 For Fastest Rise & Fall Time
// End In Setup LTC2314 Stuff ==============================================================================
}
// **********************************************************************************************************
// **********************************************************************************************************
// End Setup
// **********************************************************************************************************
// **********************************************************************************************************
// Begin Below Setup Display Stuff ==========================================================================
boolean wastouched = true; // Enable Touch Screen
// End Below Setup Display Stuff ============================================================================
// **********************************************************************************************************
// **********************************************************************************************************
// **********************************************************************************************************
// Begin Main Loop
// **********************************************************************************************************
// **********************************************************************************************************
// **********************************************************************************************************
void yield () {} // Disable Hidden Functions
FASTRUN void loop() { // Use " FASTRUN " To Load Program Into Ram For Faster Speed
digitalWriteFast(20, HIGH); // Preset ADC CS Pin HIGH
noInterrupts(); // Disable Interrupts
while (1)
{
// ******************************************************************************************************
// Begin Read Amp Volts ADC
// ******************************************************************************************************
// 1 NOP = .35 nS Estimated @ 1.008 gHz Clock...
byteBinaryTotal = 0; // Reset Byte Binary Total
// Select Amp Volts ADC ==========================================================================================
digitalWriteFast(23, LOW); // Set Amp Volts ADC CS Pin LOW
// This Counts As Falling Edge 1.. First Zero Is Clocked Out
// Wait To Begin Data Transfer...
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
// Begin Data Transfer ==================================================================================
// Begin Data Transfer ==================================================================================
// Begin Data Transfer ==================================================================================
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 1
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 1
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 2
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 2
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 3
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 3
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 4
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 8192 ; // Read Data Bit 1 Value = 8192
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 4
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 5
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 5
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 4096 ; // Read Data Bit 2 Value = 4096
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 6
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 6
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 2048 ; // Read Data Bit 3 Value = 2048
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 7
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 7
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 1024 ; // Read Data Bit 4 Value = 1024
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 8
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 8
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 512 ; // Read Data Bit 5 Value = 512
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 9
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 9
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 256 ; // Read Data Bit 6 Value = 256
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 10
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 10
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 128 ; // Read Data Bit 7 Value = 128
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 11
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 11
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 64 ; // Read Data Bit 8 Value = 64
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 12
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 12
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 32 ; // Read Data Bit 9 Value = 32
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 13
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 16 ; // Read Data Bit 10 Value = 16
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 14
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 14
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 8 ; // Read Data Bit 11 Value = 8
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 15
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 15
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 4 ; // Read Data Bit 12 Value = 4
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(20, HIGH); // Set Data Clock HIGH Rising Edge 16
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
digitalWriteFast(20, LOW); // Set Data Clock LOW Falling Edge 16
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 2 ; // Read Data Bit 13 Value = 2
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
byteBinaryTotal = byteBinaryTotal + digitalReadFast(ampVoltsDataPin) * 1 ; // Read Data Bit 14 Value = 1
//-------------------------------------------------------------------------------------------------------
// Begin Delay Before CS Is PUlled High
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
asm volatile("nop;");
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
digitalWriteFast(23, HIGH); // Set Amp Volts ADC CS Pin HIGH, End Conversion
// End Data Transfer ====================================================================================
asm(".rept 900 ; nop ; .endr"); // ToDo Insert No Ops Delay To Simulate Volt Volt ADC Reading Time ##############################################################################################
// ******************************************************************************************************
// End Read Amp Volts ADC
// ******************************************************************************************************
ampVoltsAccumTotal = ampVoltsAccumTotal + byteBinaryTotal;
// ******************************************************************************************************
// Begin Read Volt Volts ADC
// ******************************************************************************************************
// ******************************************************************************************************
// End Read Volt Volts ADC
// ******************************************************************************************************
sampleCount++; // Increment Sample Count
// Average Data & Update Screen After 1 Million Samples ( One Million Complete Amps / Volts Reads ) =====
if ( sampleCount > 999999 ) { // If One Million ( > 999999 ) Samples, Go Average & Display Them sb 999999
// Begin Amp Volts Calculations =======================================================================
ampVoltsAveragedBinaryTotal = float( ampVoltsAccumTotal) / 1000000; // Divide Total Binary By One Million Samples
ampVoltsAveragedBinaryTotal = round(ampVoltsAveragedBinaryTotal); // Round Result Up Or Down
ampVoltsAveragedBinaryTotal = ampVoltsAveragedBinaryTotal + 1; // Add 1 To Compensate For Zero Being Counted As 1
ampBinaryFactor = ( ampVoltsAveragedBinaryTotal / 16384 ); // Divide By Number Of Possibilities In 14 Bits
ampVolts = ampBinaryFactor * referenceVoltage; // Determine Amp Volts By Multiplying Factor Times Reference Voltage
//ampVolts = ( ampVolts - 2.096 ); // Subtract The Instrumentation Amp Offset
//ampVolts = ( ampVolts * 2 ); // Multiply Times Two Because We're Using .5 Ohm Current Sense Resistor
// ====================================================================================================
if ( ampsZeroOffsetMode == 0 ) {// If Not In Calibreation Mode ( 1 ) ... Apply Zero Offset
ampVolts = ampVolts - ampsZeroOffset;
}
// ====================================================================================================
//Serial..begin(9600);
//Serial..print("Input Amps ");
//Serial..print(ampVolts, 10);
//Serial..println();
//Serial..println();
ampVolts = ampVolts * 1000; // Multiply Amp Volts Because Map Function Cant Handle Fractions !! Do I Need This Anymore? ######################################################################
//Serial..print("x1000 Amps = ");
//Serial..print(ampVolts, 3);
//Serial..println();
//Serial..println();
inputMillAmps = round(ampVolts); // Round Up Or Down To Nearest Integer
//Serial..print("Rounded inputMillAmps = ");
//Serial..print(inputMillAmps);
//Serial..println();
//Serial..println();
/*
// *******************************************************************************************************
// Begin Positive Amp Volts Correction From Look Up Table
// *******************************************************************************************************
if ( inputMillAmps > 0 ) {
if ( ampVoltsCal[inputMillAmps] != 0 && ampsCalibrateMode == 0 ) {
//Serial..print("Calibration Point Hit... ");
ampVolts = ampVoltsCal[inputMillAmps];
//Serial..print("OutPut Will Be ");
//Serial..print(ampVolts);
//Serial..println();
//Serial..println();
}
if ( ampVoltsCal[inputMillAmps] == 0 ) { // If 0 Is Returned From Selected Array Element, No Calibration Data Is Available For Current Input, Enter This Loop
//Serial..print("No Calibration Value Found At Location ");
//Serial..print(inputMillAmps);
//Serial..println();
//Serial..println();
// ====================================================================================================
//Serial..print("... Begin Searching Up The Array For Any Stored Value...");
//Serial..println();
arrayLocationPointer = inputMillAmps ; // Set Array Location Pointer To Current Location ( Input Millamp Value )
do { // Begin Searching Elements Up The Array
arrayLocationPointer ++; // Increment Location Pointer
// //Serial..print("Searching Element Position: ");
// //Serial..print(arrayLocationPointer);
// //Serial..println();
} while ( ampVoltsCal[arrayLocationPointer] == 0); // Search As Long As 0 ( No Data ) Is Found In Each Element
upperStoredValueAddress = arrayLocationPointer; // Define Upper Address
upperStoredValue = ampVoltsCal[upperStoredValueAddress]; // Value Stored In Upper Address
//Serial..println();
//Serial..print("Upper Calibration Value Found At Adress Number ");
//Serial..print(upperStoredValueAddress);
//Serial..println();
//Serial..println();
// ====================================================================================================
//Serial..print("... Begin Searching Down The Array For Any Stored Value...");
//Serial..println();
arrayLocationPointer = inputMillAmps ; // Set Array Location Pointer To Current Location ( Input Millamp Value )
do { // Begin Searching Elements Down The Array
arrayLocationPointer --; // Increment Location Pointer
//Serial..print("Searching Element Position: ");
//Serial..print(arrayLocationPointer);
//Serial..println();
} while ( ampVoltsCal[arrayLocationPointer] == 0 && arrayLocationPointer > 0 ); // Search As Long As 0 ( No Data ) Is Found In Each Element
lowerStoredValueAddress = arrayLocationPointer; // Since We Know Addresses With Stored Data Are 100 Locations Apart, We Can Define Lower Address
lowerStoredValue = ampVoltsCal[lowerStoredValueAddress]; // Value Stored In Lower Address
//Serial..println();
//Serial..print("Lower Calibration Value Found At Adress Number ");
//Serial..print(lowerStoredValueAddress);
//Serial..println();
//Serial..println();
upperLowerAddressRange = upperStoredValueAddress - upperLowerAddressRange; // Define Address Range
upperLowerStoredValueRange = upperStoredValue - lowerStoredValue; // Define Stored Value Range
//Serial..print("Input Value = ");
//Serial..print(inputMillAmps);
//Serial..println();
// Calculate Interpolated Value =====================================================================
//Serial..println();
//Serial..print("Upper Stored Value Address = ");
//Serial..print(upperStoredValueAddress);
//Serial..println();
//Serial..print("Lower Stored Value Address = ");
//Serial..print(lowerStoredValueAddress);
//Serial..println();
upperLowerAddressRange = upperStoredValueAddress - lowerStoredValueAddress; // Calculate Upper Value / Lower Value Range
//Serial..print("Upper/Lower Address Range = ");
//Serial..print(upperLowerAddressRange);
//Serial..println();
//Serial..println();
//Serial..print("Upper Stored Value = ");
//Serial..print(upperStoredValue);
//Serial..println();
//Serial..print("Lower Stored Value = ");
//Serial..print(lowerStoredValue);
//Serial..println();
//Serial..print("Upper/Lower Stored Value Range = ");
//Serial..print(upperLowerStoredValueRange);
//Serial..println();
//Serial..println();
// Calculate Interpolated Percent
interpolatedPercent = ( float(inputMillAmps) - float(lowerStoredValueAddress) ) / ( float(upperStoredValueAddress) - float(lowerStoredValueAddress) );
//Serial..print("Inpterpolated Percent = ");
//Serial..print(interpolatedPercent, 10);
//Serial..println();
// Calculate Interpolated Output
interpolatedOutput = int(lowerStoredValue) + ( float(interpolatedPercent) * upperLowerStoredValueRange );
//Serial..println();
//Serial..print("Interpolated Output = ");
//Serial..print(interpolatedOutput);
//Serial..println();
//Serial..println();
//Serial..print("*** End Run ***");
//Serial..println();
//delay(1000000);
}
}
// ****************************************************************************************************
// End Positive Amp Volts Correction From Look Up Table
// ****************************************************************************************************
*/
if ( ampsCalibrateMode == 0 ) { // Corrected Output
ampVolts = float(ampVolts) / 1000; // Divide Positive Amp Volts Back To Original Value
}
if ( ampsCalibrateMode == 1 ) { // Un-Corrected Output
ampVolts = float(inputMillAmps) / 1000; // Divide Positive Amp Volts Back To Original Value
}
// End Amp Volts Calculations =========================================================================
// Begin Volt Volts Calculations
//voltVoltsAveragedBinaryTotal = voltVoltsAccumTotal / 1000000; // Divide Total Binary By One Million Samples
//voltBinaryFactor = ( voltVoltsAveragedBinaryTotal / 4096 ); // Divide By Number Of Possibilities In 12 Bits
//voltVolts = voltBinaryFactor * 3.0 ; // Adjust To Known Voltage Input To LTC2314 Pin 8 lowering this value lowers indicated voltage
// End Volt Volts Calculations
displayResults();
ampVolts = 0;
ampVoltsAccumTotal = 0;
voltVolts = 0;
voltVoltsAccumTotal = 0;
sampleCount = 0;
//Serial..print("Begin New Read Sequence ===============================");
//Serial..println();
//Serial..println();
}
}
}
// **********************************************************************************************************
// **********************************************************************************************************
// **********************************************************************************************************
// End Main Loop
// **********************************************************************************************************
// **********************************************************************************************************
// **********************************************************************************************************
// **********************************************************************************************************
// Begin Average And Display The Collected Results
// **********************************************************************************************************
void displayResults() {
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_YELLOW);
tft.setFont(Arial_12);
tft.setCursor(1, 1);
tft.print("ampVoltsAccumTotal = ");
tft.println(ampVoltsAccumTotal);
tft.println();
tft.print("ampVoltsAveragedBinaryTotal = ");
tft.println(ampVoltsAveragedBinaryTotal, 0);
tft.println();
tft.print("ampBinaryFactor = ");
tft.println(ampBinaryFactor, 10);
tft.println();
tft.print("Reference Voltage = ");
tft.println(referenceVoltage, 3);
tft.println();
tft.print("Reference Voltage * Factor = ");
tft.println(referenceVoltage * ampBinaryFactor, 3);
tft.println();
tft.print("ampVolts = ");
tft.print(ampVolts, 3);
if ( ampsCalibrateMode == 0 ) {
tft.print(" << Calibrated >>");
tft.println();
}
if ( ampsCalibrateMode == 1 ) {
tft.print(" << Un-Calibrated >>");
tft.println();
}
tft.println();
}
// **********************************************************************************************************
// End Average And Display The Collected Results
// **********************************************************************************************************
//###########################################################################################################
//###########################################################################################################
//###########################################################################################################
// Program End Program End Program End Program End Program End Program End Program End Program End
//###########################################################################################################
//###########################################################################################################
//###########################################################################################################