kurzer Vorspann:
meinen ältesten Mini Vers.04 habe ich heute aus der Lochrasterheimat entnommen, schön gesäubert und erst einmal auf das Steckbrett zum Testen gebracht.
Da das Schätzchen schon einiges mitgemacht hat, hat mich erst mal interessiert, ob die Pins alle noch ordentlich Pegel liefern.
Mit einem modifizierten Blink-Sketch in einer Schleife alle Ports von 2 bis 13 als Ausgang deklariert und im Loop-Segment eine Schleife über alle diese Ports mit 10ms Dauer und 10ms Pause "blinken" lassen.
Mit meinem neuen DSO nano Clone konnte ich an allen besagten Pins das Reckecksignal erkennen.
Bei der Suche danach, wie ich nun AD0 bis AD7 testen kann, bin ich über writeAnalog() gestolpert (was natürlich dafür nicht geeignet ist), dennoch ein simples Sketch erstellt, mit dem die Pins 3,5,6,9,10 und 11 mit dem Wert 127 beschrieben werden, was ein 50% Rechtecksignal ausgeben soll.
So, was stelle ich fest?
Es funktioniert... aber etwas kurios ist, dass die Pins 3, 9,10 und 11 ein Rechtecksignal mit 5ms High- und 5ms Lowpegel liefern und die beiden Pins 5 und 5 eines mit jeweils 2,5ms !
(die absoluten Werte können jetzt falsch sein, da aus der Erinnerung..)
Abgesehen davon habe ich nur etwas vom "Duty Cycle", also dem Verhältnis von High- zu Lowpegel abhängig vom writeAnalog() Parameter gelesen, aber nichts über die Frequenz!
Mein kleiner DSO erzählt mir etwas von 490 Hz und ca. 970 Herz respektive an Pin5 + 6.
Erklärung hab ich keine, sondern ich kann sagen daß der ATmega 2 8-bit-Timer hat und einen 16-Bit-Timer. Da könnte ein Fehler im setup der Timer sein, aber aus Mangel an Erfahrung kann ich nichts sagen.
Die Analogen Eingänge kannst DU mittels eines Spannungsteilers kontrollieren. einfach 2 1kOhm Widerstände zwischen 5V und Masse schalten und den gemeinsamen auf den Analogen Eingang. Du mußt dann ca 511 lesen.
ManfredH:
Es funktioniert... aber etwas kurios ist, dass die Pins 3, 9,10 und 11 ein Rechtecksignal mit 5ms High- und 5ms Lowpegel liefern und die beiden Pins 5 und 5 eines mit jeweils 2,5ms !
Abgesehen davon habe ich nur etwas vom "Duty Cycle", also dem Verhältnis von High- zu Lowpegel abhängig vom writeAnalog() Parameter gelesen, aber nichts über die Frequenz!
Mein kleiner DSO erzählt mir etwas von 490 Hz und ca. 970 Herz respektive an Pin5 + 6.
Gibt es eine Erklärung für den Unterschied?
Hallo,
ja, die gibt es
Die PWM-Pins liegen auf unterschiedlichen Timern und ein Teil der Timer wird in der Funktion init() in Datei wiring.c in den PWM Phase Correct Mode geschaltet. Und in diesem Modus berechnet sich die Ausgangsfrequenz anders (siehe Datenbuch für den jeweiligen Controllertyp im Kapitel über 8-bit Timer bzw. 16-bit Timer). Dort gibt es auch die Berechnungsformel(n) für die Ausgangsfrequenz.
Die Ausgangsfrequenz ist beim Arduino erst einmal fest vorgegeben durch den Takt von 16 MHz, den Vorteiler von 64 und die Betriebsart der PWM-Erzeugung (wie erwähnt, in Funktion init() gesetzt) und kann nur geändert werden, wenn man selbst die Timer umprogrammiert. Das könnte/wird aber andere Funktionen wie millis() oder Verwandte durcheinanderbringen, die auch den Timer für ihre eigenen Zwecke mitbenutzen.
Man sollte das "Boot-Loader-OS" auch nicht überschätzen. Zwischen Milli-Sekunde 1 und Milli-Sekunde 2 hat das Sketch auch etwas zu tuen. ( Z.B. Variablen vergleichen, Integer zählen etc. )
Gollywog der Bootloader auf dem Arduino ist bein Betriebsystem. Der Booloader wird nach einem Reset oder beim Einschalten aufgerufen und kontrolliert, ob eine Anfrage besteht, einen kompilierten Sketch zu übertragen (upload) Falls dies nicht der Fall ist, springt er zum gespeicherten Sketch. Der Bootloader wird von diesem Moment an nicht mehr aufgerufen.
Darum kann ein ATmega auch ohne Bootloader funktionieren wenn man den kompilierten Sketch über ISP hinaufläd.
Alle setup / initialisation der internen Register/Timer werdem im kompilierten Sketch vorgenommen.
Viele Grüße Uwe
und das noch:
diese Pulsweiten-Geschichte ist lt. Beschreibung in Hardware realisiert, d.h. einmal mit der "analogWrite(PinNr, Wert)" angestossen/ausgeführt, läuft sie automatisch weiter, ohne dass sich irgendeine Routine weiter darum kümmert oder auch am "sich zur rechten Zeit kümmern" gehindert würde...