Telescope Control Library
StepOut.cpp@0:6cb2eaf8b133, 2018-08-19 (annotated)
- Committer:
- caoyuan9642
- Date:
- Sun Aug 19 05:21:20 2018 +0000
- Revision:
- 0:6cb2eaf8b133
- Child:
- 17:7e47bc1630c0
v0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
caoyuan9642 | 0:6cb2eaf8b133 | 1 | /* |
caoyuan9642 | 0:6cb2eaf8b133 | 2 | #include <StepOut.h> |
caoyuan9642 | 0:6cb2eaf8b133 | 3 | * ControllablePWMOut.cpp |
caoyuan9642 | 0:6cb2eaf8b133 | 4 | * |
caoyuan9642 | 0:6cb2eaf8b133 | 5 | * Created on: 2018Äê2ÔÂ9ÈÕ |
caoyuan9642 | 0:6cb2eaf8b133 | 6 | * Author: caoyuan9642 |
caoyuan9642 | 0:6cb2eaf8b133 | 7 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 8 | |
caoyuan9642 | 0:6cb2eaf8b133 | 9 | #include "mbed.h" |
caoyuan9642 | 0:6cb2eaf8b133 | 10 | #include <StepOut.h> |
caoyuan9642 | 0:6cb2eaf8b133 | 11 | |
caoyuan9642 | 0:6cb2eaf8b133 | 12 | void StepOut::start() |
caoyuan9642 | 0:6cb2eaf8b133 | 13 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 14 | if (status == IDLE && freq > 0) // Start only when idle and frequency is not zero |
caoyuan9642 | 0:6cb2eaf8b133 | 15 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 16 | core_util_critical_section_enter(); |
caoyuan9642 | 0:6cb2eaf8b133 | 17 | status = STEPPING; |
caoyuan9642 | 0:6cb2eaf8b133 | 18 | this->write(0.5f); |
caoyuan9642 | 0:6cb2eaf8b133 | 19 | tim.reset(); |
caoyuan9642 | 0:6cb2eaf8b133 | 20 | core_util_critical_section_exit(); |
caoyuan9642 | 0:6cb2eaf8b133 | 21 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 22 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 23 | |
caoyuan9642 | 0:6cb2eaf8b133 | 24 | void StepOut::stop() |
caoyuan9642 | 0:6cb2eaf8b133 | 25 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 26 | if (status == STEPPING) |
caoyuan9642 | 0:6cb2eaf8b133 | 27 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 28 | core_util_critical_section_enter(); |
caoyuan9642 | 0:6cb2eaf8b133 | 29 | status = IDLE; |
caoyuan9642 | 0:6cb2eaf8b133 | 30 | this->write(0); |
caoyuan9642 | 0:6cb2eaf8b133 | 31 | stepCount += (int64_t) (freq * tim.read_high_resolution_us() / 1.0E6); |
caoyuan9642 | 0:6cb2eaf8b133 | 32 | core_util_critical_section_exit(); |
caoyuan9642 | 0:6cb2eaf8b133 | 33 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 34 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 35 | |
caoyuan9642 | 0:6cb2eaf8b133 | 36 | double StepOut::setFrequency(double frequency) |
caoyuan9642 | 0:6cb2eaf8b133 | 37 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 38 | if (frequency > 0) |
caoyuan9642 | 0:6cb2eaf8b133 | 39 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 40 | int64_t us_period = ceil(1.0E6 / frequency); /*Ceil to the next microsecond*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 41 | if (us_period > INT_MAX) |
caoyuan9642 | 0:6cb2eaf8b133 | 42 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 43 | // Prevent overflow |
caoyuan9642 | 0:6cb2eaf8b133 | 44 | us_period = INT_MAX; |
caoyuan9642 | 0:6cb2eaf8b133 | 45 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 46 | if (status == IDLE) |
caoyuan9642 | 0:6cb2eaf8b133 | 47 | this->period_us(us_period); |
caoyuan9642 | 0:6cb2eaf8b133 | 48 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 49 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 50 | core_util_critical_section_enter(); |
caoyuan9642 | 0:6cb2eaf8b133 | 51 | stop(); /*Stop to correctly update the stepCount*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 52 | this->period_us(us_period); |
caoyuan9642 | 0:6cb2eaf8b133 | 53 | start(); |
caoyuan9642 | 0:6cb2eaf8b133 | 54 | core_util_critical_section_exit(); |
caoyuan9642 | 0:6cb2eaf8b133 | 55 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 56 | freq = 1.0E6 / us_period; // get CORRECT frequency! |
caoyuan9642 | 0:6cb2eaf8b133 | 57 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 58 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 59 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 60 | // frequency=0 effectively means stop |
caoyuan9642 | 0:6cb2eaf8b133 | 61 | freq = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 62 | if (status == STEPPING) |
caoyuan9642 | 0:6cb2eaf8b133 | 63 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 64 | stop(); |
caoyuan9642 | 0:6cb2eaf8b133 | 65 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 66 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 67 | return freq; // Return the accurate period |
caoyuan9642 | 0:6cb2eaf8b133 | 68 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 69 | |
caoyuan9642 | 0:6cb2eaf8b133 | 70 | void StepOut::resetCount() |
caoyuan9642 | 0:6cb2eaf8b133 | 71 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 72 | core_util_critical_section_enter(); |
caoyuan9642 | 0:6cb2eaf8b133 | 73 | stepCount = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 74 | if (status == STEPPING) |
caoyuan9642 | 0:6cb2eaf8b133 | 75 | tim.reset(); |
caoyuan9642 | 0:6cb2eaf8b133 | 76 | core_util_critical_section_exit(); |
caoyuan9642 | 0:6cb2eaf8b133 | 77 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 78 | |
caoyuan9642 | 0:6cb2eaf8b133 | 79 | int64_t StepOut::getCount() |
caoyuan9642 | 0:6cb2eaf8b133 | 80 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 81 | if (status == IDLE) |
caoyuan9642 | 0:6cb2eaf8b133 | 82 | return stepCount; |
caoyuan9642 | 0:6cb2eaf8b133 | 83 | else |
caoyuan9642 | 0:6cb2eaf8b133 | 84 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 85 | // Fixed: use read_high_resolution_us() to prevent overflow every ~30min |
caoyuan9642 | 0:6cb2eaf8b133 | 86 | return stepCount |
caoyuan9642 | 0:6cb2eaf8b133 | 87 | + (int64_t) (freq * tim.read_high_resolution_us() / 1.0E6); /*Calculate count at now*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 88 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 89 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 90 | |
caoyuan9642 | 0:6cb2eaf8b133 | 91 |