POT - Analog Potentiometer Reader Component
POT - Analog Potentiometer Reader
Section titled “POT - Analog Potentiometer Reader”Path: src/pot.h
Revision History: Initial documentation
A lightweight, efficient analog potentiometer reader component with multiple filtering options and Modbus integration. It features three damping algorithms (none, moving average, and EMA), deadband processing to suppress noise, and support for both local and remote control modes.
REQUIREMENTS
Section titled “REQUIREMENTS”- Hardware:
- Analog input pin for potentiometer connection
- Optional RC low-pass filter hardware for additional noise reduction
- Software:
- Arduino framework
- ArduinoLog library
- Modbus support (ModbusTCP)
FEATURES
Section titled “FEATURES”- Three damping algorithms:
- No damping (raw readings)
- Moving Average (box-car) filtering with configurable window size
- Exponential Moving Average (EMA) with configurable alpha
- Dead-band filtering to suppress small value changes
- Configurable scaling from raw ADC values (0-1023) to application range (0-100 by default)
- Modbus TCP integration with support for:
- Reading current potentiometer value
- Switching between local and remote control modes
- Setting remote value for when in remote control mode
- No dynamic memory allocation, designed for resource-constrained microcontrollers
- Avoids floating-point operations for optimal performance
DEPENDENCIES
Section titled “DEPENDENCIES”BEHAVIOUR
Section titled “BEHAVIOUR”PERFORMANCE
Section titled “PERFORMANCE”- Consider adaptive filtering based on rate of change for better response characteristics
- Explore efficient normalization techniques to handle different ADC resolutions (10-bit vs 12-bit)
- Implement more sophisticated filtering algorithms if needed for high-noise environments
SECURITY
Section titled “SECURITY”- Add bounds checking for remote control values to prevent overflow/underflow conditions
- Implement authentication for remote control mode changes in security-sensitive applications
- Consider adding fail-safe behavior for loss of Modbus communication
COMPLIANCE
Section titled “COMPLIANCE”- Verify compliance with IEC 61131-3 for industrial control systems
- Ensure Modbus implementation follows Modbus specification guidelines
- Document EMC considerations for analog input circuits
RECOMMENDATIONS
Section titled “RECOMMENDATIONS”- Use a hardware RC low-pass filter as suggested in the component comments for noisy environments
- Select appropriate damping algorithm based on application needs:
- NONE: Fast response but noisy
- MOVING_AVERAGE: Good balance of smoothing and responsiveness
- EMA: Smooth response with less memory requirements
- Adjust deadband (POT_DEADBAND) based on the stability requirements of the application
EXAMPLE
Section titled “EXAMPLE”This example demonstrates how to initialize a POT component with moving average filtering:
#ifdef PIN_POT_SPEED potSpeed = new POT( this, // owner PIN_POT_SPEED, // pin ID_POT_SPEED, // id POT_SPEED_MB_ADDR, // modbusAddress POTDampingAlgorithm::DAMPING_MOVING_AVERAGE // filtering algorithm );
if (potSpeed) { components.push_back(potSpeed); Log.infoln(F("POT Speed initialized. Pin:%d, ID:%d, MB:%d"), PIN_POT_SPEED, ID_POT_SPEED, POT_SPEED_MB_ADDR); } else { Log.errorln(F("POT Speed initialization failed.")); }#endif
References
Section titled “References”The component implements several filtering techniques for noise reduction:
- Moving Average: Implemented as an incremental ring buffer with O(1) complexity
- Exponential Moving Average (EMA): Uses a 1-pole IIR filter with the formula:
y[n] = y[n-1] + (x[n] - y[n-1]) / 2^k
The hardware recommendations include an RC low-pass filter with the potentiometer itself serving as the resistor, and suggested capacitor values based on desired cutoff frequencies:
- For faster response (~30 Hz): Use 1 μF
- For moderate filtering (~10 Hz): Use 2.2 μF or 3.3 μF
- For more smoothing (~5 Hz): Use 4.7 μF or 6.8 μF