123

Dependencies:   mbed

Fork of LG by igor Apu

DeviceCounters.c

Committer:
Diletant
Date:
2016-07-03
Revision:
177:672ef279c8e0
Parent:
174:0f86eedd511c
Child:
182:2bd8ec44998f

File content as of revision 177:672ef279c8e0:

#include "Device.h"
extern Device device;

void InitCountersDefaultSettings(void){
  device.counters.latch.settings.enabled = 0; //External latch disabled
  device.counters.latch.settings.signal = 0;  //External latch signal 0/1 - RS422/Wire
  device.counters.latch.settings.format = 0;  //DeltaPS
  device.counters.latch.settings.reset = 1;   //Reset device.counters.dither.state.angle on latch
  
  device.counters.rate.settings.source = 0;   //Dither counters
}

void InitCountersState(void){
  device.counters.latch.state.enabled = device.counters.latch.settings.enabled;
  device.counters.latch.state.signal = device.counters.latch.settings.signal;
  device.counters.latch.state.format = device.counters.latch.settings.format;
  device.counters.latch.state.reset = device.counters.latch.settings.reset;
  device.counters.latch.state.clock = 0;
  device.counters.latch.state.angle = 0;
  
  //Dither latched counters
  for (uint8_t i = 0; i < 32; i++) device.counters.dither.state.delta[i] = 0;
  device.counters.dither.state.rate = 0;
  device.counters.dither.state.angle = 0;
  device.counters.dither.state.amplitude = 0;
  device.counters.dither.state.displacement = 0;
  //device.counters.dither.state.frequency = 0;
  //Meander latched counters
  device.counters.meander.state.a = 0;
  device.counters.meander.state.b = 0;
  device.counters.meander.state.c = 0;
  device.counters.meander.state.rate[0] = 0;
  device.counters.meander.state.rate[1] = 0;
  device.counters.meander.state.angle[0] = 0;
  device.counters.meander.state.angle[1] = 0;
  device.counters.meander.state.amplitude = 0;
  
  device.counters.rate.state.source = device.counters.rate.settings.source;
}

void DeviceStartCounters(void){
  DeviceStartQEI();
}

void countersProcess(void){
  //
  //Process dither latched counters
  //
  int32_t income = device.controller.QEI.state.delta;
  int32_t outcome = device.counters.dither.state.delta[device.measurement.counter];
  device.counters.dither.state.delta[device.measurement.counter] = income;
  
  //Angle, accumulated for measurement cycle
  //  Subtract outcoming pulses
  device.counters.dither.state.rate -= outcome;
  //  Add incoming pulses
  device.counters.dither.state.rate += income;
  //Accumulated angle
  device.counters.dither.state.angle += device.counters.dither.state.rate;
  
  //Displacement (restored sine angle)
  //  Subtract outcoming half wave
  //    Add outcoming half wave end
  device.counters.dither.state.displacement += outcome;
  //    Subtract outcoming half wave start
  device.counters.dither.state.displacement -= device.counters.dither.state.delta[(device.measurement.counter-16) & 0x1f];
  //  Add incoming half wave
  //    Subtract incoming half wave end
  device.counters.dither.state.displacement -= device.counters.dither.state.delta[(device.measurement.counter-15) & 0x1f];
  //    Add incoming half wave start
  device.counters.dither.state.displacement += income;
  
  //Amplitude
  //if (device.counters.dither.state.displacement > 0) device.counters.dither.state.amp += device.counters.dither.state.displacement;
  //if (device.counters.dither.state.displacement < 0) device.counters.dither.state.amp -= device.counters.dither.state.displacement;
  
  //Dither amplitude/Output frequency
  //  Subtract outcoming pulses
  if (outcome > 0) device.counters.dither.state.amplitude -= outcome;
  if (outcome < 0) device.counters.dither.state.amplitude += outcome;
  //  Add incoming pulses
  if (income > 0) device.counters.dither.state.amplitude += income;
  if (income < 0) device.counters.dither.state.amplitude -= income;
  
  //
  //Process restored meander counters - low accuracy
  //
  //if (income > 0) a += income
  //if (income < 0) b += income
  if (income > 0) device.counters.meander.state.a += income;
  if (income < 0) device.counters.meander.state.b -= income;
  if (device.measurement.counter == 31) {
    device.counters.meander.state.rate[0] = device.counters.meander.state.a - device.counters.meander.state.b;
    device.counters.meander.state.rate[1] = device.counters.meander.state.a - device.counters.meander.state.c;
    device.counters.meander.state.amplitude = device.counters.meander.state.a + device.counters.meander.state.b;
    device.counters.meander.state.angle[0] += device.counters.meander.state.rate[0];
    device.counters.meander.state.angle[1] += device.counters.meander.state.rate[1];
    
    //Process MRate data
    //device.counters.rate.state.a = device.counters.meander.state.a;
    //device.counters.rate.state.b = device.counters.meander.state.b;
    //device.counters.rate.state.angle = device.counters.meander.state.angle[0] + device.counters.meander.state.angle[1] >> 1;
    
    //Reset meander latched counters
    device.counters.meander.state.c = device.counters.meander.state.a;
    device.counters.meander.state.a = 0;
    device.counters.meander.state.b = 0;
  }
  
  //Virtual zero sensor - low accuracy
  //if (device.counters.state.displacement > 0) a += income
  //if (device.counters.state.displacement < 0) b += income
}