123
Fork of LG by
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 }