Arduino Analogt Output

Fra Holstebro HTX Wiki
Skift til: navigering, søgning

Arduino UNO har 6 porte, der kan simulere et analogt output ved hjælp af PWM (Pulse Width Modulation). De 6 porte er markeret med et tilde(~) ud fra deres portnummer. Portene udgiver en 8-bit værdi, hvilket vil sige at værdien kan være mellem 0 og 255.


PWM

Illustration af forskellige PWM duty cycles

Arduino bruger de digitale porte, som egentlig kan stå på enten høj eller lav (hhv. 5V og 0V), til at simulere et analogt signal. PWM fungerer ved at skifte mellem høj og lav meget hurtigt, så man kan simulere en fast og varierende spænding mellem 5V og 0V. For eksempel, hvis udgangen står på høj 50% af perioden (50% duty cycle), bliver den analoge værdi 256 ⋅ 0.50 = 128.

Arduino IDE

For at lave analogt output i arduino skal man bruge funktionen analogWrite(port, værdi), hvor man skal være opmærksom på om porten understøtter PWM, og at værdien skal være mellem 0-255 (8 bit). Hvis man for eksempel skrev analogWrite(5, 128), ville arduinoen sende et PWM signal til port nr. 5 med en duty-cycle på ca. 50%.

Eksempel

I dette eksempel bliver det lavet en måling og sammenligning af et PWM signal fra arduinoen, og en måling af samme signal gennem et filter som lavet PWM signalet om til en mere stabil og fast spæning.

Kode

I følgende eksempel er der skrevet et simpelt program med følgende kode:

void setup(){
   pinMode(3, OUTPUT);
   pinMode(5, OUTPUT);
}
void loop() {
   analogWrite(3, 75);
   analogWrite(5, 75);
}

Opstilling

PWM setup.png

Opstillingen ses på billedet til højre, og har størrelserne R1 = 5.6 kΩ og C1 = 1μF RC-leddet er et simpelt lavpas filter, som mindsker svingningerne i signalet, så man rent praktisk får en fast spænding mellem 0V og 5V.

Resultat

Thumb

Her ses den resulterende graf, som er blevet lavet ved hjælp af pcLab. Den har en duty cycle på cirke 33%, som kan ses på den røde bølge. Den blå bølge er spændingen igennem lavpas filtret, som ligger på ca. 1,6V

Teori

Hvis man vil holde en spænding nogenlunde konstant, når inputtet er pulserende, kan man bruge et RC-led. Man oplader og aflader kondensatoren hurtigt med PWM-bølgen. Men hvis man gerne vil holde værdien nogenlunde stabil, skal man oplade og aflade den ganske lidt ad gangen. Dette gør man ved at have en stor tidskonstant.

Tidskonstanten

Når en kondensator lader op, lader den op eksponentielt. Tidskonstanten tau, er den tid der er gået når 63.2% af den fulde værdi er opnået. Når der er gået 5 tidskonstanter, og man har opnået 99.3% af den fulde værdi, ses kondensatoren som fuldt opladt eller afladt. For et RC-led, kan man, meget belejligt, udregne tidskonstanten som produktet af værdien for resistoren og værdien af kondensatoren. En graf for opladning af kondensator med tidskonstanter, kan ses her til højre [1].

Opladning af kondensator i tidskonstanter

τ=R⋅C

Hvis vi gerne vil have en stor tidskonstant, skal produktet af værdien for kondensatoren og resistoren være højt. Men man vil selvfølgelig kun op- og aflade en lille smule af tidskonstanten. Her har vi valgt 0.1 τ. Hvis man vælger en større del af tidskonstanten, for man et mere varierende resultat. Derudover tager en PWM periode på Arduino 2ms, så man skal sigte efter at produktet at værdien af resistoren og kondensatoren er 2ms. I alt kan man skrive formlen herunder op.

2ms = .1τ = R⋅C

Her kan man for eksempel bruge R=2000 Ω og C=1μF

2ms = .1 20ms = 2000Ω ⋅ 1μF


Referencer