Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: CenteredPwmOut MODSERIAL ThreePhaseBridge mbed tsi_sensor
main.cpp@0:c3b35a017390, 2014-07-08 (annotated)
- Committer:
- acracan
- Date:
- Tue Jul 08 17:37:36 2014 +0000
- Revision:
- 0:c3b35a017390
Initial commit.
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |