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:

  1. Forward preparation
  2. Forward measurement
  3. Backward return
  4. Gap dismissal
  5. Backward measurement
  6. 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

  1. Accuracy

    • High-resolution measurement
    • Multiple samples per position
    • Bi-directional validation
    • Error compensation
  2. Reliability

    • Comprehensive error checking
    • Data validation
    • Flash data persistence
    • Recovery mechanisms
  3. Performance

    • Fast angle updates
    • Efficient lookup table
    • Optimized calculations
    • Quick calibration process
  4. 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.