Arcadie Cracan / Mbed 2 deprecated BLDC_RPM_meter

Dependencies:   CenteredPwmOut MODSERIAL ThreePhaseBridge mbed tsi_sensor

Committer:
acracan
Date:
Tue Jul 08 17:37:36 2014 +0000
Revision:
0:c3b35a017390
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
acracan 0:c3b35a017390 1 #include "mbed.h"
acracan 0:c3b35a017390 2 #include "ThreePhaseBridge.h"
acracan 0:c3b35a017390 3 #include "tsi_sensor.h"
acracan 0:c3b35a017390 4 #include "MODSERIAL.h"
acracan 0:c3b35a017390 5
acracan 0:c3b35a017390 6 /* This defines will be replaced by PinNames soon */
acracan 0:c3b35a017390 7 #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
acracan 0:c3b35a017390 8 #define ELEC0 9
acracan 0:c3b35a017390 9 #define ELEC1 10
acracan 0:c3b35a017390 10 #elif defined (TARGET_KL05Z)
acracan 0:c3b35a017390 11 #define ELEC0 9
acracan 0:c3b35a017390 12 #define ELEC1 8
acracan 0:c3b35a017390 13 #else
acracan 0:c3b35a017390 14 #error TARGET NOT DEFINED
acracan 0:c3b35a017390 15 #endif
acracan 0:c3b35a017390 16
acracan 0:c3b35a017390 17
acracan 0:c3b35a017390 18 const int maxRpm = 6500;
acracan 0:c3b35a017390 19 const int pulseWidthRpmThreshold = 1500;
acracan 0:c3b35a017390 20 const float minPulseWidth = 3e-6;
acracan 0:c3b35a017390 21 const float pulseWidthScaleFactor = 11.2e-6;
acracan 0:c3b35a017390 22 const float pwmPeriod = 33.35e-6;
acracan 0:c3b35a017390 23 const int tsiReadPeriod = 10000;
acracan 0:c3b35a017390 24 const int pcUpdatePeriod = 1000000;
acracan 0:c3b35a017390 25
acracan 0:c3b35a017390 26 ThreePhaseBridge bridge(
acracan 0:c3b35a017390 27 PTD3, /* SW1 */
acracan 0:c3b35a017390 28 PTC11, /* SW2 */
acracan 0:c3b35a017390 29 PTC8, /* SW3 */
acracan 0:c3b35a017390 30 PTC12, /* SW4 */
acracan 0:c3b35a017390 31 PTC9, /* SW5 */
acracan 0:c3b35a017390 32 PTC13, /* SW6 */
acracan 0:c3b35a017390 33 ThreePhaseBridge::ActiveLow
acracan 0:c3b35a017390 34 );
acracan 0:c3b35a017390 35
acracan 0:c3b35a017390 36 Timer motorSpinTimer;
acracan 0:c3b35a017390 37 int motorSpinPeriod = 6000;
acracan 0:c3b35a017390 38 int motorRpm = 1500;
acracan 0:c3b35a017390 39
acracan 0:c3b35a017390 40 MODSERIAL pc(USBTX, USBRX);
acracan 0:c3b35a017390 41 Timer pcUpdateTimer;
acracan 0:c3b35a017390 42
acracan 0:c3b35a017390 43 InterruptIn rpmSig(D5);
acracan 0:c3b35a017390 44 Timer rpmSigTimer;
acracan 0:c3b35a017390 45 int rpmSigPeriod = 0;
acracan 0:c3b35a017390 46
acracan 0:c3b35a017390 47 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
acracan 0:c3b35a017390 48 Timer tsiReadTimer;
acracan 0:c3b35a017390 49
acracan 0:c3b35a017390 50 void onRpmSigRisingEdge();
acracan 0:c3b35a017390 51 void motorSpin();
acracan 0:c3b35a017390 52 void readSlider();
acracan 0:c3b35a017390 53 void pcStatusUpdate();
acracan 0:c3b35a017390 54
acracan 0:c3b35a017390 55 int main() {
acracan 0:c3b35a017390 56 bridge.period(pwmPeriod);
acracan 0:c3b35a017390 57 bridge.pulsewidth(minPulseWidth);
acracan 0:c3b35a017390 58 motorSpinTimer.start();
acracan 0:c3b35a017390 59 // bridge.overflow();
acracan 0:c3b35a017390 60 rpmSig.mode(PullNone);
acracan 0:c3b35a017390 61 rpmSig.rise(onRpmSigRisingEdge);
acracan 0:c3b35a017390 62 rpmSigTimer.start();
acracan 0:c3b35a017390 63 tsiReadTimer.start();
acracan 0:c3b35a017390 64 pcUpdateTimer.start();
acracan 0:c3b35a017390 65
acracan 0:c3b35a017390 66 while(1) {
acracan 0:c3b35a017390 67 motorSpin();
acracan 0:c3b35a017390 68 readSlider();
acracan 0:c3b35a017390 69 pcStatusUpdate();
acracan 0:c3b35a017390 70 }
acracan 0:c3b35a017390 71 }
acracan 0:c3b35a017390 72
acracan 0:c3b35a017390 73 float pulseWidthValue(int rpm)
acracan 0:c3b35a017390 74 {
acracan 0:c3b35a017390 75 if (rpm < pulseWidthRpmThreshold)
acracan 0:c3b35a017390 76 return minPulseWidth;
acracan 0:c3b35a017390 77 return minPulseWidth + pulseWidthScaleFactor * (rpm - pulseWidthRpmThreshold) / (maxRpm - pulseWidthRpmThreshold);
acracan 0:c3b35a017390 78 }
acracan 0:c3b35a017390 79
acracan 0:c3b35a017390 80 int rpmToSpinPeriod(int rpm)
acracan 0:c3b35a017390 81 {
acracan 0:c3b35a017390 82 return 10000000 / rpm;
acracan 0:c3b35a017390 83 }
acracan 0:c3b35a017390 84
acracan 0:c3b35a017390 85 void onRpmSigRisingEdge()
acracan 0:c3b35a017390 86 {
acracan 0:c3b35a017390 87 static int queue[16], queueStart = 0, queueEnd = 0;
acracan 0:c3b35a017390 88 static uint64_t sum = 0;
acracan 0:c3b35a017390 89 int time;
acracan 0:c3b35a017390 90
acracan 0:c3b35a017390 91 time = rpmSigTimer.read_us();
acracan 0:c3b35a017390 92 rpmSigTimer.reset();
acracan 0:c3b35a017390 93 if (queueStart == queueEnd && sum != 0) {
acracan 0:c3b35a017390 94 sum -= queue[queueStart];
acracan 0:c3b35a017390 95 queueStart = (queueStart + 1) & 15;
acracan 0:c3b35a017390 96 }
acracan 0:c3b35a017390 97 sum += time;
acracan 0:c3b35a017390 98 queue[queueEnd] = time;
acracan 0:c3b35a017390 99 queueEnd = (queueEnd + 1) & 15;
acracan 0:c3b35a017390 100
acracan 0:c3b35a017390 101 if (queueStart == queueEnd)
acracan 0:c3b35a017390 102 rpmSigPeriod = sum / 16;
acracan 0:c3b35a017390 103 else
acracan 0:c3b35a017390 104 rpmSigPeriod = sum / ((queueEnd + 16 - queueStart) & 15);
acracan 0:c3b35a017390 105 }
acracan 0:c3b35a017390 106
acracan 0:c3b35a017390 107 void motorSpin()
acracan 0:c3b35a017390 108 {
acracan 0:c3b35a017390 109 if (motorSpinTimer.read_us() < motorSpinPeriod)
acracan 0:c3b35a017390 110 return;
acracan 0:c3b35a017390 111 motorSpinTimer.reset();
acracan 0:c3b35a017390 112 bridge.spin(ThreePhaseBridge::CW);
acracan 0:c3b35a017390 113 }
acracan 0:c3b35a017390 114
acracan 0:c3b35a017390 115 void readSlider()
acracan 0:c3b35a017390 116 {
acracan 0:c3b35a017390 117 if (tsiReadTimer.read_us() < tsiReadPeriod)
acracan 0:c3b35a017390 118 return;
acracan 0:c3b35a017390 119 tsiReadTimer.reset();
acracan 0:c3b35a017390 120 motorRpm = 1500 + (tsi.readPercentage()) * 5000;
acracan 0:c3b35a017390 121 motorSpinPeriod = rpmToSpinPeriod(motorRpm);
acracan 0:c3b35a017390 122 }
acracan 0:c3b35a017390 123
acracan 0:c3b35a017390 124 void pcStatusUpdate()
acracan 0:c3b35a017390 125 {
acracan 0:c3b35a017390 126 if (pcUpdateTimer.read_us() < pcUpdatePeriod)
acracan 0:c3b35a017390 127 return;
acracan 0:c3b35a017390 128 pcUpdateTimer.reset();
acracan 0:c3b35a017390 129 // pc.printf("RPM: %d\n\r", motorRpm);
acracan 0:c3b35a017390 130 // pc.printf("Sensor: %d\n\r", 60000000/ (rpmSigPeriod * 10) );
acracan 0:c3b35a017390 131 pc.printf("Ref period: %d\n\r", motorSpinPeriod * 6);
acracan 0:c3b35a017390 132 pc.printf("Sensor period: %d\n\r", rpmSigPeriod * 10 / 7);
acracan 0:c3b35a017390 133 }