Solutions for the PWM experiments for LPC812 MAX

Dependencies:   lpc812_exp_lib_PCF8591 mbed

Revision:
0:6f393e96a8d1
Child:
1:08c2337bfa7b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Nov 22 12:40:14 2013 +0000
@@ -0,0 +1,151 @@
+#include "mbed.h"
+#include "PCF8591.h"
+ 
+Serial pc(USBTX, USBRX); // tx, rx
+
+DigitalOut redLED(D0);
+DigitalOut greenLED(D1);
+ 
+PCF8591 adc;
+
+static void experiment1()
+{
+    // set wanted duty cycle
+    int wantedDutyCycle = 10;
+    
+    // initialize LEDs to off
+    greenLED = redLED = 1;
+
+    pc.printf("Fixed duty cycle\n");
+    while(1) {
+        // set output high
+        greenLED = 1;
+        
+        for (int loopCounter = 0; loopCounter < 100; loopCounter++) {
+            if (loopCounter == wantedDutyCycle) {
+                // set output low
+                greenLED = 0;
+            }
+        }
+    }
+}
+
+static int getDutyCycle(PCF8591::AnalogIn port)
+{
+    return (adc.read(port) * 100)/256;
+}
+
+static void experiment2()
+{
+    // set wanted duty cycle
+    int wantedDutyCycle = 10;
+
+    // initialize LEDs to off
+    greenLED = redLED = 1;
+
+    pc.printf("Trimpot controlled duty cycle\n");
+    while(1) {
+        wantedDutyCycle = getDutyCycle(PCF8591::A0);
+        
+        // The duty cycle does not have to be read for each PWM loop
+        for (int num = 0; num < 200; num++) {
+            // set output high
+            greenLED = 1;
+            
+            for (int loopCounter = 0; loopCounter < 100; loopCounter++) {
+                if (loopCounter == wantedDutyCycle) {
+                    // set output low
+                    greenLED = 0;
+                }
+            }
+        }
+    }
+}
+
+static void experiment3()
+{
+    // set wanted duty cycle
+    int wantedDutyCycle = 10;
+    
+    // set wanted frequency
+    int delay = 1;
+
+    // initialize LEDs to off
+    greenLED = redLED = 1;
+
+    bool readDuty = true;
+
+    pc.printf("Trimpot controlled duty cycle and frequency\n");
+    while(1) {
+        // Don't want to read too often as that will return incorrect values
+        if (readDuty) {
+            wantedDutyCycle = getDutyCycle(PCF8591::A0);
+        } else {
+            delay = getDutyCycle(PCF8591::A1);
+        }
+        readDuty = !readDuty;
+        
+        // Try to run PWM loop for about 50ms to allow ADC to produce correct values
+        for (int num = 0; num <= (500/(delay+1)); num++) {
+            // set output high
+            greenLED = 1;
+
+            for (int loopCounter = 0; loopCounter < 100; loopCounter++) {
+                if (loopCounter == wantedDutyCycle) {
+                    // set output low
+                    greenLED = 0;
+                }
+                wait_us(delay);
+            }
+        }        
+    }
+}
+
+static void experiment4()
+{
+    // set wanted duty cycle
+    int wantedRedDutyCycle = 10;
+    int wantedGreenDutyCycle = 10;
+    
+    bool readRed = true;
+    
+    // initialize LEDs to off
+    greenLED = redLED = 1;
+
+    pc.printf("Trimpot controlled duty cycle (one per LED)\n");
+    while(1) {
+        if (readRed) {
+            wantedRedDutyCycle = getDutyCycle(PCF8591::A0);
+        } else {
+            wantedGreenDutyCycle = getDutyCycle(PCF8591::A1);
+        }
+        readRed = !readRed;
+        
+
+        // The duty cycle does not have to be read for each PWM loop
+        for (int num = 0; num < 200; num++) {
+            // set outputs high
+            greenLED = 1;
+            redLED = 1;
+        
+            for (int loopCounter = 0; loopCounter < 100; loopCounter++) {
+                if (loopCounter == wantedGreenDutyCycle) {
+                    // set output low
+                    greenLED = 0;
+                }
+                if (loopCounter == wantedRedDutyCycle) {
+                    // set output low
+                    redLED = 0;
+                }
+            }
+        }
+    }
+}
+
+int main()
+{
+    //experiment1();  // Fixed duty cycle
+    //experiment2();  // Trimpot controlled duty cycle
+    //experiment3();  // Trimpots controls duty cycle and frequency
+    experiment4();  // Trimpots controls one LED each
+}
\ No newline at end of file