PwmDAC is a library to run more the one PWM channel and channel updates at the time. Maximum PWM frequency is 48MHz. You can use for in example for rgb applications or as a multi channel dac with connected active lowpass. Written for mbed LPC1768. Not completly tested. I will upload my results as soon as possible. Although some deeper informations and LTSpice simulations

Dependents:   DiscoTech filter_implement

Committer:
flash_ahaa
Date:
Sat Sep 21 08:47:27 2013 +0000
Revision:
1:381bd99d10a4
Parent:
0:13e0b9ea312f
Remove update LER from for loop. Put update command after for loop and set all at once.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
flash_ahaa 0:13e0b9ea312f 1 /* Author: Tobias Wulf
flash_ahaa 0:13e0b9ea312f 2 * Date: 13.09.2013
flash_ahaa 0:13e0b9ea312f 3 * Reason: don't know why...
flash_ahaa 0:13e0b9ea312f 4 *
flash_ahaa 0:13e0b9ea312f 5 * http://www.ascii-art.de/ascii/my/
flash_ahaa 0:13e0b9ea312f 6 * Z
flash_ahaa 0:13e0b9ea312f 7 |\/| /\ _ _oo /\ .__|_ Z
flash_ahaa 0:13e0b9ea312f 8 | |\/ /--\_>(_|| /--\| |_ .,., z
flash_ahaa 0:13e0b9ea312f 9 / ((((()) z
flash_ahaa 0:13e0b9ea312f 10 ((('_ _`) '
flash_ahaa 0:13e0b9ea312f 11 _______________________ ((G \ |) ___________________
flash_ahaa 0:13e0b9ea312f 12 (((` " ,
flash_ahaa 0:13e0b9ea312f 13 .((\.:~: .--------------.
flash_ahaa 0:13e0b9ea312f 14 The product __.| `"'.__ | \ |
flash_ahaa 0:13e0b9ea312f 15 .'' `---' `. | . :
flash_ahaa 0:13e0b9ea312f 16 of hard work / ` | `-.__________)
flash_ahaa 0:13e0b9ea312f 17 | ~ | : :
flash_ahaa 0:13e0b9ea312f 18 for many many | | : |
flash_ahaa 0:13e0b9ea312f 19 | _ | | [ ## :
flash_ahaa 0:13e0b9ea312f 20 hours ... \ `--. ____| , oo_______.'
flash_ahaa 0:13e0b9ea312f 21 `_ ( \) _____/ `--___
flash_ahaa 0:13e0b9ea312f 22 | `--) ) `-. `--- ( - a:f -
flash_ahaa 0:13e0b9ea312f 23 | '///` | `-.
flash_ahaa 0:13e0b9ea312f 24 | | | | `-.
flash_ahaa 0:13e0b9ea312f 25 | | | | `-.
flash_ahaa 0:13e0b9ea312f 26 | | |\ |
flash_ahaa 0:13e0b9ea312f 27 | | | \|
flash_ahaa 0:13e0b9ea312f 28 `-. | | |
flash_ahaa 0:13e0b9ea312f 29 `-| '
flash_ahaa 0:13e0b9ea312f 30 */
flash_ahaa 0:13e0b9ea312f 31
flash_ahaa 0:13e0b9ea312f 32 #include "mbed.h"
flash_ahaa 0:13e0b9ea312f 33
flash_ahaa 0:13e0b9ea312f 34 #ifndef MBED_PWMDAC_H
flash_ahaa 0:13e0b9ea312f 35 #define MBED_PWMDAC_H
flash_ahaa 0:13e0b9ea312f 36
flash_ahaa 0:13e0b9ea312f 37 #ifndef SYS_CLK
flash_ahaa 0:13e0b9ea312f 38 #define SYS_CLK 96000000 // Hz
flash_ahaa 0:13e0b9ea312f 39 #endif
flash_ahaa 0:13e0b9ea312f 40
flash_ahaa 0:13e0b9ea312f 41
flash_ahaa 0:13e0b9ea312f 42 /**
flash_ahaa 0:13e0b9ea312f 43 * Is used as PWM port with possibility
flash_ahaa 0:13e0b9ea312f 44 * to update all PWM channel at once. So you can use it
flash_ahaa 0:13e0b9ea312f 45 * although as multichannel DAC with lowpass filters
flash_ahaa 0:13e0b9ea312f 46 * wich match your application.
flash_ahaa 0:13e0b9ea312f 47 * For deeper information look at the wiki.
flash_ahaa 0:13e0b9ea312f 48 *
flash_ahaa 0:13e0b9ea312f 49 * If you want to use only one PWM or you have some other
flash_ahaa 0:13e0b9ea312f 50 * plans for the rest of the PWM port you should use FastPwm
flash_ahaa 0:13e0b9ea312f 51 * or PwmOut objects
flash_ahaa 0:13e0b9ea312f 52 *
flash_ahaa 0:13e0b9ea312f 53 * This is only working for mbed LPC1768!!
flash_ahaa 0:13e0b9ea312f 54 */
flash_ahaa 0:13e0b9ea312f 55
flash_ahaa 0:13e0b9ea312f 56
flash_ahaa 0:13e0b9ea312f 57
flash_ahaa 0:13e0b9ea312f 58 class PwmDAC {
flash_ahaa 0:13e0b9ea312f 59
flash_ahaa 0:13e0b9ea312f 60 public:
flash_ahaa 0:13e0b9ea312f 61
flash_ahaa 0:13e0b9ea312f 62 /**
flash_ahaa 0:13e0b9ea312f 63 * Initialize the PwmDAC object wich set up all channels.
flash_ahaa 0:13e0b9ea312f 64 */
flash_ahaa 0:13e0b9ea312f 65 void init();
flash_ahaa 0:13e0b9ea312f 66
flash_ahaa 0:13e0b9ea312f 67 /**
flash_ahaa 0:13e0b9ea312f 68 * Deactivate a single channel and pull it to ground (intern pull down)
flash_ahaa 0:13e0b9ea312f 69 * or deactivate all if ch greater than 5.
flash_ahaa 0:13e0b9ea312f 70 * @param - ch is an integer number 0 - 5.
flash_ahaa 0:13e0b9ea312f 71 */
flash_ahaa 0:13e0b9ea312f 72 void deactivate(unsigned int ch);
flash_ahaa 0:13e0b9ea312f 73
flash_ahaa 0:13e0b9ea312f 74 /**
flash_ahaa 0:13e0b9ea312f 75 * Activate a single channel and deactivate intern pull up/ down
flash_ahaa 0:13e0b9ea312f 76 * or activate all if ch greater than 5.
flash_ahaa 0:13e0b9ea312f 77 * @param - ch is an integer number 0 - 5.
flash_ahaa 0:13e0b9ea312f 78 */
flash_ahaa 0:13e0b9ea312f 79 void activate(unsigned int ch);
flash_ahaa 0:13e0b9ea312f 80
flash_ahaa 0:13e0b9ea312f 81 /**
flash_ahaa 0:13e0b9ea312f 82 * Set PWM frequency in Hz. This setting includes all channels.
flash_ahaa 0:13e0b9ea312f 83 * Maximum is 48000000Hz.
flash_ahaa 0:13e0b9ea312f 84 * @param - frequency in Hz. Argument is type of double
flash_ahaa 0:13e0b9ea312f 85 */
flash_ahaa 0:13e0b9ea312f 86 void setFrequency(double frequency);
flash_ahaa 0:13e0b9ea312f 87
flash_ahaa 0:13e0b9ea312f 88 /**
flash_ahaa 0:13e0b9ea312f 89 * Set PWM period in seconds
flash_ahaa 0:13e0b9ea312f 90 * @param - seconds is type of double
flash_ahaa 0:13e0b9ea312f 91 */
flash_ahaa 0:13e0b9ea312f 92 void setPeriod(double seconds);
flash_ahaa 0:13e0b9ea312f 93
flash_ahaa 0:13e0b9ea312f 94 /**
flash_ahaa 0:13e0b9ea312f 95 * Set the PWM step resolution. Use it instead setFrequency()
flash_ahaa 0:13e0b9ea312f 96 * @param - resolution min is 2 max is 2^31
flash_ahaa 0:13e0b9ea312f 97 */
flash_ahaa 0:13e0b9ea312f 98 void setResolution(uint32_t resolution);
flash_ahaa 0:13e0b9ea312f 99
flash_ahaa 0:13e0b9ea312f 100 /**
flash_ahaa 0:13e0b9ea312f 101 * Update the 6 PWM channels.
flash_ahaa 0:13e0b9ea312f 102 * @param - argument must be an array larger 6 and type of double
flash_ahaa 0:13e0b9ea312f 103 */
flash_ahaa 0:13e0b9ea312f 104 void updateDuty(double duty[]);
flash_ahaa 0:13e0b9ea312f 105
flash_ahaa 0:13e0b9ea312f 106 /**
flash_ahaa 0:13e0b9ea312f 107 * Update the 6 PWM channels.
flash_ahaa 0:13e0b9ea312f 108 * @param - argument must be an array larger 6 and type of double
flash_ahaa 0:13e0b9ea312f 109 */
flash_ahaa 0:13e0b9ea312f 110 void updatePulsewidth(double pulsewidth[]);
flash_ahaa 0:13e0b9ea312f 111
flash_ahaa 0:13e0b9ea312f 112 /**
flash_ahaa 0:13e0b9ea312f 113 * Update the 6 PWM channels.
flash_ahaa 0:13e0b9ea312f 114 * @param - argument must be an array larger 6 and type of uint32_t
flash_ahaa 0:13e0b9ea312f 115 */
flash_ahaa 0:13e0b9ea312f 116 void updateSteps(uint32_t steps[]);
flash_ahaa 0:13e0b9ea312f 117
flash_ahaa 0:13e0b9ea312f 118 /**
flash_ahaa 0:13e0b9ea312f 119 * Stop PWM
flash_ahaa 0:13e0b9ea312f 120 */
flash_ahaa 0:13e0b9ea312f 121 void stop();
flash_ahaa 0:13e0b9ea312f 122
flash_ahaa 0:13e0b9ea312f 123 /**
flash_ahaa 0:13e0b9ea312f 124 * Start PWM
flash_ahaa 0:13e0b9ea312f 125 */
flash_ahaa 0:13e0b9ea312f 126 void start();
flash_ahaa 0:13e0b9ea312f 127
flash_ahaa 0:13e0b9ea312f 128 private:
flash_ahaa 0:13e0b9ea312f 129 double _frequency; // [Hz]
flash_ahaa 0:13e0b9ea312f 130 double _period; // [sec]
flash_ahaa 0:13e0b9ea312f 131 double _pulsewidth[6]; // [sec]
flash_ahaa 0:13e0b9ea312f 132 double _duty[6]; // [%]
flash_ahaa 0:13e0b9ea312f 133 uint32_t _steps[6];
flash_ahaa 0:13e0b9ea312f 134 uint32_t _resolution;
flash_ahaa 0:13e0b9ea312f 135 bool _allActive;
flash_ahaa 0:13e0b9ea312f 136
flash_ahaa 0:13e0b9ea312f 137 __IO uint32_t *MR[7];
flash_ahaa 0:13e0b9ea312f 138 };
flash_ahaa 0:13e0b9ea312f 139 #endif