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.h@21:aa2884be5496, 2015-01-12 (annotated)
- Committer:
- altaran
- Date:
- Mon Jan 12 10:31:18 2015 +0000
- Revision:
- 21:aa2884be5496
- Parent:
- 12:4600daab8a83
Added F072RB target, including PWMx/1N channels
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Sissors | 1:1aed61747ed6 | 1 | /* |
Sissors | 1:1aed61747ed6 | 2 | .---. _....._ |
Sissors | 1:1aed61747ed6 | 3 | / p `\ .-""`: :`"-. |
Sissors | 1:1aed61747ed6 | 4 | |__ - | ,' . ' ', |
Sissors | 1:1aed61747ed6 | 5 | ._> \ /: : ; :, |
Sissors | 1:1aed61747ed6 | 6 | '-. '\`. . : ' \ |
Sissors | 1:1aed61747ed6 | 7 | `. | .'._.' '._.' '._.'. | |
Sissors | 1:1aed61747ed6 | 8 | `;-\. : : ' '/,__, |
Sissors | 1:1aed61747ed6 | 9 | .-'`'._ ' . : _.'.__.' |
Sissors | 1:1aed61747ed6 | 10 | ((((-'/ `";--..:..--;"` \ |
Sissors | 1:1aed61747ed6 | 11 | .' / \ \ |
Sissors | 1:1aed61747ed6 | 12 | jgs ((((-' ((((-' |
Sissors | 1:1aed61747ed6 | 13 | |
Sissors | 1:1aed61747ed6 | 14 | Yeah ASCII art turtle more fun than copyright stuff |
Sissors | 1:1aed61747ed6 | 15 | */ |
Sissors | 1:1aed61747ed6 | 16 | |
Sissors | 1:1aed61747ed6 | 17 | |
Sissors | 0:f8c1b0ad5371 | 18 | #include "mbed.h" |
Sissors | 0:f8c1b0ad5371 | 19 | |
Sissors | 0:f8c1b0ad5371 | 20 | #ifndef FASTPWM_H |
Sissors | 0:f8c1b0ad5371 | 21 | #define FASTPWM_H |
Sissors | 0:f8c1b0ad5371 | 22 | |
Sissors | 0:f8c1b0ad5371 | 23 | /** Library that allows faster and/or higher resolution PWM output |
Sissors | 0:f8c1b0ad5371 | 24 | * |
Sissors | 6:0f57969697b6 | 25 | * Library can directly replace standard mbed PWM library. |
Sissors | 0:f8c1b0ad5371 | 26 | * |
Sissors | 0:f8c1b0ad5371 | 27 | * Contrary to the default mbed library, this library takes doubles instead of floats. The compiler will autocast if needed, |
Sissors | 0:f8c1b0ad5371 | 28 | * but do take into account it is done for a reason, your accuracy will otherwise be limitted by the floating point precision. |
Sissors | 0:f8c1b0ad5371 | 29 | */ |
Sissors | 4:a7b9f778c4b4 | 30 | class FastPWM : public PwmOut { |
Sissors | 0:f8c1b0ad5371 | 31 | public: |
Sissors | 0:f8c1b0ad5371 | 32 | /** |
Sissors | 0:f8c1b0ad5371 | 33 | * Create a FastPWM object connected to the specified pin |
Sissors | 0:f8c1b0ad5371 | 34 | * |
Sissors | 0:f8c1b0ad5371 | 35 | * @param pin - PWM pin to connect to |
Sissors | 4:a7b9f778c4b4 | 36 | * @param prescaler - Clock prescaler, -1 is dynamic (default), 0 is bit random, everything else normal |
Sissors | 0:f8c1b0ad5371 | 37 | */ |
Sissors | 4:a7b9f778c4b4 | 38 | FastPWM(PinName pin, int prescaler = -1); |
Sissors | 12:4600daab8a83 | 39 | ~FastPWM(); |
Sissors | 0:f8c1b0ad5371 | 40 | |
Sissors | 0:f8c1b0ad5371 | 41 | /** |
Sissors | 6:0f57969697b6 | 42 | * Set the PWM period, specified in seconds (double), keeping the pulsewidth the same. |
Sissors | 0:f8c1b0ad5371 | 43 | */ |
Sissors | 0:f8c1b0ad5371 | 44 | void period(double seconds); |
Sissors | 0:f8c1b0ad5371 | 45 | |
Sissors | 0:f8c1b0ad5371 | 46 | /** |
Sissors | 6:0f57969697b6 | 47 | * Set the PWM period, specified in milli-seconds (int), keeping the pulsewidth the same. |
Sissors | 0:f8c1b0ad5371 | 48 | */ |
Sissors | 0:f8c1b0ad5371 | 49 | void period_ms(int ms); |
Sissors | 0:f8c1b0ad5371 | 50 | |
Sissors | 0:f8c1b0ad5371 | 51 | /** |
Sissors | 6:0f57969697b6 | 52 | * Set the PWM period, specified in micro-seconds (int), keeping the pulsewidth the same. |
Sissors | 0:f8c1b0ad5371 | 53 | */ |
Sissors | 0:f8c1b0ad5371 | 54 | void period_us(int us); |
Sissors | 0:f8c1b0ad5371 | 55 | |
Sissors | 0:f8c1b0ad5371 | 56 | /** |
Sissors | 6:0f57969697b6 | 57 | * Set the PWM period, specified in micro-seconds (double), keeping the pulsewidth the same. |
Sissors | 0:f8c1b0ad5371 | 58 | */ |
Sissors | 0:f8c1b0ad5371 | 59 | void period_us(double us); |
Sissors | 0:f8c1b0ad5371 | 60 | |
Sissors | 0:f8c1b0ad5371 | 61 | /** |
Sissors | 4:a7b9f778c4b4 | 62 | * Set the PWM period, specified in clock ticks, keeping _pulse width_ the same. |
Sissors | 4:a7b9f778c4b4 | 63 | * |
Sissors | 4:a7b9f778c4b4 | 64 | * This function can be used if low overhead is required. Do take into account the result is |
Sissors | 4:a7b9f778c4b4 | 65 | * board (clock frequency) dependent, and this does not keep an equal duty cycle! |
Sissors | 4:a7b9f778c4b4 | 66 | */ |
Sissors | 4:a7b9f778c4b4 | 67 | void period_ticks(uint32_t ticks); |
Sissors | 4:a7b9f778c4b4 | 68 | |
Sissors | 4:a7b9f778c4b4 | 69 | /** |
Sissors | 0:f8c1b0ad5371 | 70 | * Set the PWM pulsewidth, specified in seconds (double), keeping the period the same. |
Sissors | 0:f8c1b0ad5371 | 71 | */ |
Sissors | 0:f8c1b0ad5371 | 72 | void pulsewidth(double seconds); |
Sissors | 0:f8c1b0ad5371 | 73 | |
Sissors | 0:f8c1b0ad5371 | 74 | /** |
Sissors | 0:f8c1b0ad5371 | 75 | * Set the PWM pulsewidth, specified in milli-seconds (int), keeping the period the same. |
Sissors | 0:f8c1b0ad5371 | 76 | */ |
Sissors | 0:f8c1b0ad5371 | 77 | void pulsewidth_ms(int ms); |
Sissors | 0:f8c1b0ad5371 | 78 | |
Sissors | 0:f8c1b0ad5371 | 79 | /** |
Sissors | 0:f8c1b0ad5371 | 80 | * Set the PWM pulsewidth, specified in micro-seconds (int), keeping the period the same. |
Sissors | 0:f8c1b0ad5371 | 81 | */ |
Sissors | 0:f8c1b0ad5371 | 82 | void pulsewidth_us(int us); |
Sissors | 0:f8c1b0ad5371 | 83 | |
Sissors | 0:f8c1b0ad5371 | 84 | /** |
Sissors | 0:f8c1b0ad5371 | 85 | * Set the PWM pulsewidth, specified in micro-seconds (double), keeping the period the same. |
Sissors | 0:f8c1b0ad5371 | 86 | */ |
Sissors | 0:f8c1b0ad5371 | 87 | void pulsewidth_us(double us); |
Sissors | 0:f8c1b0ad5371 | 88 | |
Sissors | 0:f8c1b0ad5371 | 89 | /** |
Sissors | 4:a7b9f778c4b4 | 90 | * Set the PWM period, specified in clock ticks, keeping the period the same. |
Sissors | 4:a7b9f778c4b4 | 91 | * |
Sissors | 4:a7b9f778c4b4 | 92 | * This function can be used if low overhead is required. Do take into account the result is |
Sissors | 4:a7b9f778c4b4 | 93 | * board (clock frequency) dependent! |
Sissors | 4:a7b9f778c4b4 | 94 | */ |
Sissors | 4:a7b9f778c4b4 | 95 | void pulsewidth_ticks(uint32_t ticks); |
Sissors | 4:a7b9f778c4b4 | 96 | |
Sissors | 4:a7b9f778c4b4 | 97 | /** |
Sissors | 0:f8c1b0ad5371 | 98 | * Set the ouput duty-cycle, specified as a percentage (double) |
Sissors | 0:f8c1b0ad5371 | 99 | * |
Sissors | 0:f8c1b0ad5371 | 100 | * @param duty - A double value representing the output duty-cycle, specified as a percentage. The value should lie between 0.0 (representing on 0%) and 1.0 (representing on 100%). |
Sissors | 0:f8c1b0ad5371 | 101 | */ |
Sissors | 0:f8c1b0ad5371 | 102 | void write(double duty); |
Sissors | 0:f8c1b0ad5371 | 103 | |
Sissors | 0:f8c1b0ad5371 | 104 | /** |
Sissors | 0:f8c1b0ad5371 | 105 | * Return the ouput duty-cycle, specified as a percentage (double) |
Sissors | 0:f8c1b0ad5371 | 106 | * |
Sissors | 0:f8c1b0ad5371 | 107 | * @param return - A double value representing the output duty-cycle, specified as a percentage. |
Sissors | 0:f8c1b0ad5371 | 108 | */ |
Sissors | 0:f8c1b0ad5371 | 109 | double read( void ); |
Sissors | 0:f8c1b0ad5371 | 110 | |
Sissors | 0:f8c1b0ad5371 | 111 | /** |
Sissors | 0:f8c1b0ad5371 | 112 | * An operator shorthand for write() |
Sissors | 0:f8c1b0ad5371 | 113 | */ |
Sissors | 0:f8c1b0ad5371 | 114 | FastPWM& operator= (double value); |
Sissors | 0:f8c1b0ad5371 | 115 | |
Sissors | 0:f8c1b0ad5371 | 116 | /** |
Sissors | 0:f8c1b0ad5371 | 117 | * An operator shorthand for read() |
Sissors | 0:f8c1b0ad5371 | 118 | */ |
Sissors | 0:f8c1b0ad5371 | 119 | operator double(); |
Sissors | 0:f8c1b0ad5371 | 120 | |
Sissors | 4:a7b9f778c4b4 | 121 | /** |
Sissors | 4:a7b9f778c4b4 | 122 | * Set the PWM prescaler |
Sissors | 4:a7b9f778c4b4 | 123 | * |
Sissors | 4:a7b9f778c4b4 | 124 | * The period of all PWM pins on the same PWM unit have to be reset after using this! |
Sissors | 4:a7b9f778c4b4 | 125 | * |
Sissors | 4:a7b9f778c4b4 | 126 | * @param value - The required prescaler. Special values: 0 = lock current prescaler, -1 = use dynamic prescaler |
Sissors | 4:a7b9f778c4b4 | 127 | * @param return - The prescaler which was set (can differ from requested prescaler if not possible) |
Sissors | 4:a7b9f778c4b4 | 128 | */ |
Sissors | 4:a7b9f778c4b4 | 129 | int prescaler(int value); |
Sissors | 4:a7b9f778c4b4 | 130 | |
Sissors | 0:f8c1b0ad5371 | 131 | private: |
Sissors | 4:a7b9f778c4b4 | 132 | void initFastPWM(void); |
Sissors | 4:a7b9f778c4b4 | 133 | |
Sissors | 4:a7b9f778c4b4 | 134 | uint32_t setPrescaler( uint32_t reqScale ); |
Sissors | 4:a7b9f778c4b4 | 135 | int calcPrescaler(uint64_t clocks); |
Sissors | 4:a7b9f778c4b4 | 136 | uint32_t getPeriod( void ); |
Sissors | 4:a7b9f778c4b4 | 137 | |
Sissors | 4:a7b9f778c4b4 | 138 | void updateTicks( uint32_t prescaler ); |
Sissors | 4:a7b9f778c4b4 | 139 | uint32_t bits; |
Sissors | 4:a7b9f778c4b4 | 140 | |
Sissors | 0:f8c1b0ad5371 | 141 | double _duty; |
Sissors | 0:f8c1b0ad5371 | 142 | |
Sissors | 4:a7b9f778c4b4 | 143 | double dticks, dticks_us; |
Sissors | 4:a7b9f778c4b4 | 144 | int iticks_ms, iticks_us; |
Sissors | 4:a7b9f778c4b4 | 145 | |
Sissors | 4:a7b9f778c4b4 | 146 | bool dynamicPrescaler; |
Sissors | 4:a7b9f778c4b4 | 147 | |
Sissors | 12:4600daab8a83 | 148 | void *fast_obj; |
Sissors | 0:f8c1b0ad5371 | 149 | }; |
Sissors | 0:f8c1b0ad5371 | 150 | #endif |