#define VERSION "AD5941_updatedAcqBuild_SATCHECKS" #define AUTHOR "09/30/2025, MK" /** * @file ad5941_library_extension.h * @brief For connecting teensy microcontroller to ad5941 via SPI with interrupt functionality * @author MK, Aly Development * * @details * Teensy 4.0 extension for the AD5941/AD5940 AFE (Analog Front End) library * from Analog Devices Inc. * * Provides hardware interface functions and * application-specific measurement routines for conductivity * and RTD temperature sensing. * * **** Note: Any application of this software should be thoroughly tested and validated **** * * Adapted and expanded from: https://github.com/analogdevicesinc/ad5940-examples */ #ifndef AD5941_LIBRARY_EXTENSION_H #define AD5941_LIBRARY_EXTENSION_H #include extern "C" { #include "ad5940.h" #include "impedance.h" } #include /******************************************************************************* * USER CONFIGURATION SECTION ******************************************************************************/ // SPI Settings #define SPI_SPEED 1600000 // Pin Configuration #define TEENSY_SPI_CS_PIN 10 //update for multiple ad5941 #define EN_A 20 #define EN_B 23 #define EN_C 2 #define SELECT_A 19 #define SELECT_B 16 #define SELECT_C 7 #define numSettlingMeasurements 0 // set to 0 to remove, problem appears resolved -MK #define repeatNumber 1 // number of values if doing median filtering (please set to odd number only) // set to 1 as settling time fixed most jitter issues. // GLOBAL Reference Resistor Value (Ohms) #define REF_RESISTOR_VALUE 1000.0f // r cal // GLOBAL #define DEFAULT_RTD_VALUE 25.0f // CONDUCTIVITY Switch Matrix Configuration #define DEFAULT_DSWITCH_CON SWD_AIN2 // D switch connection #define DEFAULT_PSWITCH_CON SWP_AIN2 // P switch connection #define DEFAULT_NSWITCH_CON SWN_AIN3 // N switch connection #define DEFAULT_TSWITCH_CON (SWT_AIN3 | SWT_TRTIA) // T switch connection; technically SWT_TRTIA is unneeded as it auto connects it in impedance.c during measurement // CONDUCTIVITY Default Measurement Parameters #define DEFAULT_RTIA HSTIARTIA_200 // TIA feedback resistor #define DEFAULT_FREQ 10000.0f // Default frequency (Hz) #define DEFAULT_FIFO_THRESH 4 // FIFO threshold for interrupt // RTD Switch Matrix Configuration #define RTD_DSWITCH (SWD_AFE1) // Connect D to AFE1 #define RTD_PSWITCH (SWP_AFE1) // Connect P to AFE1 #define RTD_NSWITCH (SWN_AIN0) // Connect N to AIN0 #define RTD_TSWITCH (SWT_AIN0 | SWT_TRTIA) // Connect T to AIN0 and RTIA // RTD Default Measurement Parameters #define RTD_RTIA HSTIARTIA_1K // TIA feedback resistor // number samples for RTD measurement #ifndef NUM_RTD_SAMPLES # define NUM_RTD_SAMPLES 32UL // ⩾8 – must be power of two if you want fast shift divide #endif #define APPBUFF_SIZE 512 // EEPROM opcodes from datasheet #define EEPROM_WREN 0x06 // Write Enable #define EEPROM_WRDI 0x04 // Write Disable #define EEPROM_RDSR 0x05 // Read Status Register #define EEPROM_WRSR 0x01 // Write Status Register #define EEPROM_READ 0x03 // Read from Memory Array #define EEPROM_WRITE 0x02 // Write to Memory Array #define EEPROM_SIZE 128 // AT25010B - 128 bytes (1Kbit) #define DEFAULT_DFTNUM DFTNUM_16384 #define maxValueThresholdADC 55000 // upper limit for saturation flag #define MAX_NUM_OF_SENSORS 6 // Total number of sensors. /******************************************************************************* * FUNCTION DECLARATIONS - DO NOT MODIFY BELOW THIS LINE ******************************************************************************/ /****************************************************************************** * LIBRARY EXTENSION FUNCTIONS * * The following functions allow the MCU to interface with the Analog Devices libraries *****************************************************************************/ void AD5940_CsSet(void); void AD5940_CsClr(void); void AD5940_RstSet(void); void AD5940_RstClr(void); void AD5940_Delay10us(uint32_t iTime); void AD5940_ReadWriteNBytes(unsigned char *pSendBuffer, unsigned char *pRecvBuff, unsigned long length); uint32_t AD5940_ClrMCUIntFlag(void); void canary(const char* format, ...); void AD5940_InterruptHandler(); /****************************************************************************** * APPLICATION SPECIFIC FUNCTIONS * * The following functions extend the base AD5940 library with application- * specific implementations for impedance measurement, RTD sensing, and * system configuration management. *****************************************************************************/ float AppRTDMeasure(float sensor_mV); void handleConfigCommand(String); void saveCurrentConfig(); void recallSavedConfig(); void ImpedanceShowResult(uint32_t *pData, uint32_t DataCount); bool startupAD5941(); bool AppIMPMeasure(int readingCount); void printCurrentConfigShort(); void printHelp(); void readCommand(); void selectUnit(int unitIn); void eepromTest(); void writeFloat(unsigned int address, float data); float readFloat(unsigned int address); void writeDoubles(unsigned int baseAddress, double* data, int count); void readDoubles(unsigned int baseAddress, double* data, int count); double readDouble(unsigned int address); void writeDouble(unsigned int address, double data); void writeByte(unsigned int address, byte data); byte readByte(unsigned int address); void writeEnable(); void handleSaveCommand(String command); void handleLoadCommand(); void initializeAllUnits(); bool initializeSelectedUnits(); void initializeSingleUnit(int unit); void printUnitStatusSummary(); void measureAllSuccessfulUnits(); void selectFirstWorkingUnit(); float AppRTDDriveHold(float sensor_mV, uint32_t hold_seconds = 0); void AppRTDDriveStop(); float calculateMedian(float arr[], int size); void resetSwitchMatrix(); void fullAD5940Reset(); static void AD5940_EnableAdcMaxSaturationIRQ(uint32_t max_code, uint16_t hysteresis); static inline bool AD5940_IsAdcMaxSaturatedAndClear(); // ************************************ Diality ********************************************** bool getAllMesaurements(void); void getSelectedSensorMeasurements(void); float getRTDMeasurements(float sensor_mV); void updateEEPROMdata(String command); void getEEPROMdata(void); void updateMeasurementSettings(String cmd); void getMesaurementSettings(void); void getInitStatus(void); void sendAllSensorData( void ); void initPacketToDefault ( int unit ); bool isSensorValid (int unit); bool isSensorInitialized (int unit); #endif