Fork of the Ben Katz's motor controller firmware.

Committer:
MartinGurtner
Date:
Fri Jan 22 13:10:37 2021 +0000
Revision:
60:8399756e1ba1
.

Who changed what in which revision?

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