Fork of original FastPWM libary from Sissors.
Dependents: PM2_Libary PM2_Libary
FastPWM_common.cpp@38:b83caa1bcbc7, 2022-03-21 (annotated)
- Committer:
- pmic
- Date:
- Mon Mar 21 14:03:24 2022 +0000
- Revision:
- 38:b83caa1bcbc7
- Parent:
- 37:0ca2cf9a1437
Bugfix.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Sissors | 4:a7b9f778c4b4 | 1 | #include "FastPWM.h" |
| Sissors | 4:a7b9f778c4b4 | 2 | |
| Sissors | 4:a7b9f778c4b4 | 3 | FastPWM::FastPWM(PinName pin, int prescaler) : PwmOut(pin) { |
| Sissors | 12:4600daab8a83 | 4 | fast_obj = NULL; |
| Sissors | 4:a7b9f778c4b4 | 5 | initFastPWM(); |
| Sissors | 4:a7b9f778c4b4 | 6 | this->prescaler(prescaler); |
| Sissors | 4:a7b9f778c4b4 | 7 | |
| Sissors | 4:a7b9f778c4b4 | 8 | //Set duty cycle on 0%, period on 20ms |
| Sissors | 4:a7b9f778c4b4 | 9 | period(0.02); |
| pmic | 38:b83caa1bcbc7 | 10 | write(0.0); |
| Sissors | 4:a7b9f778c4b4 | 11 | } |
| Sissors | 4:a7b9f778c4b4 | 12 | |
| Sissors | 12:4600daab8a83 | 13 | FastPWM::~FastPWM( void ) { |
| Sissors | 12:4600daab8a83 | 14 | if (fast_obj != NULL) |
| blaze | 35:d6c2b73d71f5 | 15 | free(fast_obj); |
| Sissors | 12:4600daab8a83 | 16 | } |
| Sissors | 12:4600daab8a83 | 17 | |
| Sissors | 4:a7b9f778c4b4 | 18 | void FastPWM::period(double seconds) { |
| Sissors | 4:a7b9f778c4b4 | 19 | if (dynamicPrescaler) |
| Sissors | 4:a7b9f778c4b4 | 20 | calcPrescaler((uint64_t)(seconds * (double) SystemCoreClock)); |
| Sissors | 4:a7b9f778c4b4 | 21 | |
| Sissors | 4:a7b9f778c4b4 | 22 | period_ticks(seconds * dticks + 0.5); |
| Sissors | 4:a7b9f778c4b4 | 23 | } |
| Sissors | 4:a7b9f778c4b4 | 24 | |
| pmic | 36:1cc92cba9e04 | 25 | void FastPWM::period(float seconds) { |
| pmic | 36:1cc92cba9e04 | 26 | period( static_cast<double>(seconds) ); |
| pmic | 36:1cc92cba9e04 | 27 | } |
| pmic | 36:1cc92cba9e04 | 28 | |
| Sissors | 4:a7b9f778c4b4 | 29 | void FastPWM::period_ms(int ms) { |
| Sissors | 4:a7b9f778c4b4 | 30 | if (dynamicPrescaler) |
| Sissors | 4:a7b9f778c4b4 | 31 | calcPrescaler(ms * (SystemCoreClock / 1000)); |
| Sissors | 4:a7b9f778c4b4 | 32 | |
| Sissors | 4:a7b9f778c4b4 | 33 | period_ticks(ms * iticks_ms); |
| Sissors | 4:a7b9f778c4b4 | 34 | } |
| Sissors | 4:a7b9f778c4b4 | 35 | |
| Sissors | 4:a7b9f778c4b4 | 36 | void FastPWM::period_us(int us) { |
| Sissors | 4:a7b9f778c4b4 | 37 | if (dynamicPrescaler) |
| Sissors | 4:a7b9f778c4b4 | 38 | calcPrescaler(us * (SystemCoreClock / 1000000)); |
| Sissors | 4:a7b9f778c4b4 | 39 | |
| Sissors | 4:a7b9f778c4b4 | 40 | period_ticks(us * iticks_us); |
| Sissors | 4:a7b9f778c4b4 | 41 | } |
| Sissors | 4:a7b9f778c4b4 | 42 | |
| Sissors | 4:a7b9f778c4b4 | 43 | void FastPWM::period_us(double us) { |
| Sissors | 4:a7b9f778c4b4 | 44 | if (dynamicPrescaler) |
| Sissors | 4:a7b9f778c4b4 | 45 | calcPrescaler((uint64_t)(us * (double)(SystemCoreClock / 1000000))); |
| Sissors | 4:a7b9f778c4b4 | 46 | |
| Sissors | 4:a7b9f778c4b4 | 47 | period_ticks(us * dticks_us + 0.5); |
| Sissors | 4:a7b9f778c4b4 | 48 | } |
| Sissors | 4:a7b9f778c4b4 | 49 | |
| Sissors | 4:a7b9f778c4b4 | 50 | void FastPWM::pulsewidth(double seconds) { |
| Sissors | 4:a7b9f778c4b4 | 51 | pulsewidth_ticks(seconds * dticks + 0.5); |
| Sissors | 4:a7b9f778c4b4 | 52 | } |
| Sissors | 4:a7b9f778c4b4 | 53 | |
| Sissors | 4:a7b9f778c4b4 | 54 | void FastPWM::pulsewidth_ms(int ms) { |
| Sissors | 4:a7b9f778c4b4 | 55 | pulsewidth_ticks(ms * iticks_ms); |
| Sissors | 4:a7b9f778c4b4 | 56 | } |
| Sissors | 4:a7b9f778c4b4 | 57 | |
| Sissors | 4:a7b9f778c4b4 | 58 | void FastPWM::pulsewidth_us(int us) { |
| Sissors | 4:a7b9f778c4b4 | 59 | pulsewidth_ticks(us * iticks_us); |
| Sissors | 4:a7b9f778c4b4 | 60 | } |
| Sissors | 4:a7b9f778c4b4 | 61 | |
| Sissors | 4:a7b9f778c4b4 | 62 | void FastPWM::pulsewidth_us(double us) { |
| Sissors | 4:a7b9f778c4b4 | 63 | pulsewidth_ticks(us * dticks_us + 0.5); |
| Sissors | 4:a7b9f778c4b4 | 64 | } |
| Sissors | 4:a7b9f778c4b4 | 65 | |
| Sissors | 4:a7b9f778c4b4 | 66 | void FastPWM::write(double duty) { |
| Sissors | 4:a7b9f778c4b4 | 67 | _duty=duty; |
| Sissors | 4:a7b9f778c4b4 | 68 | pulsewidth_ticks(duty*getPeriod()); |
| Sissors | 4:a7b9f778c4b4 | 69 | } |
| Sissors | 4:a7b9f778c4b4 | 70 | |
| pmic | 37:0ca2cf9a1437 | 71 | void FastPWM::write(float duty) { |
| pmic | 37:0ca2cf9a1437 | 72 | write(static_cast<double>(duty)); |
| pmic | 37:0ca2cf9a1437 | 73 | } |
| pmic | 37:0ca2cf9a1437 | 74 | |
| Sissors | 4:a7b9f778c4b4 | 75 | double FastPWM::read( void ) { |
| Sissors | 4:a7b9f778c4b4 | 76 | return _duty; |
| Sissors | 4:a7b9f778c4b4 | 77 | } |
| Sissors | 4:a7b9f778c4b4 | 78 | |
| Sissors | 4:a7b9f778c4b4 | 79 | FastPWM & FastPWM::operator= (double value) { |
| Sissors | 4:a7b9f778c4b4 | 80 | write(value); |
| Sissors | 4:a7b9f778c4b4 | 81 | return(*this); |
| Sissors | 4:a7b9f778c4b4 | 82 | } |
| Sissors | 4:a7b9f778c4b4 | 83 | |
| Sissors | 4:a7b9f778c4b4 | 84 | FastPWM::operator double() { |
| Sissors | 4:a7b9f778c4b4 | 85 | return _duty; |
| Sissors | 4:a7b9f778c4b4 | 86 | } |
| Sissors | 4:a7b9f778c4b4 | 87 | |
| Sissors | 4:a7b9f778c4b4 | 88 | int FastPWM::prescaler(int value) { |
| Sissors | 4:a7b9f778c4b4 | 89 | int retval; |
| Sissors | 4:a7b9f778c4b4 | 90 | if (value == -1) { |
| Sissors | 4:a7b9f778c4b4 | 91 | dynamicPrescaler = true; |
| Sissors | 4:a7b9f778c4b4 | 92 | value = 0; |
| Sissors | 4:a7b9f778c4b4 | 93 | } |
| Sissors | 4:a7b9f778c4b4 | 94 | else |
| Sissors | 4:a7b9f778c4b4 | 95 | dynamicPrescaler = false; |
| Sissors | 4:a7b9f778c4b4 | 96 | |
| Sissors | 4:a7b9f778c4b4 | 97 | retval = setPrescaler(value); |
| Sissors | 4:a7b9f778c4b4 | 98 | updateTicks(retval); |
| Sissors | 4:a7b9f778c4b4 | 99 | return retval; |
| Sissors | 4:a7b9f778c4b4 | 100 | } |
| Sissors | 4:a7b9f778c4b4 | 101 | |
| Sissors | 4:a7b9f778c4b4 | 102 | void FastPWM::updateTicks( uint32_t prescaler ) { |
| Sissors | 4:a7b9f778c4b4 | 103 | dticks = SystemCoreClock / (double)prescaler; |
| jocis | 18:d91c0629e4e6 | 104 | dticks_us = dticks / 1000000.0f; |
| jocis | 18:d91c0629e4e6 | 105 | iticks_us = (int)(dticks_us + 0.5); |
| jocis | 18:d91c0629e4e6 | 106 | iticks_ms = (int)(dticks_us * 1000.0 + 0.5); |
| Sissors | 4:a7b9f778c4b4 | 107 | } |
| Sissors | 4:a7b9f778c4b4 | 108 | |
| Sissors | 4:a7b9f778c4b4 | 109 | int FastPWM::calcPrescaler(uint64_t clocks) { |
| Sissors | 4:a7b9f778c4b4 | 110 | uint32_t scale = (clocks >> bits) + 1; |
| Sissors | 4:a7b9f778c4b4 | 111 | uint32_t retval = setPrescaler(scale); |
| Sissors | 4:a7b9f778c4b4 | 112 | updateTicks(retval); |
| Sissors | 4:a7b9f778c4b4 | 113 | return retval; |
| Sissors | 4:a7b9f778c4b4 | 114 | } |