## 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.