PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Welcher AVR besitzt wieviele Timer und wie geht PWM



RCO
30.09.2004, 14:11
MeinProblem ist, dass ich über 2 PWMs 2 Motoren steuern will. Gleichzeitig will ich aber noch die Geschwindigkeit messen, dazu benötige ich midestens 1 Timer/Counter, am besten 2. Der AT90S2313 hat amer nur die Timer 1 und 0, wenn ich das richtig sehe. Ansonsten würde ich vielleicht einen MAX, keine Ahnung irgendwas mit 5495 oder so benutzen, das ist ein PWM, den man über SPI ansteuern kann. Dass muss ja nicht umbedingt sein. Ich würde gern mal in eine Tabelle reinschauen, wo alles aufgelistet ist, Ports ADs Speicher etc. gibts sowas für die AVRs?
Und seht ihr noch ne andere Möglichkeit der Problemlösung?

MFg Moritz

30.09.2004, 14:13
Bei Atmel auf der HP. Jeder ATMega kann das geforderte.

RCO
30.09.2004, 15:20
Ja, habs unter http://www.atmel.com/dyn/products/param_table.asp?family_id=607&OrderBy=part_no&Direction=ASC gefunden.

RCO
30.09.2004, 15:23
Wozu dient genau der EEPROM und der SRAM?

D.Stolarek
30.09.2004, 15:37
der eeprom ist da um aufgaben die immer gleich sind zu machen
der ist für die kleinigkeiten die gemacht werden
im sram sind die aufwendigeren progs drin

Kjion
30.09.2004, 15:48
Naja, das stimmt für AVRs wohl nicht so ganz #-o

Das Programm welches der AVR ausführt wird im Flashspeicher gespeichert. Im SRAM werden die Variablen, der Stack usw. gespeichert ( kann beliebig oft wiederbeschrieben werden, allerdings sind die Daten nach dem abschalten weg ). Im EEprom können dann Werte gespeichert werden die man dauerhaft sichern möchte, allerdings kann das Eeprom nur 100.000 mal wiederbeschrieben werden, dann können Fehler auftreten. Daher sollte man die Werte nicht ständig ändern. Es eignet sich eigentlich eher um zum Beispiel Parameter zu speichern die von einem Benutzer vorgeben werden und dann immer wieder benutzt werden sollen...

MfG Kjion

RCO
30.09.2004, 16:51
Jetzt ncohmal Kurz zu dem PWM. ICh hab hier ein Code gefunden, der mir sehr kompliziert wirkt. Ich würde einfach gerne einen Wert z.B. aus einer Variablen namens Wert an einem beliebigen Pin ausgeben. Was kann ich dann alles weglassen?


Const True = 1
Const False = 0

Dim Hi As Byte
Dim Lo As Byte
Dim A As Byte
Dim Phase As Bit
Dim Pattern As Byte ' Bit pattern for display

Pwm Alias Portb.0 ' Modulated Pin

Config Timer0 = Timer , Prescale = 64 ' Rate 244 Hz at 4 MHz Clock

On Timer0 Timer0_isr ' Jump to Timer1 ISR

Config Portb = Output

Enable Timer0 ' Enable the timer interrupt
Enable Interrupts ' Enable Global Interrupt

Lo = 128 ' Initial value for PWM
Phase = True

Do
A = Pind ' Ask for Key
Select Case A
Case &B11111110 : Lo = 0 ' Lo Time short, Hi Time long
Case &B11111101 : Lo = 32
Case &B11111011 : Lo = 64
Case &B11110111 : Lo = 96
Case &B11101111 : Lo = 128
Case &B11011111 : Lo = 160
Case &B10111111 : Lo = 192
Case &B01111111 : Lo = 255 ' Lo Time long. Hi Time short
End Select
Hi = 255 - Lo
Incr Pattern ' Change Bit Pattern
Waitms 100 ' Wait 100 ms
Loop

End

Timer0_isr:
If Phase = True Then
Portb = &HFF ' LED off
Timer0 = Lo ' Reload Timer0
Phase = False
Else

Portb = Not Pattern ' LED on
Timer0 = Hi ' Reload Timer0
Phase = True
End If
Return

Allerdings verstehe ich das alles nciht so ganz.
Was gibt Prescale an?
Warum 244 Hz?
Warum gebe ich dann einen WErt von 0 bis 255 an?
Ich vermute, dass der Timer0 nach der gesetzten Zeit Timer0 = ... einen Interrupt auslöst und dann den Wert wechselt.

Richtig?/ Falsch?

MFg Moritz

30.09.2004, 22:58
@RCO

Wenn Du den Internen EEprom nicht so belasten willst und noch ein paar Resourcen übrig hast könntest Du auch I²C-EEproms nehmen. Die EE 24LCxx gibts meines Wissens nach mit Speichergrößen von 128 Byte bis zu 8kByte. (bei Reichelt ab rund 25C/St)
Mir sind die sogar lieber, weil mir das abspeichern der Daten über diesen "Umweg" auf einen externen Baustein kurioserweise programmiermäßig leichter fällt, als die Internen Speicherzellen zu nutzen. (bin Autodidakt)
Laut Datenblatt sollen diese EEproms !mindestens! 1Million Schreib/Lesezyklen mitmachen.

mfG aus P
der E-Fan

Frank
30.09.2004, 23:55
Aber bevor man auf externes EEprom umsteigt sollte man schon versuchen das interne erst mal voll auszunutzen. Die Handhabung ist eigentlich recht einfach, zumindest in Hochsprachen wie Bascom.
Dort kann man beispielsweise bei der Dimensionierung einfach "ERAM" mit im DIM Befehl angeben. Das war´s schon!
Man sollte halt dieser Variable nicht unbedingt ständig neue Werte zuweisen, mehr ist ansonsten eigentlich nicht zu beachten. 100.000 Schreibzugriffe sind schon eine Menge, ich denke das es nur wenige Anwendungsprogramme gibt wo eine solche Zahl nicht über Jahre reicht.

RCO
01.10.2004, 09:33
Danke für die Antworten, dass ist ja eigentlich ziemlich nützlich, wenn man Daten dauerhaft erhalten kann, um z.B. Messdaten zu speichern, die auch nach einem Neustart noch vorhanden sind. ICh hab mich jetzt nochmal etwas eingelesen, der AT90S2313 hat ja eh nur einen Timer, von daher ist er für meine Zwecke eh nicht mehr geeignet. Zudem unterstützt er kein I2C. Also wäre das mit den Externen EEproms eh nix. ICh werd wohl umsteigen. Frank hat sicher noch nen par Boards auf Lager ;-)

Nun trotzdem nochmal meine Frage. KÖnnte mir jemand Code schicken, indem ein beliebiger Pin als PWM initialisiert wird und dann der Wert einer Variablen ausgegeben, übernommen, oder wie man das auch immer nennt, wird. Außerdem würde ich gerne Wissen, wo die Verbindung, zwischen dem Prescaler, der Hz-Zahl (244 s.Code), und dem Wert 255..0 liegt.

MFG Moritz

RCO
01.10.2004, 12:04
Also gut, ich hab jetzt nichmal etwas rumgesucht und was gefunden, wo Frank schonmal alles erklärt hat.

Der Code:


Config Pind.4 = Output 'Linker Motor PWM
Config Pind.5 = Output 'Rechter Motor PWM
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02 'Prescaler = 8

Dazu hab ich jetzt aber einige Fragen:
1. Warum sind es gerade Pind.4 und Pind.5, ist das Hardwarebedingt, oder könnte man das noch verändern?
2. Diese Anweisung ist mir nicht klar:

Tccr1b = Tccr1b Or &H02 'Prescaler = 8
3. Ich kann jetzt also:

Pwm1a = 0
Pwm1b = 0
einfach setzten, und zwar unabhängig voneinander.

Der AT90S2313 besitzt ja nur einen PWM. Muss ich da Timer0 oder 1 verwenden? Und kann ich trotzdem 2 Ports mit einem Timer ansteuern wegen Pwm1a und 1b?

Bitte um Antoworten [-o<

MFg Moritz

Frank
01.10.2004, 12:21
Hi,

zu Frage 1:
Ja ist Hardware bedingt. Erkennt man an der Pin-belegung im Datenblatt
Hier hilft dir sicher auch folgender Artikel:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=541

2. Diese Anweisung setzt das Register des AVR, das den Frequenzteiler bestimmt. Die genaue Registerbedeutung findet man auch im Datenblatt. Hier wird Prescaler (Teiler 8) festgelegt. Das bedeutet das die Taktrate des Prozessors geteilt durch 8 für PWM genutzt wird.

3. Ja mit diesen Aneisungen kann PWM für die beiden PI´s unabhängig festgelegt werden. Je nach eingestelltem Register von 0 bis 255 oder höher.
Wichtig ist: Durch diese Zuweisung wird nicht die Frequenz verändert sondern nur die länge des High-Pegels pro Periode. Am besten man macht sich eine Skizze um das besser zu verstehen.

Die Frage zum 2313 kann ich nicht so genau beantworten da ich mit diesem nur ganz wenig gemacht habe. Wenn er nur ein PWM hat, kann er auch nur einen PIN ansteuern.

Man kann aber mit Hilfe eines Interrupts und Timers auch PWM-Signale erzeugen. Das ist aber ein umfangreicheres Thema.

Gruß Frank

RCO
01.10.2004, 13:04
Erstmal danke für die Antwort, so langsam versteh ich das.
Aber ich bin manchmal etwas schwer von Begriff.

Und zwar nochmal zum Prescaler:
Mir ist bewusst, dass man einen Zyklus von 255 bzw. 1024 Takten hat. Und entsprechend viele Takte high oder low setzt. Wie lang ist ist aber den nun ein Zyklus? Das hat doch was mit dem Prescaler zu tun, oder. Man verwendet dann vermutlich auch unterschiedliche Prescaler je nachdem was für einen Timer man verwendet.

MFG Moritz

01.10.2004, 13:21
Lies dir mal die verlinkten Tutorials zum Thema AVR usw. durch, das wirst du viele nützliche Informationen finden. Ansonsten hangelst du dich hier doch nur von einer Frage zur nächsten.
Für alle, die Englisch können ist die Timerfunktionsweise auch sehr ausführlich im Datenblatt des jeweiligen MC dokumentiert.

RCO
01.10.2004, 15:27
Also ich hab mir das Manual mal durchgelesen, wenn ich das richtig vertehe, liegt am Prescaler 4 MHz (Quarzfrequenz) an.
Diese wird dann je nach Prescaler geteilt. Ergibt die LÄnge eines Zyklus!
UNd dann nocheinam durch 1024 bzw. 256 je nach Timer geteilt.

Die LÄnge eines 'Taktes' ist also: 4 Mhz/Presacler (z.B. 8 ).
256, bzw 1024 davon ist dann ein Zyklus.
Takt ist kein schöner ausdruck, sorry.

Wenn ich also will, dass das PWM möglichst oft wiederhohlt wird, nehme ich also ein schnelles Quarz (8 Mhz), einen niedrigen Prescaler (8 ) und den 8 Bit Timer (da weniger 'Takte'):

8000000/8/256 = Siganlwiederholung = ca 3,9 Khz Oder?

MFG Moritz

Frank
01.10.2004, 21:12
Die PWM-Frequenz erechnet sich somit
(Quarzfrequenz / Prescaler) /( 2^Timerbits+1) -2

Also wenn du 4 Mhz Quarz mit Prescaler (denk die das Wort Teiler für Prescaler) 8 und Timerauflösung von 8 Bit hast. Dann ergibt sich eine PWM-Frequenz von:
(4000000 / 8 ) / (2^8+1) -2=974 Hz (also Periode 1,03 ms)

Die Formel sieht etwas kompliziert aus, es ist aber nicht so schwierig wie es aussieht. Die Formel berücksichtigt halt das der gesamte Timer pro Periode vor und zurück gezählt werden muss.

Man kann die Fomel etwas vereinfachen:
Bei 8 Bit Auflösung einfach:
(Qurzfrequenz / Prescaler) / 510

Bei 9 Bit Auflösung einfach:
(Qurzfrequenz / Prescaler) / 1022

Bei 10 Bit Auflösung einfach:
(Qurzfrequenz / Prescaler) / 2046

Wenn der Timer nur 8 Bit hat geht natürlich auch nur die 8 Bit Variante.

Im Grunde ist bei vielen Dingen wie der Motorsteuerung die PWM-Frequenz aber nicht allzu wichtig. Ob Du da 2Khz oder 10Khz nimmst, macht keinen spürbaren Unterschied.
Entscheident ist wie lange das Signal in einer Periode (ich halte das noch für den besten Begriff) auf High liegt. Und nur diese Zeit wird mit

Pwm1a = x
oder
Pwm1b = x

bestimmt. Mit X=0 bedeutet das das die ganze Periode kein High Pegel vorhanden ist (Motoren sind aus). Mir X=255 (bei 8 Bit Auflösung) gibts du an das die ganze Periode das Signal auf High sein soll (Motor vollgas).
Am besten man schaut sich das mal in einem Buch mit paßenden Skizzen an, z.B. von Rowald oder Kühnel!

Gruß Frank

RCO
01.10.2004, 21:31
Danke jetzt hab ichs kappiert!
Werde es die Tage dann mal ausprobieren.

Jetzt noch eine Idee, die vielleicht auch schonmal jemand anderes hatte.
Wenn ich einen Servo damit ansteuern will, z.B. so:

1/(4000000/Teiler(16)/510) würde ich auf 20,4 ms kommen.
Wenn ich es richtig verstanden habe, ist es bei Servos entscheidend, wie lang die IMoulsdauer dann ist, also zwischen x und y ms. damit könnte man den Servo also Stufenweise regulieren, oder hab ich das alles falsch verstanden, und kann nur entweder Voll Vorwärts, oder voll rückwerts?

MFg Moritz

Frank
01.10.2004, 21:43
Also mit PWM kannst du Servo garnicht ansteuern, das Signal ist zu unterschiedlich.

Für Servos brauchst du nur den Befehl Servo in Bascom zu nehmen :-)
Schau mal in der Help nach CONFIG SERVO
Sowas macht Bascom doch mit links ;-)
Da kannst du jeden beliebigen Port für nehmen, sogar bis zu 10 Servos lassen sich ansteuern. Das hat aber nix mit mit PWM zu tun. PWM ist ja im Grunde nur eine analoge Ausgangsspannung (vereinfacht gesagt).
Allerdings wenn du den Servo Befehl nutzt, dann darfst du einen Timer nicht mehr nehmen, steht auch in der Help

RCO
02.10.2004, 15:44
Ja danke, dann werd ichs so machen, wäre dann tatsächlich einfacher.
Danke für die Antworten, ich denke ich habs jetzt kappiert, brauche nur etwas Zeit, um wieder zum testen zu kommen.

MFg Moritz

Roberto
29.10.2004, 20:15
Hallo Leute (Bin neu hier :-)
Tolles Forum :-)

Habe diesen Beitrag interesiert durchgelesen und verstehe ihn ja auch fast.
Aber mir ist leider noch nicht ganz klar, warum 2*255 (510)
(Habe da einen Mega8 und probiere mit Timer1--> PWM)


Wenn ich z.B. einen wert für Compare1a nehme mit: 10
(Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 1)
habe ich am Osci einen kurzen High-Impuls am Anfang der Periode nach oben und dann bis zum Ende der Periode ,Low.
Wenn ich es mit 250 mache:
Einen langen High und ganz kurz Low.
Bei 255, immer High.
Also dürfte es nur bis 255 gehen.
Wie kommt man aber auf 510 ???

Die Formel mit Q/Perioden-Breite (8bit)/ Prescaler/510 muss stimmen, weil die Frequenz nach dieser Formel rauskommt..?! (am Pin)
Aber wo sind die zweiten 255 ?

m.f.G. Roberto

schnuppel
30.10.2004, 01:32
Hallo,



Aber wo sind die zweiten 255 ?


bei PWM kann man 8,9 oder 10 Bit einstellen.
Also sozusagen die Auflösung.
Mit 8 Bit kann man 2^8 = 256 Zustände darstellen.
Also 0 bis 255.
2^9=512
2^10=1024

Daher die Werte.
Ich hoffe deine Frage richtig verstanden zu haben.

mfG schnuppel

Roberto
30.10.2004, 04:51
Hallo schnuppel

Nicht ganz. ;-)

Weiter oben wird immer mit 510 gerechnet.
Also Quarz/Auflösung/Prescaler/510

Von meiner Logig her würde ich eher so rechnen:
Quarz/Auflösung/Prescaler/255 (256)

Weil ich mein PWM Signal nur bis 255 geht
(Signal am Osci)
Also bei 255 (Compare1a) ist schon immer High im Signal

Wenn ich aber die Frequenz am Ausgang messe , passt aber nicht meine Formel sondern die mit 510 ?!?!?

Irgendwo habe ich gelesen, dass der Zähler vorwärts und dann rückwärts zählt.... kann mir davon aber kein Bild machen :-(

m.f.G. Roberto

schnuppel
30.10.2004, 15:51
Hallo,



Nicht ganz. ;-)

Irgendwo habe ich gelesen, dass der Zähler vorwärts und dann rückwärts zählt.... kann mir davon aber kein Bild machen :-(


ja, richtig, so wie ich das verstanden habe, zählt er einmal hoch und dann wieder runter. Beim Erreichen des Vergleichwertes wird der Ausgang dann umgeschaltet. Desterwegen 2mal der Wert.

Ich versuche mal ein Bild hier anzuhängen.
Hoffe doch daß ich nicht totalen Mist erzähle.

mfG

Roberto
30.10.2004, 20:26
mhhhh...

Ist der Compare-Wert dann die Senkrechte Achse ?!
------------------
Mein Beispiel:
$crystal = 4000000

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 1

Do
Compare1a = 30
loop
-----------------

Wenn ich mit 30 Propiere habe ich so ca. ein Tastverhältnis von ; 1:8
(am Osci)
1 Teil High, 8 Teile Low

Wenn ich : Compare A Pwm = Clear up nehme, Wird das Signal inevertiert.... dann würde es deiner Grafik ähneln.

Dann wird vermutlich auch die Schräge, die 255 sein und nicht die Senkrechte ?!

Sehe ich das richtig ?!
Gibt es dazu wo Grafiken , Infos ? vielleicht in Deutsch ?
Bin noch neu hier und muss erst das ganze Forum noch durchschauen ;-)

m.f.G. Roberto

schnuppel
30.10.2004, 22:22
Hallo,



Ist der Compare-Wert dann die Senkrechte Achse ?!
....
Dann wird vermutlich auch die Schräge, die 255 sein und nicht die Senkrechte ?!


halte dich jetzt nicht so an dem Bild fest, ich dachte nur ein Bild ist besser als soundsoviel Worte. ;-)
War nur als Prinzip gedacht.
Die Schräge von 0 zu max. und wieder runter nach 0 soll den Zählerstand verdeutlichen.
Für max. kannste du 8, 9, oder 10 Bit einsetzen.
(also 255, 511, 1023)
Der Vergleichswert ist nur als Beispiel, senkrecht unter "Comparewert".
Bei anderen Werten verschiebt sich der senkrechte Strich halt nach links oder recht.
Aber bitte wenn der linke nach rechts, dann der rechte nach links.
:-)
Und umgekehrt.
Wichtig ist nur, daß der Ausgang bei Erreichen des Comparewertes umschaltet.
Ob er nun wie im Bild von High nach Low oder umgekehrt schaltet, habe ich jetzt nicht parat.
Es sollte nur das Prinzip erklären.

Es wird bestimmt jede Menge Infos noch im Netz geben, muß man halt nur finden mit den richtigen Stichwörtern.
Grafiken habe ich selber auch noch nicht gefunden, aber Suchen ist auch nicht grad meine starke Seite. :-)

Hoffe habe mich verständlicher ausgedrückt.

mfG schnuppel

Roberto
31.10.2004, 00:31
Hallo Schnuppel

Ja, danke, ich glaube, jetzt kapiere ich es.. :-)
(mit was hast Du die Grafik gezeichnet ? )
Eigentlich könnte man den Comparewert auch auf der senkrechten auftragen (max. oben) und dann eine Wagrechte rüberziehen.(z.B. 150)Überrall wo diese Linie, die Schräge schneidet, schaltet der Ausgang dann.
Stimmt das so ..?
(möchte das Grafisch korrekt aufarbeiten ;-)

schnuppel
31.10.2004, 01:10
Hallo,



(mit was hast Du die Grafik gezeichnet ? )
Eigentlich könnte man den Comparewert auch auf der senkrechten auftragen (max. oben) und dann eine Wagrechte rüberziehen.(z.B. 150)Überrall wo diese Linie, die Schräge schneidet, schaltet der Ausgang dann.
Stimmt das so ..?
(möchte das Grafisch korrekt aufarbeiten ;-)

gezeichnet mit MSPaint oder wie das heißt, das Teil was es schon bei win2.0 oder so gab.
Ja, klar, trage auf der Y-Achse deinen compare ein, gehe waagerecht rüber, bei beiden Schnittpunkten senkrecht runter und du hast die Umschaltpunkte.
Zeige deine Grafik dann hier, freuen sich bestimmt einige Ansichten. :-)

Viel Spaß noch schnuppel

raptor_79
25.02.2005, 16:20
hallo

man rechner 0-255
das sind 256 stufen...weil, 0 auch eine ist.