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.
Fork of FastPWM by
FastPWM_common.cpp@4:a7b9f778c4b4, 2013-08-13 (annotated)
- Committer:
- Sissors
- Date:
- Tue Aug 13 16:54:06 2013 +0000
- Revision:
- 4:a7b9f778c4b4
- Child:
- 6:0f57969697b6
v2.0
; Added KL25Z/LPC11u24 support
; Added prescalers
; Direct tick changes
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 | 4:a7b9f778c4b4 | 4 | initFastPWM(); |
Sissors | 4:a7b9f778c4b4 | 5 | this->prescaler(prescaler); |
Sissors | 4:a7b9f778c4b4 | 6 | |
Sissors | 4:a7b9f778c4b4 | 7 | //Set duty cycle on 0%, period on 20ms |
Sissors | 4:a7b9f778c4b4 | 8 | _duty=0; |
Sissors | 4:a7b9f778c4b4 | 9 | period(0.02); |
Sissors | 4:a7b9f778c4b4 | 10 | |
Sissors | 4:a7b9f778c4b4 | 11 | |
Sissors | 4:a7b9f778c4b4 | 12 | } |
Sissors | 4:a7b9f778c4b4 | 13 | |
Sissors | 4:a7b9f778c4b4 | 14 | void FastPWM::period(double seconds) { |
Sissors | 4:a7b9f778c4b4 | 15 | if (dynamicPrescaler) |
Sissors | 4:a7b9f778c4b4 | 16 | calcPrescaler((uint64_t)(seconds * (double) SystemCoreClock)); |
Sissors | 4:a7b9f778c4b4 | 17 | |
Sissors | 4:a7b9f778c4b4 | 18 | period_ticks(seconds * dticks + 0.5); |
Sissors | 4:a7b9f778c4b4 | 19 | pulsewidth_ticks(getPeriod() * _duty); |
Sissors | 4:a7b9f778c4b4 | 20 | } |
Sissors | 4:a7b9f778c4b4 | 21 | |
Sissors | 4:a7b9f778c4b4 | 22 | void FastPWM::period_ms(int ms) { |
Sissors | 4:a7b9f778c4b4 | 23 | if (dynamicPrescaler) |
Sissors | 4:a7b9f778c4b4 | 24 | calcPrescaler(ms * (SystemCoreClock / 1000)); |
Sissors | 4:a7b9f778c4b4 | 25 | |
Sissors | 4:a7b9f778c4b4 | 26 | period_ticks(ms * iticks_ms); |
Sissors | 4:a7b9f778c4b4 | 27 | pulsewidth_ticks(getPeriod() * _duty); |
Sissors | 4:a7b9f778c4b4 | 28 | } |
Sissors | 4:a7b9f778c4b4 | 29 | |
Sissors | 4:a7b9f778c4b4 | 30 | void FastPWM::period_us(int us) { |
Sissors | 4:a7b9f778c4b4 | 31 | if (dynamicPrescaler) |
Sissors | 4:a7b9f778c4b4 | 32 | calcPrescaler(us * (SystemCoreClock / 1000000)); |
Sissors | 4:a7b9f778c4b4 | 33 | |
Sissors | 4:a7b9f778c4b4 | 34 | period_ticks(us * iticks_us); |
Sissors | 4:a7b9f778c4b4 | 35 | pulsewidth_ticks(getPeriod() * _duty); |
Sissors | 4:a7b9f778c4b4 | 36 | } |
Sissors | 4:a7b9f778c4b4 | 37 | |
Sissors | 4:a7b9f778c4b4 | 38 | void FastPWM::period_us(double us) { |
Sissors | 4:a7b9f778c4b4 | 39 | if (dynamicPrescaler) |
Sissors | 4:a7b9f778c4b4 | 40 | calcPrescaler((uint64_t)(us * (double)(SystemCoreClock / 1000000))); |
Sissors | 4:a7b9f778c4b4 | 41 | |
Sissors | 4:a7b9f778c4b4 | 42 | period_ticks(us * dticks_us + 0.5); |
Sissors | 4:a7b9f778c4b4 | 43 | pulsewidth_ticks(getPeriod() * _duty); |
Sissors | 4:a7b9f778c4b4 | 44 | } |
Sissors | 4:a7b9f778c4b4 | 45 | |
Sissors | 4:a7b9f778c4b4 | 46 | void FastPWM::pulsewidth(double seconds) { |
Sissors | 4:a7b9f778c4b4 | 47 | pulsewidth_ticks(seconds * dticks + 0.5); |
Sissors | 4:a7b9f778c4b4 | 48 | } |
Sissors | 4:a7b9f778c4b4 | 49 | |
Sissors | 4:a7b9f778c4b4 | 50 | void FastPWM::pulsewidth_ms(int ms) { |
Sissors | 4:a7b9f778c4b4 | 51 | pulsewidth_ticks(ms * iticks_ms); |
Sissors | 4:a7b9f778c4b4 | 52 | } |
Sissors | 4:a7b9f778c4b4 | 53 | |
Sissors | 4:a7b9f778c4b4 | 54 | void FastPWM::pulsewidth_us(int us) { |
Sissors | 4:a7b9f778c4b4 | 55 | pulsewidth_ticks(us * iticks_us); |
Sissors | 4:a7b9f778c4b4 | 56 | } |
Sissors | 4:a7b9f778c4b4 | 57 | |
Sissors | 4:a7b9f778c4b4 | 58 | void FastPWM::pulsewidth_us(double us) { |
Sissors | 4:a7b9f778c4b4 | 59 | pulsewidth_ticks(us * dticks_us + 0.5); |
Sissors | 4:a7b9f778c4b4 | 60 | } |
Sissors | 4:a7b9f778c4b4 | 61 | |
Sissors | 4:a7b9f778c4b4 | 62 | void FastPWM::write(double duty) { |
Sissors | 4:a7b9f778c4b4 | 63 | _duty=duty; |
Sissors | 4:a7b9f778c4b4 | 64 | pulsewidth_ticks(duty*getPeriod()); |
Sissors | 4:a7b9f778c4b4 | 65 | } |
Sissors | 4:a7b9f778c4b4 | 66 | |
Sissors | 4:a7b9f778c4b4 | 67 | double FastPWM::read( void ) { |
Sissors | 4:a7b9f778c4b4 | 68 | return _duty; |
Sissors | 4:a7b9f778c4b4 | 69 | } |
Sissors | 4:a7b9f778c4b4 | 70 | |
Sissors | 4:a7b9f778c4b4 | 71 | FastPWM & FastPWM::operator= (double value) { |
Sissors | 4:a7b9f778c4b4 | 72 | write(value); |
Sissors | 4:a7b9f778c4b4 | 73 | return(*this); |
Sissors | 4:a7b9f778c4b4 | 74 | } |
Sissors | 4:a7b9f778c4b4 | 75 | |
Sissors | 4:a7b9f778c4b4 | 76 | FastPWM::operator double() { |
Sissors | 4:a7b9f778c4b4 | 77 | return _duty; |
Sissors | 4:a7b9f778c4b4 | 78 | } |
Sissors | 4:a7b9f778c4b4 | 79 | |
Sissors | 4:a7b9f778c4b4 | 80 | int FastPWM::prescaler(int value) { |
Sissors | 4:a7b9f778c4b4 | 81 | int retval; |
Sissors | 4:a7b9f778c4b4 | 82 | if (value == -1) { |
Sissors | 4:a7b9f778c4b4 | 83 | dynamicPrescaler = true; |
Sissors | 4:a7b9f778c4b4 | 84 | value = 0; |
Sissors | 4:a7b9f778c4b4 | 85 | } |
Sissors | 4:a7b9f778c4b4 | 86 | else |
Sissors | 4:a7b9f778c4b4 | 87 | dynamicPrescaler = false; |
Sissors | 4:a7b9f778c4b4 | 88 | |
Sissors | 4:a7b9f778c4b4 | 89 | retval = setPrescaler(value); |
Sissors | 4:a7b9f778c4b4 | 90 | updateTicks(retval); |
Sissors | 4:a7b9f778c4b4 | 91 | return retval; |
Sissors | 4:a7b9f778c4b4 | 92 | } |
Sissors | 4:a7b9f778c4b4 | 93 | |
Sissors | 4:a7b9f778c4b4 | 94 | void FastPWM::updateTicks( uint32_t prescaler ) { |
Sissors | 4:a7b9f778c4b4 | 95 | dticks = SystemCoreClock / (double)prescaler; |
Sissors | 4:a7b9f778c4b4 | 96 | dticks_us = SystemCoreClock / (double)prescaler / 1000000.0f; |
Sissors | 4:a7b9f778c4b4 | 97 | iticks_ms = SystemCoreClock / prescaler / 1000; |
Sissors | 4:a7b9f778c4b4 | 98 | iticks_us = SystemCoreClock / prescaler / 1000000; |
Sissors | 4:a7b9f778c4b4 | 99 | } |
Sissors | 4:a7b9f778c4b4 | 100 | |
Sissors | 4:a7b9f778c4b4 | 101 | int FastPWM::calcPrescaler(uint64_t clocks) { |
Sissors | 4:a7b9f778c4b4 | 102 | uint32_t scale = (clocks >> bits) + 1; |
Sissors | 4:a7b9f778c4b4 | 103 | uint32_t retval = setPrescaler(scale); |
Sissors | 4:a7b9f778c4b4 | 104 | updateTicks(retval); |
Sissors | 4:a7b9f778c4b4 | 105 | return retval; |
Sissors | 4:a7b9f778c4b4 | 106 | } |