PwmOut

Example 1

The on-board LEDs can be dimmed via 4 of the 6 PWM found in LPC1768

#include "mbed.h"

PwmOut led1(LED1);
PwmOut led2(LED2);
PwmOut led3(LED3);
PwmOut led4(LED4);

int main()
{
    while (1) {
        for (float f = 0.0; f < 1.0; f += 0.001) {
            led1 = f;
            led2 = f*f;
            led3 = (f+1.0)/2.0;
            led4 = 1.0 - f;
            wait(0.01);
        }
    }
}

Example 2

The changes in light intensity is a bit awkward. Let's smooth it using sinusoidal function

It seems that M_PI is not defined in the standard math.h header.

We need to ensure that the value (duty cycle) to PwmOut is positive. As sinusoidal function gives value between -1 to 1, we just need to add 1.0 to it.

#include "mbed.h"
#include <math.h>

#ifndef M_PI
#define M_PI 3.1415
#endif

PwmOut led1(LED1);
PwmOut led2(LED2);
PwmOut led3(LED3);
PwmOut led4(LED4);

int main()
{
    float f = 0.0;

    while (1) {
        // Add 1.0 to ensure all values are positive
        led1 = sin( (f        ) * M_PI / 180.0) + 1.0;
        led2 = sin( (f +  90.0) * M_PI / 180.0) + 1.0;
        led3 = sin( (f + 180.0) * M_PI / 180.0) + 1.0;
        led4 = sin( (f + 270.0) * M_PI / 180.0) + 1.0;
        f += 1.0;
        wait(0.01);
    }
}

Information

Memory usage of the code above:

Flash (kB)RAM (kB)
Code0.80.0
Libraries150.3
Total150.3

Let's commented out the wait(0.01) and time the program by letting it to display 1000 sets of value.

#include "mbed.h"
#include <math.h>

#ifndef M_PI
#define M_PI 3.1415
#endif


int main()
{
    Timer  t;
    int    count = 0;
    
    printf("Timer start!\n");
    t.start();
    
    PwmOut led1(LED1);
    PwmOut led2(LED2);
    PwmOut led3(LED3);
    PwmOut led4(LED4);

    float f = 0.0;

    while (count < 1000) {
        // Add 1.0 to ensure all values are positive
        led1 = sin( (f        ) * M_PI / 180.0) + 1.0;
        led2 = sin( (f +  90.0) * M_PI / 180.0) + 1.0;
        led3 = sin( (f + 180.0) * M_PI / 180.0) + 1.0;
        led4 = sin( (f + 270.0) * M_PI / 180.0) + 1.0;
        f += 1.0;
        count++;
        //wait(0.01);
    }
    
    t.stop();
    printf("The time taken was %f seconds\n", t.read());
}

Information

Memory usage of the code above:

Flash (kB)RAM (kB)
Code0.80.0
Libraries180.3
Total180.3

The output of the program:

Timer start!
The time taken was 0.140636 seconds

Now let's precompute the values to be display and store the results in an array. Let choose 256 records for each LED.

#include "mbed.h"
#include <math.h>

#ifndef M_PI
#define M_PI 3.1415
#endif

#define STP   256  /* Step */
#define LED     4  /* Number of LEDs that use PWM */

int main()
{
    Timer  t;
    int    count = 0;
    
    printf("Timer start!\n");
    t.start();
    
    PwmOut Leds[] = {(LED1), (LED2), (LED3), (LED4)};
    float y[STP][LED];        // Store all values
    float res = 360 / STP;    // Resolution (degree per step)
    float x = 0.0;            // Current x
    float ph = 360 / LED;     // Phase different btw two successive LEDs

    for (int i = 0; i < STP; i++) {
        for (int j = 0; j < LED; j++) {
            y[i][j]  = sin( (x + ph * j) * M_PI / 180.0) + 1.0;
        }
         x += res; // increment x by each resolution
    }

    while (count < 1000) {
        for (int i = 0; i < STP; i++) {
            for (int j = 0; j < LED; j++) {
                Leds[j] = y[i][j];
            }
            count++;
            //wait(0.01);
        }
    }

    t.stop();
    printf("The time taken was %f seconds\n", t.read());    
}

Information

Memory usage of the code above:

Flash (kB)RAM (kB)
Code0.80.0
Libraries180.3
Total190.3

The output of the program:

Timer start!
The time taken was 0.045611 seconds

There is a slight increase in memory usage to store the value but there is a great improvement in speed.


Please log in to post comments.