Een Arduino kan geen wisselende spanning (analoog signaal) aanbieden. Alleen 0V en (afhankelijk van welke smaak Arduino je hebt) 3V, of 5V. Door nu een pin met een bepaalde frequentie, gedurende een bepaalde tijd afwisselend aan en uit te zetten lijkt het of er een analoge spanning op staat. Dat principe heet pulsbreedte modulatie of pulse width modulation (PWM).
In Arduino-taal:
pinMode(PinA, OUTPUT);
analogWrite(PinA, n);
PinA wordt als output geconfigureerd. Op die pin worden pulsen gezet met een duty cycle van 0% (n = 0) tot 100% (n = 255). Het lijkt dan dat er een “analoog” signaal op PinA wordt aangeboden.


Dit principe wordt hier goed uitgelegd. Daar schrijven ze o.a. ook dat de frequentie van het PWM-signaal (d.m.w. analogWrite(pin, n) ongeveer 490 Hz is en dat dat evt. aan te passen is door het programmeren van de timers.

In tegenstelling tot de PWM instructie, kan bij HPWM de frequentie worden ingesteld (bij PWM ligt dit vast, afhankelijk van de oscillator). Dit geldt voor voor PIC’s.
Voor bepaalde motoren is 1000Hz tot 2000Hz (1kHz – 2kHz) een mooie waarde. Bij een lagere frequentie loopt zo’n motor rauw en maakt meer lawaai dan bij 2000Hz. En bij hele hoge frequenties kan de motor het niet bijbenen en levert dan kracht in.
De motortjes van mijn treintjes schijnen het beter te doen op een lagere frequentie: tot ca. 900Hz.
Je kunt de PWM zelf instellen door op een pin (pin 13 in onderstaand voorbeeld) tussen een HIGH en een LOW signaal een delay in te zetten en daarna weer een delay van een bepaalde lengte te plaatsen. Er zitten wel wat nadelen aan, zoals hier beschreven.
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delayMicroseconds(1000);
digitalWrite(13, LOW);
delayMicroseconds(1000);
}

Rekenvoorbeeld
Duty cycle bij 150ms aan, 50ms uit:
150/(150 + 50) x 100% =
150 / 200 x 100% =
0,75 xx 100% =
75%
Periode = 200ms.
Frequentie = 1000ms / 200ms = 5Hz
Op de Arduino website (hier) gaan ze uitgebreid in op het instellen van PWM door aanpassing van de timers.