Forum: Mikrocontroller und Digitale Elektronik Einfache Regelung


von SomethingSomwhere (Gast)


Lesenswert?

Hallo!
Ich bin noch neu was das Thema Atmels und Elektronik angeht und habe 
eine simple Frage...

Ich möchte den Widerstand eines Potentiometers messen und je kleiner 
dieser ist, desto länger meinen "Ausgang" auf 'high' haben.

Jetzt habe ich gedacht ich gebe auf das Potentiometer einfach mal 5V 
(welche ich ja eh habe um meinen Atmel zu versorgen) und messe mit dem 
eingebauten ADC des Atmels die Spannung. Je geringer die Spannung, desto 
kürzer die "Pulspausen".

Würde das so funktionieren? Gibt es dazu evtl noch einen einfacheren 
Weg? Das ganze soll relativ stufenlos sein und hinterher 12 FETs 
ansteuern, welche wiederrum meinen Motor antreiben...


Lg

von Timmo H. (masterfx)


Lesenswert?

Ja so würde das gehen. Schleifer an  ADC-Port und los gehts.
Wie man den ADC Verwendet steht ja hier: 
AVR-GCC-Tutorial: Der interne ADC im AVR

von Stefan D. (t-bird)


Lesenswert?

Hallo,
das Poti kannst du mit dem ADC wie Du meintest auslesen. Der ADC-Wandler 
ist gut im AVR-Tutorial erklärt 
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC). Das 
Erzeugen des PWM Signal ist schon etwas schwieriger. Wenn du nur maximal 
zwei unterschiedliche PWM Signale brauchst, kannst du diese per 
Hardware-PWM erzeugen 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#PWM_.28Pulsweitenmodulation.29). 
Da hier nur eine relative Zahl für das Verhältnis zwischen high und low 
eingegeben werden muss, musst du den ADC-Wert (zwischen 0 und 1023) nur 
so multiplizieren, dass du auf die größtmögliche Zahl für das PWM 
kommst.
T-bird

von U.R. Schmitt (Gast)


Lesenswert?

SomethingSomwhere schrieb:
> Ich bin noch neu was das Thema Atmels und Elektronik angeht und habe
> eine simple Frage...

SomethingSomwhere schrieb:
> Würde das so funktionieren? Gibt es dazu evtl noch einen einfacheren
> Weg? Das ganze soll relativ stufenlos sein und hinterher 12 FETs
> ansteuern, welche wiederrum meinen Motor antreiben...

Kleiner Tipp
Steigere dich langsam
Versuche erst mal eine LED zum Blinken zu bringen, dann baue den Poti 
dazu und bringe die LED dazu einstellbar unterschiedliche Puls Pausen 
Zeiten zu blinken. Wenn das funktioniert kannst du mit der ersten FET 
für einen Gleichstommotor anfangen.

Das verringert das Frustpotential immens.

von Xline (Gast)


Lesenswert?

Wow @PWM.
Ich hatte eigentlich daran gedacht den Pin einfach in eine Schleife zu 
hängen und die sleep / delay - Zeit abhängig vom Widerstand zu machen :P

Bei <5 Ohm hätte ich die Schleife dann 'genullt'...

Scheint da doch nicht ganz so einfach zu sein, wie ich es mir erhofft 
hatte. Danke schonmal für die Links. Da hab ich heute Abend wohl noch 
genug zu tun. ;)

von U.R. Schmitt (Gast)


Lesenswert?

Was mireben noch aufgefallen ist:
Du schreibst du hast den Poti auf 5V gehängt. Das ist falsch. Der ADC 
misst von 0V bis Aref. Du musst also aus den Poti nicht auf deine 
Versorgung sondern auf das Potential von Aref hängen.
Les die wie oben schon gesagt hier das Tutorial zum ADC durch (Link von 
Stefan D.)

von Christian W. (cweckmann)


Lesenswert?

Xline schrieb:

> Wow @PWM.
> Ich hatte eigentlich daran gedacht den Pin einfach in eine Schleife zu
> hängen und die sleep / delay - Zeit abhängig vom Widerstand zu machen :P
>
> Bei <5 Ohm hätte ich die Schleife dann 'genullt'...
>
> Scheint da doch nicht ganz so einfach zu sein, wie ich es mir erhofft
> hatte. Danke schonmal für die Links. Da hab ich heute Abend wohl noch
> genug zu tun. ;)

Das würde und wird auch so funktionieren. Allerdings misst der ADC nicht 
den Widerstand am Pin sondern die Spannung in Relation zu entweder der 
Spannung an ARef oder VCC. Es wäre deshalb besser dein Poti zwischen VCC 
oder ARef und GND zu schalten um einen Spannungsteiler zu bauen und den 
Schleifer (meist der mittlere Pin des Potis) an den ADC zu hängen. So 
kannst du die Spannung ziemlich genau zwischen 0 und dem maximum 
einstellen und mit dem ADC abgreifen.

Die Schleife mit der variablen Pause wird wie schon erwähnt so 
funktionieren, nur musst du aufpassen daß der erzeugte Code nicht zu 
groß wird. Das kann nämlich passieren, wenn du z.B. _delay_ms(adc_wert); 
schreibst, weil dann der komplette Fließkommateil der delay-Routine mit 
auf den Controller geschrieben werden muss. Falls es nur darauf ankommt 
eine unterschiedliche Blinkzeit zu erzeugen und nicht darauf, eine 
möglichst genaue Zeit zu warten, kann man um Platz auf dem µC zu 
sparen statt _delay_ms(adc_wert) aufzurufen einfach eine Schleife bauen 
in der _delay_ms(1); adc_wert-mal aufgerufen wird. Wenn dein Controller 
allerdings eh über genug Flash verfügt kannst du auch einfach delay mit 
der Variable aufrufen. Zum ausprobieren kann man schonmal 2k oder so für 
delay verpulvern :)

Grüße aus Hannover,
 Christian

von Düsendieb (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.