arduino
PWM - Pulsbreedtemodulatie
Zoeken…
Bedien een DC-motor via de seriële poort met behulp van PWM
In dit voorbeeld willen we een van de meest voorkomende taken uitvoeren: ik heb een kleine DC-motor liggen, hoe gebruik ik mijn Arduino om deze te besturen? Eenvoudig, met PWM en seriële communicatie, met behulp van de functie analogWrite()
en de Serial
bibliotheek.
De basis
Pulsbreedtemodulatie of kortweg PWM is een techniek voor het nabootsen van analoge signalen met behulp van digitale uitvoer. Hoe werkt dit? Met behulp van een pulstrein waarvan de relatie D (duty cycle) tussen tijd op hoog niveau (digitaal 1, meestal 5 V) en tijd op laag niveau (digitaal 0, 0 V) in elke periode kan worden gewijzigd om een gemiddelde spanning tussen deze twee niveaus te produceren:
Via Arduino analogWrite(pin,value)
functie kunnen we variëren value
van de werkcyclus van pin
output 's. Merk op dat de pin
in de uitvoermodus moet worden geplaatst en dat de value
tussen 0 (0V) en 255 (5V) moet liggen. Elke waarde daartussenin simuleert een proportionele tussenliggende analoge uitgang.
Het doel van analoge signalen is echter meestal gerelateerd aan de besturing van mechanische systemen die meer spanning en stroom vereisen dan alleen het Arduino-bord. In dit voorbeeld leren we hoe we de PWM-mogelijkheden van Arduino kunnen versterken.
Hiervoor wordt een MOSFET-diode gebruikt. In wezen fungeert deze diode als een schakelaar. Het laat toe of onderbreekt de elektrische stroom tussen zijn bron- en afvoeraansluitingen . Maar in plaats van een mechanische schakelaar, beschikt deze over een derde aansluiting die gate wordt genoemd . Een zeer kleine stroom (<1 mA) zal deze poort "openen" en de stroom laten stromen. Dit is erg handig, omdat we de PWM-uitvoer van Arduino naar deze poort kunnen sturen, waardoor een andere PWM-pulstrein met dezelfde duty-cycle door de MOSFET wordt gecreëerd, die spanningen en stromen mogelijk maakt die de Arduino zouden vernietigen.
Stuklijst: wat heb je nodig om dit voorbeeld te bouwen
- MOSFET-diode: bijvoorbeeld de populaire BUZ11
- Beschermingsdiode voor de motor: Schottky SB320
- Weerstand: alles 10K ~ 1M Ohm
- Motor: een typische kleine motor (een typische kan 12V zijn)
- Een stroombron die compatibel is met de motor die u hebt geselecteerd
- Een broodplank
- Kleurrijke kabels!
- Een Arduino, maar dat wist je al.
De build
Zet alles samen! Voed de rails van het breadboard en plaats de MOSFET-diode erin. Verbind de motor tussen de positieve rail en de MOSFET-afvoer. Verbind de beveiligingsdiode op dezelfde manier: tussen de MOSFET-afvoer en de positieve rail. Sluit de bron van de MOSFET aan op de gemeenschappelijke grondrail. Sluit ten slotte de PWM-pin (we gebruiken pin 10 in dit voorbeeld) aan op de poort van de MOSFET en ook op de gemeenschappelijke aarde via de weerstand (we hebben zeer lage stroom nodig!).
Hier is een voorbeeld van hoe deze build eruit ziet. Als u de voorkeur geeft aan een schema , is dit er een.
De code
Nu kunnen we de Arduino op een computer aansluiten, de code uploaden en de motor besturen, door waarden te verzenden via de seriële communicatie. Bedenk dat deze waarden gehele getallen tussen 0 en 255 moeten zijn. De eigenlijke code van dit voorbeeld is heel eenvoudig. Een uitleg wordt gegeven in elke regel.
int in = 0; // Variable to store the desired value
byte pinOut = 10; // PWM output pin
void setup() { // This executes once
Serial.begin(9600); // Initialize serial port
pinMode(pinOut, OUTPUT); // Prepare output pin
}
void loop() { // This loops continuously
if(Serial.available()){ // Check if there's data
in = Serial.read(); // Read said data into the variable "in"
analogWrite(pinOut, in); // Pass the value of "in" to the pin
}
}
En dat is het! Nu kunt u de PWM-mogelijkheden van Arduino gebruiken om toepassingen te besturen die analoge signalen vereisen, zelfs wanneer de stroomvereisten de limieten van het bord overschrijden.
PWM met een TLC5940
De TLC5940 is een handig item om te hebben als je geen PWM-poorten meer hebt op de Arduino. Het heeft 16 kanalen, elk afzonderlijk regelbaar met 12 bits resolutie (0-4095). Een bestaande bibliotheek is beschikbaar op http://playground.arduino.cc/Learning/TLC5940 . Het is handig voor het besturen van meerdere servo's of RGB-LED's. Houd er rekening mee dat de LED's een gemeenschappelijke anode moeten zijn om te werken. Bovendien zijn de chips in serie te schakelen, waardoor nog meer PWM-poorten mogelijk zijn.
Voorbeeld:
// Include the library
#include <Tlc5940.h>
void setup() {
// Initialize
Tlc.init();
Tlc.clear();
}
unsigned int level = 0;
void loop() {
// Set all 16 outputs to same value
for (int i = 0; i < 16; i++) {
Tlc.set(i, level);
}
level = (level + 1) % 4096;
// Tell the library to send the values to the chip
Tlc.update();
delay(10);
}