This document details the implementation of an encoder calibration system for precise stepper motor position control.
1. System Overview
Basic Architecture
class EncoderBase {
typedef struct {
uint16_t rawAngle; // raw data
uint16_t rectifiedAngle; // calibrated rawAngle data
bool rectifyValid;
} AngleData_t;
const int32_t RESOLUTION = ((int32_t)((0x00000001U) << 14)); // 16384 points
};
Key features:
- 14-bit resolution (16384 positions)
- Raw and calibrated angle tracking
- Validation system for calibration data
2. Calibration Process
State Machine
typedef enum {
CALI_DISABLE = 0x00,
CALI_FORWARD_PREPARE,
CALI_FORWARD_MEASURE,
CALI_BACKWARD_RETURN,
CALI_BACKWARD_GAP_DISMISS,
CALI_BACKWARD_MEASURE,
CALI_CALCULATING,
} State_t;
Calibration steps:
- Forward preparation
- Forward measurement
- Backward return
- Gap dismissal
- Backward measurement
- Data calculation
3. Measurement System
Data Collection
static const int32_t MOTOR_ONE_CIRCLE_HARD_STEPS = 200; // 1.8° steps
static const uint8_t SAMPLE_COUNTS_PER_STEP = 16;
static const uint8_t AUTO_CALIB_SPEED = 2;
static const uint8_t FINE_TUNE_CALIB_SPEED = 1;
Features:
- Multiple samples per step
- Bi-directional measurement
- Automatic speed control
- Fine-tuning capabilities
Data Processing
int32_t CycleDataAverage(const uint16_t* _data, uint16_t _length, int32_t _cyc)
{
// Cycle-aware averaging algorithm
// Handles wraparound cases
// Ensures consistent results
}
4. Validation System
Error Checking
typedef enum {
CALI_NO_ERROR = 0x00,
CALI_ERROR_AVERAGE_DIR,
CALI_ERROR_AVERAGE_CONTINUTY,
CALI_ERROR_PHASE_STEP,
CALI_ERROR_ANALYSIS_QUANTITY,
} Error_t;
Validation checks:
- Direction consistency
- Data continuity
- Phase stepping
- Quantity analysis
Data Validation
void CalibrationDataCheck()
{
// Check data direction
// Verify data continuity
// Validate step consistency
// Confirm measurement accuracy
}
5. MT6816 Encoder Implementation
Initialization
bool MT6816Base::Init()
{
SpiInit();
UpdateAngle();
// Validate calibration data
angleData.rectifyValid = true;
for (uint32_t i = 0; i < RESOLUTION; i++) {
if (quickCaliDataPtr[i] == 0xFFFF)
angleData.rectifyValid = false;
}
}
Features:
- SPI communication setup
- Calibration data validation
- Quick lookup table initialization
Angle Reading
uint16_t MT6816Base::UpdateAngle()
{
// Read raw angle data
// Apply parity checking
// Perform angle correction
// Return calibrated value
}
6. Flash Management
Data Storage
void TickMainLoop()
{
// Calculate calibration data
ClearFlash();
BeginWriteFlash();
// Store calibration values
EndWriteFlash();
}
Features:
- Safe flash writing
- Data integrity checks
- Error recovery
- System reset after calibration
7. Key Algorithms
Cycle Arithmetic
static uint32_t CycleMod(uint32_t _a, uint32_t _b)
static int32_t CycleSubtract(int32_t _a, int32_t _b, int32_t _cyc)
static int32_t CycleAverage(int32_t _a, int32_t _b, int32_t _cyc)
Implements:
- Modular arithmetic
- Wraparound handling
- Averaging with cycle awareness
- Delta calculations
8. System Benefits
-
Accuracy
- High-resolution measurement
- Multiple samples per position
- Bi-directional validation
- Error compensation
-
Reliability
- Comprehensive error checking
- Data validation
- Flash data persistence
- Recovery mechanisms
-
Performance
- Fast angle updates
- Efficient lookup table
- Optimized calculations
- Quick calibration process
-
Flexibility
- Adaptable to different encoders
- Configurable parameters
- Multiple validation methods
- Extensible architecture
This implementation provides a robust foundation for precise position feedback in stepper motor applications requiring high accuracy and reliability.