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
PwmDAC.h@1:381bd99d10a4, 2013-09-21 (annotated)
- 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?
User | Revision | Line number | New 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 |