Kategori: Skrive analoge verdier
Treff: 4899

Arduino Uno har ikke noen digital-til-analog-converter (DAC) innebygd, men det er mulig å "simulere" analoge spenninger ved å bruke PWM-utganger. PWM står for Pulse Width Modulation, eller puldsbreddemodulasjon på norsk. Det vil si at vi skriver pulser som skifter mellom 0V og 5V på utgangen, men at vi kan justere av- og på-tiden på pulsen. Dette forholdet kalles Duty Cycle, eller pulsforhold på norsk. Disse pulsene kan enten brukes direkte, til for eksempel kontroll av hastighet på en DC-motor, eller filtreres gjennom et RC-filter for å få en analog spenning.

Uno'en har seks utganger som er spesielt beregnet for PWM. Disse er merket med en tilde ( ~ ) ved siden av pinnenummeret. Det er pinne 3, 5, 6, 9, 10 og 11.

Arduino PWM

Det er mulig å bruke PWM på andre pinner også, men da må pinnene styres direkte av programmet, noe som bruker mer CPU-tid. 
De seks nevnte pinnene bruker de tre innebygde timerene (klokkene) til å styre pulsene, som gjør at CPU'en kan ta seg av andre ting.

 

Oppkobling

I dette eksempelet bruker vi en blå lysdiode og en seriemotstand. Her har vi valgt å koble lysdioden "aktiv høy", det vil si at lysdioden lyser når vi har høyt nivå (5V) på utgangen (i dette tilfellet pinne 10). Da er det viktig at du får Anoden til lysdioden nærmest utgangen. Anoden er den med lengst bein. Strømmen vil da gå gjennom lysdioden (fra anode til katode), gjennom seriemotstanden og til jord.
PWM oppkobling

Program

Eksempel-programmet består av to løkker.  Den første for-løkka teller fra 0  og opp til 255. Tellerverdien brukes så til å sette "duty cycle" på PWM-utgangen på pinne tid, med funksjonen analogWrite(). Funksjonen tar to parametere, først pinnenummer og så et tall fra 0-255 for å sette pulsforholdet.

Løkke nummer to fungerer på samme måte, bare at den teller fra 255 og ned til 0.

void setup() {
pinMode(10, OUTPUT); //Setter pinne 10 til utgang. Ikke noe spesielt for å bruke PWM
}

void loop() {
//Starter på null og går opp til full intensitet
for (int i=0; i<256;i++){
analogWrite(10,i); // analogWrite setter pulsforholdet på pinne 10 med telle-variabelen i
delay(10); // Liten pause
}
//Går fra full intensitet og ned til null
for (int i=255; i>=0;i--){
analogWrite(10,i); // analogWrite setter pulsforholdet på pinne 10 med telle-variabelen i
delay(10); // Liten pause
}
}

Resultat

Effekten er litt vanskelig å få filmet med en mobiltelefon, og det ser ut som intensiteten er på fullt mye av tiden. Dette gjør seg best "live".

PWM_med_Oscilloskop.mp4 (Musikk fra www.bensound.com)

 

Oppgaver

Oppgave 1:
Bruk oppkoblingen fra eksempelet. I tillegg kan du koble til et potensiometer på A0, som vist her: Lese analoge verdier

1: Bruk verdien du leser fra potensiometeret til å styre lysstyrken på lysdioden.

2: Lyset oppfører seg litt rart. Hva kan det skyldes, og hvordan kan du løse dette?

 

Løsningsforslag

Oppgave 1:  

/* Bruk verdien du leser fra potensiometeret til å styre lysstyrken på lysdioden.
*/



void setup() {
pinMode(10, OUTPUT); // Setter opp pinne 10 som utgang. (ikke noe spesielt for PWM)
}

void loop() {
// Lager løsningen så kort og kompakt som mulig. Da kan det løses med en linje kode:
analogWrite(10,analogRead(A0)/4); // Verdiene som lese fra A0 vil være mellom 0 og 1023.
// analogWrite tar bare verdier opp til 256 så derfor
// deler vi den leste verdien på 4 før vi "skriver den til pinne 10
}

 Oppgave 2: