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
Diff: FastPWM.h
- Revision:
- 4:a7b9f778c4b4
- Parent:
- 3:3094d3806cfc
- Child:
- 6:0f57969697b6
diff -r 3094d3806cfc -r a7b9f778c4b4 FastPWM.h
--- a/FastPWM.h Wed Jul 25 07:14:39 2012 +0000
+++ b/FastPWM.h Tue Aug 13 16:54:06 2013 +0000
@@ -17,14 +17,9 @@
#include "mbed.h"
-
#ifndef FASTPWM_H
#define FASTPWM_H
-#ifndef F_CLK
-#define F_CLK 96000000
-#endif
-
/** Library that allows faster and/or higher resolution PWM output
*
* Library can directly replace standard mbed PWM library. Only limitation is that the maximum PWM period is four times shorter
@@ -33,19 +28,16 @@
*
* Contrary to the default mbed library, this library takes doubles instead of floats. The compiler will autocast if needed,
* but do take into account it is done for a reason, your accuracy will otherwise be limitted by the floating point precision.
- *
- * In your program you can define F_CLK if you use a different clock frequency than the default one.
- *
- * Only works on LPC1768 for now. If you want support for the other one, send a PM and I will have a look, but I cannot even compile for it.
*/
-class FastPWM {
+class FastPWM : public PwmOut {
public:
/**
* Create a FastPWM object connected to the specified pin
*
* @param pin - PWM pin to connect to
+ * @param prescaler - Clock prescaler, -1 is dynamic (default), 0 is bit random, everything else normal
*/
- FastPWM(PinName pin);
+ FastPWM(PinName pin, int prescaler = -1);
/**
* Set the PWM period, specified in seconds (double), keeping the duty cycle the same.
@@ -68,6 +60,14 @@
void period_us(double us);
/**
+ * Set the PWM period, specified in clock ticks, keeping _pulse width_ the same.
+ *
+ * This function can be used if low overhead is required. Do take into account the result is
+ * board (clock frequency) dependent, and this does not keep an equal duty cycle!
+ */
+ void period_ticks(uint32_t ticks);
+
+ /**
* Set the PWM pulsewidth, specified in seconds (double), keeping the period the same.
*/
void pulsewidth(double seconds);
@@ -88,6 +88,14 @@
void pulsewidth_us(double us);
/**
+ * Set the PWM period, specified in clock ticks, keeping the period the same.
+ *
+ * This function can be used if low overhead is required. Do take into account the result is
+ * board (clock frequency) dependent!
+ */
+ void pulsewidth_ticks(uint32_t ticks);
+
+ /**
* Set the ouput duty-cycle, specified as a percentage (double)
*
* @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%).
@@ -111,13 +119,33 @@
*/
operator double();
+ /**
+ * Set the PWM prescaler
+ *
+ * The period of all PWM pins on the same PWM unit have to be reset after using this!
+ *
+ * @param value - The required prescaler. Special values: 0 = lock current prescaler, -1 = use dynamic prescaler
+ * @param return - The prescaler which was set (can differ from requested prescaler if not possible)
+ */
+ int prescaler(int value);
+
private:
- PwmOut PWMObject;
+ void initFastPWM(void);
+
+ uint32_t setPrescaler( uint32_t reqScale );
+ int calcPrescaler(uint64_t clocks);
+ uint32_t getPeriod( void );
+
+ void updateTicks( uint32_t prescaler );
+ uint32_t bits;
+
double _duty;
- double _period;
- unsigned int PWMUnit;
- __IO uint32_t *MR;
+ double dticks, dticks_us;
+ int iticks_ms, iticks_us;
+
+ bool dynamicPrescaler;
+
};
#endif
\ No newline at end of file
