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
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
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
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.
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. ;)
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.)
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
Da findest Du ein Beispielprogramm: http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte#PWM___Pulsweitenmodulation
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.