PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM Signal mit max. 5MHz



king-sixXx
31.05.2005, 21:02
Hi Leutz!

Ich experimentiere gerade mit dem PWM Signal und hab folgenden Bascom-Code:



$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600


Dim A As Byte
A = 0

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64

Do

If A < 255 Then A = A + 1

Compare1a = A

Waitms 500

Print A
Loop

End


Das Signal scheint von meinem Mega8 erzeugt zu werden, denn die Motoren drehen sich. Doch da sie immer mit voller Geschwindigkeit laufen, denke ich, dass das PWM Signal zu hoch frequentiert ist. Der L293D verkraftet ja nur bis 5 MHz. Wie kann ich das Signal auf die 5 MHz anpassen, so dass ich die Geschwindigkeit steuern kann?

MFG!

rapo
01.06.2005, 15:47
Hi,
versuchs mal, wenn du deine Ausgangsregister setzt...
Also beim mega8: DDRB.1=1 (für OCA1)
und über 5Mhz kann das sig nicht haben, da du nur 4Mhz Takt hast.. 8-[

king-sixXx
01.06.2005, 16:37
Hallo rapo!

Nochmal langsam bitte! Das das Signal nur bis 4 Mhz läuft is jetzt klar :-) aber wo stelle ich diese Ausgangsregister ein?

RCO
01.06.2005, 17:17
Der PWM hat eine Frequenz von 4.000.000/64/256 also ca. 244 Hz.
Da der Pin aber nicht als Ausgang gesetzt ist passiert an ihm auch nix. Deshalb:

DDRB.1=1;

Heißt: im Data-Direction-Register-B (also von Port B) wird Pin 1 als Ausgang fesetzt. "=0" hieße Eingang.

Der Motor müsste jetzt entweder vom stehen innerhalb von ca. 2 Minuten entweder lasam anlaufen, bis zum Maximum oder genau das Gegenteil. Und nach diesen 2 Minuten dann in dem Zustand bleiben (2Minuten und 3 Sekunden ;-))

king-sixXx
01.06.2005, 18:11
Danke für die Hinweise!
Mein Code sieht jetzt so aus:




$regfile = "m8def.dat"
$crystal = 4000000
$baud = 9600


Dim A As Byte
A = 0

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 64

Ddrb.1 = 1


Do

If A < 255 Then A = A + 1

Compare1a = A

Waitms 200

Print A
Loop

End


Der Motor dreht sich auch und ändert ab und zu die Geschwingkeit... Aber das sieht eher willkürlich aus. Wie groß ist denn die Rasterweite bei "Compare1a"? Läuft sie wirklich nur bis 255 oder gehts da noch weiter?

RCO
01.06.2005, 18:27
Die Geschwindigkeit ändern im sinne von mal schneller mal langsamer? Das würde mich sehr wundern!

Ja es geht mehr, Timer 1 hat 10 Bit! Du musst oben statt "Pwm = 8" "Pwm = 10" schreiben, dann werden die 10 Bit des PWMs ausgenutzt, also Werte von 0 bis 1023. Der Mega8 kann mit bestimmten Konfigurationen bis zu 16 Bit, aber keine Ahnung wie das unter Bascom geht ;-)

king-sixXx
01.06.2005, 18:45
Naja es gab einige male ein Rucken des Motors, danach lief er wieder auf volle Leistung....

Mit dem Code möchte ich eigentlich bewirken, dass der Motor immer schneller läuft. Stimmt der Code dafür?

RCO
01.06.2005, 21:45
Naja es gab einige male ein Rucken des Motors, danach lief er wieder auf volle Leistung....

Hm, also er ruckelt und gibt dann vollgas? Er sollte wie gesagt entweder stehen und dann schneller bis VOllgas. UNd Vollgas halten oder genau das Gegenteil tun. SChreibt doch mal bitte statt DDRB... oben über Config Timer1... das hier:

Config Pinb.1 = Output

Sollte das geilche bewirken, aber hier bin ich mir sicherer, dass es klappt, oder schreib einfach DDRB=255.

Häng doch an den port statt der Motorschaltung mal ne LED mit Widerstand und überprüfe was passiert.

Ansonsten weiß ich auch nicht mehr. Überprüf nochmal die Ports, nciht das er an am falschen Pin hängt oder so.

king-sixXx
02.06.2005, 20:29
Also das Ruckeln kam durch einen Wackelkontakt in der Stromversorung. Ist jezt aber behoben!

Der Motor dreht die ganze Zeit auf vollen Touren. Die ersatzweise angeschlossene LED blinkt rasend schnell, sie leuchtet fast ständig...
Wird die Geschwindigkeit überhaupt über das Compare1a gesteuert?

Achja auch die Änderungen bewirken nichts...

RCO
02.06.2005, 21:15
Also das Ruckeln kam durch einen Wackelkontakt in der Stromversorung #-o


Die ersatzweise angeschlossene LED blinkt rasend schnell, sie leuchtet fast ständig...
Hast du die Fusebits richtig eingestellt? Externes Quarz? Kommt am PC was vom AVR im Terminal an? Ein Flackern solltest du bei über 200Hz kaum noch wahrnehmen.

Kann ja nicht sein, das wir den Fehler nicht finden, hab mich scheinbar zu lange nicht mehr mit Bascom beschäftigt. Probier einfach mal den Code hier aus und setz für Compare1a mal andere Werte.


$crystal = 4000000
$regfile = "m8def.dat"

Config Portb = Output

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

Enable Interrupts

Do
Compare1a = 128
Compare1b = 128
Loop

king-sixXx
04.06.2005, 13:38
Die Fusebits sind auf den externen Quarz eingestellt. Und vom PC kommt auch was am AVR an.
Deinen Code habe ich ausprobiert, leider funktioniert es nicht! Ich hab keine Ahnung an was das liegt...

BlooD
19.03.2006, 08:40
Sorry das ich das alte Thema nochmal ausgrabe...


Der PWM hat eine Frequenz von 4.000.000/64/256 also ca. 244 Hz.


die Formel von RCO ist also
Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung)

im Artikelbereich RN-Wissen (https://www.roboternetz.de/wissen/index.php/Bascom_und_PWM) steht:
Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung*2)


was stimmt denn nun?

CodeWarrior
19.03.2006, 13:04
Hi BlooD,


Ja es geht mehr, Timer 1 hat 10 Bit! Du musst oben statt "Pwm = 8" "Pwm = 10" schreiben

Du solltest bei deiner Berechnung auch deine Timer-Auflösung Berücksichtigen....

So wie ich das sehe ist im RN-Wissen ein kleiner rechen fehler. Wenn die Formel stimmt, was ich im Moment nicht sicher sagen kann, sollte sie schon so heißen .... Ausgangsfrequenz = (8000000Hz / 8) / (1024*2) = 488,28 Hz , da der Timer auf 10 Bit steht und 2^10 = 1024 ist :)

Gruß,

CodeWarrior

RCO
19.03.2006, 13:34
Hallo Leute,

also mir ist wohl tatsächlich ein Fehler unterlaufen, vielleicht habe ich mich im Datenblatt verlesen, also folgendes soll das jetzt klatstellen:

Hier der Auszug aus dem Datenblatt:

https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=885

Also da sieht man ja ganz gut, wies berechnet wird.

Also stimmt:


Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung*2)

dennisstrehl
19.03.2006, 13:45
Es kommt auf den PWM-Modus an.
Fast-PWM: Ausgangsfrequenz = (Quarzfrequenz/Prescale) /(Timerauflösung)
Phase&Frequency-Correct-PWM: Ausgangsfrequenz = (Quarzfrequenz/Prescale) /(Timerauflösung*2)

Die Timerauflösung kann man zusätzlich runterdrehen.

RCO
19.03.2006, 14:05
Das wollte ich mit obenstehender Tabelle doch sagen ;-).

dennisstrehl
19.03.2006, 14:19
Du meintest am Ende dass es mit (Timerauflösung*2) richtig sei.
Ist auch egal jetzt.

BlooD
19.03.2006, 16:14
Danke erstmal, aber das wirft nun eine weitere Frage auf :/
Wo ist der Unterschied? Ich hab zwar die betreffenden Stellen im Datenblatt gelesen, aber schlau daraus bin ich nicht wirklich geworden. Vielleicht kanns einer mit einfachen Worten erklären?

RCO
20.03.2006, 00:49
Wo ist der Unterschied?

Du meinst den Unterschied zwischen "normalen" PWM und Fast-PWM.
Naja, man kann mit dem Timer so einiges an "Unfug" anstellen.
Der Fast-PWM ist schneller aber generell ist die Frage was man bruacht, es gibt die Möglichkeit Interrupts auszulösen, Pins entsprechend des PWM-Wertes zu schalten...
Insgesamt bietet der Mega8 16 verschiedene Arten die Timer zu benutzen (Seite 99). Da kann man dann auch mal schauen, was nötig ist.
Soll die Obergrenze variabel sein, soll ein Interrupt ausgelöst werden, soll der PWM möglichst schnell (hohe Frequenzen) sein...

Was genau brauchst du denn?

BlooD
20.03.2006, 13:44
Öhm, ich meinte den Unterschied zwischen
Fast-PWM
und
Phase and Frequency-Correct-PWM


aber ich schau mir die Seite später doch nochmal an.