Solutions for the PWM experiments for LPC812 MAX
Dependencies: lpc812_exp_lib_PCF8591 mbed
main.cpp@1:08c2337bfa7b, 2013-11-25 (annotated)
- Committer:
- embeddedartists
- Date:
- Mon Nov 25 12:01:00 2013 +0000
- Revision:
- 1:08c2337bfa7b
- Parent:
- 0:6f393e96a8d1
Fixed part 3
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
embeddedartists | 0:6f393e96a8d1 | 1 | #include "mbed.h" |
embeddedartists | 0:6f393e96a8d1 | 2 | #include "PCF8591.h" |
embeddedartists | 0:6f393e96a8d1 | 3 | |
embeddedartists | 0:6f393e96a8d1 | 4 | Serial pc(USBTX, USBRX); // tx, rx |
embeddedartists | 0:6f393e96a8d1 | 5 | |
embeddedartists | 0:6f393e96a8d1 | 6 | DigitalOut redLED(D0); |
embeddedartists | 0:6f393e96a8d1 | 7 | DigitalOut greenLED(D1); |
embeddedartists | 0:6f393e96a8d1 | 8 | |
embeddedartists | 0:6f393e96a8d1 | 9 | PCF8591 adc; |
embeddedartists | 0:6f393e96a8d1 | 10 | |
embeddedartists | 0:6f393e96a8d1 | 11 | static void experiment1() |
embeddedartists | 0:6f393e96a8d1 | 12 | { |
embeddedartists | 0:6f393e96a8d1 | 13 | // set wanted duty cycle |
embeddedartists | 0:6f393e96a8d1 | 14 | int wantedDutyCycle = 10; |
embeddedartists | 0:6f393e96a8d1 | 15 | |
embeddedartists | 0:6f393e96a8d1 | 16 | // initialize LEDs to off |
embeddedartists | 0:6f393e96a8d1 | 17 | greenLED = redLED = 1; |
embeddedartists | 0:6f393e96a8d1 | 18 | |
embeddedartists | 0:6f393e96a8d1 | 19 | pc.printf("Fixed duty cycle\n"); |
embeddedartists | 0:6f393e96a8d1 | 20 | while(1) { |
embeddedartists | 0:6f393e96a8d1 | 21 | // set output high |
embeddedartists | 0:6f393e96a8d1 | 22 | greenLED = 1; |
embeddedartists | 0:6f393e96a8d1 | 23 | |
embeddedartists | 0:6f393e96a8d1 | 24 | for (int loopCounter = 0; loopCounter < 100; loopCounter++) { |
embeddedartists | 0:6f393e96a8d1 | 25 | if (loopCounter == wantedDutyCycle) { |
embeddedartists | 0:6f393e96a8d1 | 26 | // set output low |
embeddedartists | 0:6f393e96a8d1 | 27 | greenLED = 0; |
embeddedartists | 0:6f393e96a8d1 | 28 | } |
embeddedartists | 0:6f393e96a8d1 | 29 | } |
embeddedartists | 0:6f393e96a8d1 | 30 | } |
embeddedartists | 0:6f393e96a8d1 | 31 | } |
embeddedartists | 0:6f393e96a8d1 | 32 | |
embeddedartists | 0:6f393e96a8d1 | 33 | static int getDutyCycle(PCF8591::AnalogIn port) |
embeddedartists | 0:6f393e96a8d1 | 34 | { |
embeddedartists | 0:6f393e96a8d1 | 35 | return (adc.read(port) * 100)/256; |
embeddedartists | 0:6f393e96a8d1 | 36 | } |
embeddedartists | 0:6f393e96a8d1 | 37 | |
embeddedartists | 0:6f393e96a8d1 | 38 | static void experiment2() |
embeddedartists | 0:6f393e96a8d1 | 39 | { |
embeddedartists | 0:6f393e96a8d1 | 40 | // set wanted duty cycle |
embeddedartists | 0:6f393e96a8d1 | 41 | int wantedDutyCycle = 10; |
embeddedartists | 0:6f393e96a8d1 | 42 | |
embeddedartists | 0:6f393e96a8d1 | 43 | // initialize LEDs to off |
embeddedartists | 0:6f393e96a8d1 | 44 | greenLED = redLED = 1; |
embeddedartists | 0:6f393e96a8d1 | 45 | |
embeddedartists | 0:6f393e96a8d1 | 46 | pc.printf("Trimpot controlled duty cycle\n"); |
embeddedartists | 0:6f393e96a8d1 | 47 | while(1) { |
embeddedartists | 0:6f393e96a8d1 | 48 | wantedDutyCycle = getDutyCycle(PCF8591::A0); |
embeddedartists | 0:6f393e96a8d1 | 49 | |
embeddedartists | 0:6f393e96a8d1 | 50 | // The duty cycle does not have to be read for each PWM loop |
embeddedartists | 0:6f393e96a8d1 | 51 | for (int num = 0; num < 200; num++) { |
embeddedartists | 0:6f393e96a8d1 | 52 | // set output high |
embeddedartists | 0:6f393e96a8d1 | 53 | greenLED = 1; |
embeddedartists | 0:6f393e96a8d1 | 54 | |
embeddedartists | 0:6f393e96a8d1 | 55 | for (int loopCounter = 0; loopCounter < 100; loopCounter++) { |
embeddedartists | 0:6f393e96a8d1 | 56 | if (loopCounter == wantedDutyCycle) { |
embeddedartists | 0:6f393e96a8d1 | 57 | // set output low |
embeddedartists | 0:6f393e96a8d1 | 58 | greenLED = 0; |
embeddedartists | 0:6f393e96a8d1 | 59 | } |
embeddedartists | 0:6f393e96a8d1 | 60 | } |
embeddedartists | 0:6f393e96a8d1 | 61 | } |
embeddedartists | 0:6f393e96a8d1 | 62 | } |
embeddedartists | 0:6f393e96a8d1 | 63 | } |
embeddedartists | 0:6f393e96a8d1 | 64 | |
embeddedartists | 0:6f393e96a8d1 | 65 | static void experiment3() |
embeddedartists | 0:6f393e96a8d1 | 66 | { |
embeddedartists | 0:6f393e96a8d1 | 67 | // set wanted duty cycle |
embeddedartists | 0:6f393e96a8d1 | 68 | int wantedDutyCycle = 10; |
embeddedartists | 0:6f393e96a8d1 | 69 | |
embeddedartists | 0:6f393e96a8d1 | 70 | // set wanted frequency |
embeddedartists | 0:6f393e96a8d1 | 71 | int delay = 1; |
embeddedartists | 0:6f393e96a8d1 | 72 | |
embeddedartists | 0:6f393e96a8d1 | 73 | // initialize LEDs to off |
embeddedartists | 0:6f393e96a8d1 | 74 | greenLED = redLED = 1; |
embeddedartists | 0:6f393e96a8d1 | 75 | |
embeddedartists | 0:6f393e96a8d1 | 76 | bool readDuty = true; |
embeddedartists | 0:6f393e96a8d1 | 77 | |
embeddedartists | 0:6f393e96a8d1 | 78 | pc.printf("Trimpot controlled duty cycle and frequency\n"); |
embeddedartists | 0:6f393e96a8d1 | 79 | while(1) { |
embeddedartists | 0:6f393e96a8d1 | 80 | // Don't want to read too often as that will return incorrect values |
embeddedartists | 0:6f393e96a8d1 | 81 | if (readDuty) { |
embeddedartists | 0:6f393e96a8d1 | 82 | wantedDutyCycle = getDutyCycle(PCF8591::A0); |
embeddedartists | 0:6f393e96a8d1 | 83 | } else { |
embeddedartists | 0:6f393e96a8d1 | 84 | delay = getDutyCycle(PCF8591::A1); |
embeddedartists | 0:6f393e96a8d1 | 85 | } |
embeddedartists | 0:6f393e96a8d1 | 86 | readDuty = !readDuty; |
embeddedartists | 0:6f393e96a8d1 | 87 | |
embeddedartists | 0:6f393e96a8d1 | 88 | // Try to run PWM loop for about 50ms to allow ADC to produce correct values |
embeddedartists | 0:6f393e96a8d1 | 89 | for (int num = 0; num <= (500/(delay+1)); num++) { |
embeddedartists | 0:6f393e96a8d1 | 90 | // set output high |
embeddedartists | 0:6f393e96a8d1 | 91 | greenLED = 1; |
embeddedartists | 0:6f393e96a8d1 | 92 | |
embeddedartists | 0:6f393e96a8d1 | 93 | for (int loopCounter = 0; loopCounter < 100; loopCounter++) { |
embeddedartists | 0:6f393e96a8d1 | 94 | if (loopCounter == wantedDutyCycle) { |
embeddedartists | 0:6f393e96a8d1 | 95 | // set output low |
embeddedartists | 0:6f393e96a8d1 | 96 | greenLED = 0; |
embeddedartists | 0:6f393e96a8d1 | 97 | } |
embeddedartists | 1:08c2337bfa7b | 98 | wait_us(delay*5); |
embeddedartists | 0:6f393e96a8d1 | 99 | } |
embeddedartists | 0:6f393e96a8d1 | 100 | } |
embeddedartists | 0:6f393e96a8d1 | 101 | } |
embeddedartists | 0:6f393e96a8d1 | 102 | } |
embeddedartists | 0:6f393e96a8d1 | 103 | |
embeddedartists | 0:6f393e96a8d1 | 104 | static void experiment4() |
embeddedartists | 0:6f393e96a8d1 | 105 | { |
embeddedartists | 0:6f393e96a8d1 | 106 | // set wanted duty cycle |
embeddedartists | 0:6f393e96a8d1 | 107 | int wantedRedDutyCycle = 10; |
embeddedartists | 0:6f393e96a8d1 | 108 | int wantedGreenDutyCycle = 10; |
embeddedartists | 0:6f393e96a8d1 | 109 | |
embeddedartists | 0:6f393e96a8d1 | 110 | bool readRed = true; |
embeddedartists | 0:6f393e96a8d1 | 111 | |
embeddedartists | 0:6f393e96a8d1 | 112 | // initialize LEDs to off |
embeddedartists | 0:6f393e96a8d1 | 113 | greenLED = redLED = 1; |
embeddedartists | 0:6f393e96a8d1 | 114 | |
embeddedartists | 0:6f393e96a8d1 | 115 | pc.printf("Trimpot controlled duty cycle (one per LED)\n"); |
embeddedartists | 0:6f393e96a8d1 | 116 | while(1) { |
embeddedartists | 0:6f393e96a8d1 | 117 | if (readRed) { |
embeddedartists | 0:6f393e96a8d1 | 118 | wantedRedDutyCycle = getDutyCycle(PCF8591::A0); |
embeddedartists | 0:6f393e96a8d1 | 119 | } else { |
embeddedartists | 0:6f393e96a8d1 | 120 | wantedGreenDutyCycle = getDutyCycle(PCF8591::A1); |
embeddedartists | 0:6f393e96a8d1 | 121 | } |
embeddedartists | 0:6f393e96a8d1 | 122 | readRed = !readRed; |
embeddedartists | 0:6f393e96a8d1 | 123 | |
embeddedartists | 0:6f393e96a8d1 | 124 | |
embeddedartists | 0:6f393e96a8d1 | 125 | // The duty cycle does not have to be read for each PWM loop |
embeddedartists | 0:6f393e96a8d1 | 126 | for (int num = 0; num < 200; num++) { |
embeddedartists | 0:6f393e96a8d1 | 127 | // set outputs high |
embeddedartists | 0:6f393e96a8d1 | 128 | greenLED = 1; |
embeddedartists | 0:6f393e96a8d1 | 129 | redLED = 1; |
embeddedartists | 0:6f393e96a8d1 | 130 | |
embeddedartists | 0:6f393e96a8d1 | 131 | for (int loopCounter = 0; loopCounter < 100; loopCounter++) { |
embeddedartists | 0:6f393e96a8d1 | 132 | if (loopCounter == wantedGreenDutyCycle) { |
embeddedartists | 0:6f393e96a8d1 | 133 | // set output low |
embeddedartists | 0:6f393e96a8d1 | 134 | greenLED = 0; |
embeddedartists | 0:6f393e96a8d1 | 135 | } |
embeddedartists | 0:6f393e96a8d1 | 136 | if (loopCounter == wantedRedDutyCycle) { |
embeddedartists | 0:6f393e96a8d1 | 137 | // set output low |
embeddedartists | 0:6f393e96a8d1 | 138 | redLED = 0; |
embeddedartists | 0:6f393e96a8d1 | 139 | } |
embeddedartists | 0:6f393e96a8d1 | 140 | } |
embeddedartists | 0:6f393e96a8d1 | 141 | } |
embeddedartists | 0:6f393e96a8d1 | 142 | } |
embeddedartists | 0:6f393e96a8d1 | 143 | } |
embeddedartists | 0:6f393e96a8d1 | 144 | |
embeddedartists | 0:6f393e96a8d1 | 145 | int main() |
embeddedartists | 0:6f393e96a8d1 | 146 | { |
embeddedartists | 0:6f393e96a8d1 | 147 | //experiment1(); // Fixed duty cycle |
embeddedartists | 0:6f393e96a8d1 | 148 | //experiment2(); // Trimpot controlled duty cycle |
embeddedartists | 0:6f393e96a8d1 | 149 | //experiment3(); // Trimpots controls duty cycle and frequency |
embeddedartists | 0:6f393e96a8d1 | 150 | experiment4(); // Trimpots controls one LED each |
embeddedartists | 0:6f393e96a8d1 | 151 | } |