- Overview
- Core Architecture Components
- Signal Processing Pipeline
- Safety & Failsafe System
- Class Structure
- Data Flow Architecture
- Memory Architecture
- Timing Architecture
- Error Handling Architecture
- Configuration Architecture
- Integration Architecture
AutoThrottleNG is a PID-based control library designed for Arduino platforms, providing throttle/output control with safety and filtering features. The library integrates Arduino PID control with signal processing and safety mechanisms.
- Library Integration: Built on Arduino's standard PID library (PID_v1)
- Algorithm: Implements Proportional-Integral-Derivative control
- Configuration: Supports P_ON_E (Proportional on Error) and P_ON_M (Proportional on Measurement)
Raw Input → Input Filter → PID Algorithm → Output Smoothing → Final Output
↓ ↓ ↓ ↓ ↓
Sensor EMA Filter PID Controller Ramp Limiting Actuator
Reading (Optional) Computation (Optional) Control
- Error States: NONE, INPUT_INVALID, INPUT_TIMEOUT, STABILITY_TIMEOUT
- Failsafe Value: Configurable safe output when errors occur
- Automatic Recovery: Manual intervention required to clear errors
class AutoThrottleNG {
private:
// PID Controller
PID _pid;
// Signal Processing
double _pidInput; // Filtered input to PID
double _pidOutput; // Raw PID output
double _pidSetpoint; // Target value
// Control Parameters
double _minOutputLimit;
double _maxOutputLimit;
double _currentSmoothedOutput;
// Filtering & Smoothing
double _inputFilterAlpha;
bool _smoothingEnabled;
double _smoothingRate;
// Failsafe System
Error _errorState;
double _failsafeOutputValue;
unsigned long _inputTimeoutMillis;
unsigned long _stabilityTimeoutMillis;
// Helper Methods
double applyInputFilter(double);
double applyOutputSmoothing(double);
void updateFailsafeState(Error);
void checkTimeouts(unsigned long);
};Sensor Reading → Validity Check → Input Filtering → PID Input
↓
Error: INPUT_INVALID
PID Input + Setpoint → PID Algorithm → Raw Output → Saturation Check
↓
Output Saturated Flag
Raw PID Output → Output Smoothing → Range Limiting → Final Output
↓ ↓
Rate Limiting Min/Max Constraints
All Stages → Error Detection → Failsafe Override → Safe Output
↓ ↓
Timeout Checks Failsafe Value
Stability Checks
- Core Variables: PID controller instance, control parameters
- State Variables: Current outputs, error states, timing variables
- Configuration: Limits, timeouts, filter parameters
- Program Memory: ~7-11KB depending on features used
- Dynamic Memory: ~450-984 bytes depending on example complexity
- Stack Usage: Minimal, suitable for resource-constrained environments
- PID Sample Time: Configurable via
setSampleTime() - Compute Frequency: Called in main loop, typically 50-1000ms intervals
- Timeout Monitoring: Millisecond-precision using
millis()
Main Loop:
├── Read Sensors (updateInput())
├── Compute Control (compute())
├── Apply Output (to actuator)
├── Monitor Status (getThrottle(), etc.)
└── Handle Errors (isInErrorState(), clearErrorState())
NORMAL OPERATION
↓ (Error Detected)
ERROR STATE ACTIVE
↓ (clearErrorState())
NORMAL OPERATION (RESUMED)
- INPUT_INVALID: NaN/Infinity sensor readings
- INPUT_TIMEOUT: No sensor updates within timeout period
- STABILITY_TIMEOUT: System unstable beyond tolerance duration
- PID Tuning:
setTunings(kp, ki, kd, pOn) - Output Limits:
setOutputLimits(min, max) - Controller Direction:
setControllerDirection(DIRECT/REVERSE) - Sample Time:
setSampleTime(millis)
- Input Filtering:
setInputFilterAlpha(alpha) - Output Smoothing:
enableSmoothing(enable, rate) - Failsafe Settings:
setFailsafeValue(),setInputTimeout(),setStabilityParams()
- Standard Libraries: Uses Arduino PID library v1.2.0+, Arduino core libraries
- Board Compatibility: AVR (Uno, Mega, Leonardo), ESP32, ARM (Due, Zero), SAMD (MKR)
- IDE Support: Arduino IDE 1.8+, PlatformIO, VS Code with Arduino extension
- Framework Compatibility: Arduino framework on all supported platforms
- Sensor Interface: Generic double-precision input for any sensor type
- Actuator Interface: Generic double-precision output supporting PWM, DAC, serial protocols
- Timer Interface: Arduino
millis()for consistent timing across all platforms - Interrupt Handling: Compatible with Arduino interrupt system for encoder inputs
- Primary: Arduino PID library (automatically managed)
- Core: Arduino.h, math.h for standard functions
- Optional: Servo.h for servo control examples
- No External: No additional libraries required for core functionality
- Memory Constraints: Optimized for AVR (2KB RAM) to ESP32 (512KB+ RAM)
- Timing Resolution: Uses millisecond precision suitable for control applications
- Interrupt Availability: Supports encoder interfaces on interrupt-capable pins
- PWM Resolution: Adapts to available PWM resolution (8-bit AVR to 16-bit ESP32)
- Library Manager: Compatible with Arduino Library Manager installation
- Include Structure: Standard Arduino library include paths
- Build System: Integrates with Arduino build system and compiler flags
- Debug Support: Compatible with Serial debugging and monitoring tools
- Modular Design: Core PID functionality separated from signal processing
- Plugin Architecture: Easy to extend with custom signal processing
- Configuration Flexibility: Runtime configuration without recompilation
- Error Handling: Comprehensive error reporting for integration debugging
This architecture ensures AutoThrottleNG is resource-efficient, suitable for a wide range of control applications while maintaining safety and reliability. The modular design allows for easy integration into existing projects and extension for specialized applications.