3 pwm Ausgänge

Neuuser

Mitglied
11. Aug. 2008
465
0
16
Sprachen
Hallo,
War schon lange nicht hier, aber hoffe doch auf eine Antwort :eek:
Wie bekomme ich mindestens 3 Ausgänge auf ein PWM das ich über ein Poti regeln kann, hat jemand so etwas schon gemacht oder gebraucht ?

Gruß Neuuser
 
Hallo Neuuser,

das geht eigentlich mit sehr vielen AVRs. Du benötigst einen AVR mit ADC und Timern welche OutputCompare unterstützen. Für schnelle und hochauflösende PWM, sind die AT90PWM geeignet. Am besten du schaust einfach mal in ein Datenblatt eines AVRs im Kapitel Timer0 oder Timer1, dort die PWM-Erzeugung.

Grüße,
Dirk
 
Hallo Dirk,
ich habe schon ein Programm zusammengestellt auf Hardware seitig mit ein Mega8, was nur auf pinb.3 eine PWM ausgibt, aber ich bekomme es nicht wirklich hin das ich 3 Ausgänge in gange bekomme.

Gruß Neuuser

Code:
$crystal = 8000000
$framesize = 32
$swstack = 32
$hwstack = 32

Dim Ad As Word
Dim Poti As Word
Dim Start_1 As Single
Dim Anfang As Single
Dim Ende As Single


Config Pinb.3 = Output
Config Pind.7 = Output
Config Pinb.1 = Output                                      '

Config Timer2 = Pwm , Pwm = On , Prescale = 1 , Compare Pwm = Clear Down

Start Timer2

Pwm_value Alias Compare2

Enable Timer2
Enable Interrupts

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Start Adc


Do
Ad = Getadc(0)
Poti = Ad / 4
If Poti > 255 Then Poti = 255
Pwm_value = Poti                                            'Portb.3 is pwm output


Loop
Do
 
Hallo Neuuser,

der Timer2 ist ein 8Bit-Timer und hat ein OutputComparePin (OC2, PB3). Zwei weitere OutputComparePins verfügt der 16Bit Timer Timer1 (OC1A an PB1, OC1B an PB2). Wie man die OutputCompare-Funktion allerdings mit BascomAVR aktiviert, weiß ich leider nicht, da ich mich mit Bascom nicht so auskenne :hmmmm:

Grüße,
Dirk
 
Grundlagen zu PWM

Hallo Neuuser,

zunächst hätte ich gerne mit Dir die Frage geklärt, ob Dir prinzipiell das Verfahren der PWM geläufig ist und klar ist wie es funktioniert.

ich bin vor einiger Zeit mal über einen Link gestolpert der eigentlich ganz gut erklärt, wie PWM funktioniert und was dazu zu beachten ist.
Der Link ist : http://www.roboternetz.de/wissen/index.php/Bascom_und_PWM

Grundsätzlich kann ich Dir sagen, dass BASCOM nicht alle PWM-Features unterstützt die der Mega kann. Ein Beispiel hatten wir kürzlich bei Thomas (Knickohr). Wir wollten für einen Drucksensor einen 32,xxx kHz Clock (Uhren-Clock) erzeugen und das ging mit den Bordmitteln von BASCOM nicht. Hier war es notwendig in Assembler die Einstellungen und Initialisierungen durchzuführen.

Doch lass uns einfach am Anfang anfagen und am Anfang war das Funktionsprinzip der PWM. Wenn das klar ist können wir uns als nöchstes direkt mit dem Device, den PWM-Möglichkeiten und dann der Umsetzung auseinandersetzen. OK?

Grüße,
Markus
 
Hallo Markus, hallo zusammen.

BASCOM hat so seine Macken. Es werden halt schlicht und einfach nicht alle Features der AVRs unterstützt. Ist aber kein Beinbruch, man kann in BASCOM auch ein bißchen ASM einbauen.

Ein Beispiel, der berühmt berüchtigte 32,...khz Software-Oszillator :

' Timer3, Fast-PWM (Mode 15), Prescale = 1, variable Frequenz, Tast 1:1, OC3A -> ca. 32.768Hz
Tccr3a.7 = 0 ' COM3A1
Tccr3a.6 = 1 ' COM3A0
Tccr3a.1 = 1 ' WGM31
Tccr3a.0 = 1 ' WGM30
Tccr3b.4 = 1 ' WGM33
Tccr3b.3 = 1 ' WGM32
Tccr3b.2 = 0 ' CS32
Tccr3b.1 = 0 ' CS31
Tccr3b.0 = 1 ' CS30
Ocr3ah = 0
Ocr3al = 120
Enable Timer3

Im Prinzip muß man nur die entsprechenden Register füllen, das wars ;)

Und hier ein kleiner Bug-Fix, damit RC5-Decodierung auch mit dem Atmega1281 + Atmega2561 funktionieren :

$asm ' Wichtig, damit der Getrc5 beim Atmega1281 mit Timer0 funktioniert !
.equ Timsk = Timsk0
$end Asm

Prinzipiell ist es immer besser, zurück zu den Wurzeln zu gehen. Offensichtlich geben sich die Entwickler der BASCOM-Software nicht sooo große Mühe, was in den entsprechenden ...def.dat's zu erkennen ist. Teilweise heilloses "Cut & Paste".

Thomas
 
Hallo Markus,
zunächst hätte ich gerne mit Dir die Frage geklärt, ob Dir prinzipiell das Verfahren der PWM geläufig ist und klar ist wie es funktioniert

ich sage nun mal ja, ein wenig schon.
diese Seite kenne ich, das ist so, ich kann mir alles durchlesen, aber so richtig kommt da nicht bei raus, verstehen werde ich es nur wen ich damit anfange es zu machen und probiere, danach kann ich noch mal lesen und dann entstehen Bilder ;)
Knickohr, mit deinen Code komm ich garnicht zu recht mit Timer 3 kenne ich auch nichts.
Mal anders gesagt, ich wollte mit 3 PWM Ausgänge einen Brusles Regler versuchen, ich weiß das ist nicht einfach, was nicht so gehört habe, aber wen ich es nicht versuche werde ich es nicht raus finden , hinschmeißen kann ich es immer noch.

Gruß Nuuser
 
Hallo,

nun ja, dann mal schnell angepaßt an den Timer1 :

' Timer1, Fast-PWM (Mode 15), Prescale = 1, variable Frequenz, Tast 1:1, OC1A -> ca. 32.768Hz
Tccr1a.7 = 0 ' COM1A1
Tccr1a.6 = 1 ' COM1A0
Tccr1a.1 = 1 ' WGM11
Tccr1a.0 = 1 ' WGM10
Tccr1b.4 = 1 ' WGM13
Tccr1b.3 = 1 ' WGM12
Tccr1b.2 = 0 ' CS12
Tccr1b.1 = 0 ' CS11
Tccr1b.0 = 1 ' CS10
Ocr1ah = 0
Ocr1al = 120
Enable Timer1

Alles klar ? ;)

Funktioniert prinzipiell an allen 16-bit Timern. Doch Vorsicht, das obige Register-Schreiben, Code kann man es nicht nennen, dient nur zur Erzeugung eines 1:1 32,... kHz Signals. Ist also für PWM nicht brauchbar, da müssen die Register anders gefüllt werden. Schau mal ins Datenblatt das AVRs.

Thomas
 
PWM's

Hallo Neuuser,

ich hänge Dir hier mal ein BASCOM Source-File an das ich vor ca. 1 Jahr geschrieben habe weil ich mit einem Timer zwei PWM's realisieren wollte. Es ging mir damals um die Regelung einer Hinterrgundbeleuchtung für mein LCD-Display als auch für eine Geschwindigkeitssteuerung für einen Lüfter.

Da meine Ressourcen knapp wurden musste ich beides mit einem Timer rechnen. Ich habe dazu den 16-Bit Timer3 des Mega128 verwendet. Im Mega8 hast Du auch einen 16-Bit Timer, nämlich den Timer1. Mit Ihm solltest Du zwei PWM's gleichzeitig realisieren können.

Die 3. PWM erzeugst Du durch geeignete Konfiguration des Timer2 (8-Bit-Timer).

Mir ist noch nicht ganz klar was Du genau wie realisieren möchtest und wie das PWM-Signal genau aussehen soll was Du benötigst. Grundsätzlich würde ich aber zunächst sagen, dass 8-Bit Auflösung für sehr viele Probleme reicht. ggf. kannst Du noch eine kleine Schaltung an die PIN's hängen mit der Du über eine Art Glättung eine entsprechende "Gleichspannungs" erzeugst.

Lange Rede kurzer Sinn, in meinem Beispiel findest Du die Konfiguration für 2 PWM's mit einem Timer und der andere ist schnell dazugenau. Lass Dich durch den überflüssigen programmcode nicht beirren, ich hatte nur mangels Zeit keine Lust zum "aufräumen" :D

Grüße,
Markus
 

Anhänge

  • PWM.bas
    15,1 KB · Aufrufe: 50
OK, danke euch beide für die Code, werde es versuchen mal was daraus zu machen, wen es aber nicht klappt, werde ich bestimmt was dazu lenen.:D

Gruß Neuuser
 
Wiso macht ihr denn nicht Software-PWM?

Hallo ts230,

anscheinend möchte neuuser einen brushless DC Motor ansteuern, da benötigt man höherfrequente PWM, am besten oberhalb des vom Menschen wahrnehmbaren Hörbereichs, also ab etwa 16kHz. Vernünftig zu machen, ist das nur über die Hardware des AVR. Aber ansonsten hast du natürlich recht, Software-PWM gibts natürlich auch noch.

Grüße,
Dirk
 
Hi alle,

Mir ist noch nicht ganz klar was Du genau wie realisieren möchtest und wie das PWM-Signal genau aussehen soll was Du benötigst.

@Markus : sieh dir mal den Teil von Neuuser an ...

Mal anders gesagt, ich wollte mit 3 PWM Ausgänge einen Brusles Regler versuchen, ich weiß das ist nicht einfach, was nicht so gehört habe, aber wen ich es nicht versuche werde ich es nicht raus finden , hinschmeißen kann ich es immer noch.

Wenn ich das richtig verstehen und die Textfehler interpretiere, möchte er
einen Regler für einen 3-Phasen-Brushless-Motor bauen. Sehe ich das richtig?

Wird aber ein harter Weg werden. So ein Motor benötigt eine Ansteuerung
mit einem phasenverschobenen Signal - auf hochdeutsch : Drehstrom.

Gruß
Dino
 
Hallo,

ja und genau deshalb wird er auch die PWM nehmen. Man muß nur aufpassen, das die PWM gleich laufen. In diesem Fall wäre ein Timer mit 3PWM-Ausgängen ideal, den man phasenverschoben konfiguriert.

Der Timer3 im Atmega1280, 1281, 2560, 2561 macht das z.B. Wie schon geschrieben, mal das Datenblatt unters Kopfkissen legen ;)

Thomas
 
Wird aber ein harter Weg werden. So ein Motor benötigt eine Ansteuerung mit einem phasenverschobenen Signal - auf hochdeutsch : Drehstrom.

Hi Dino,

ja, dafür wäre eigentlich ein DSP oder ein entsprechend ausgestatteter Mikrocontroller erforderlich. Es kommt auch auf den Motor oder die Anwendung drauf an. Wenn die Drehzahl nicht so niedrig ist, reicht eventuell dreiphasige Blockkommutation und dann gehts auch mit einem AVR.

Naja, die AT90PWM haben in Sachen PWM noch mehr Features als ATmega. Wir haben sogar ein BLDC-Development-Kit im Shop (AVRMC100), das ist aber wahrscheinlich nichts für Hobbyisten ;)

Grüße,
Dirk
 
Hi Thomas,

ja und genau deshalb wird er auch die PWM nehmen. Man muß nur aufpassen, das die PWM gleich laufen. In diesem Fall wäre ein Timer mit 3PWM-Ausgängen ideal, den man phasenverschoben konfiguriert.
Das funktioniert aber nur, wenn er die PWMs nicht über einen bestimmten
Wert steuert, weil ihm sonst die Phasensignale für die 3 Spulen verloren
gehen.

Er muß ja eigentlich mit den 3 PWMs einen 3-Phasen-Wechselstrom erzeugen.
Es muß also bei jeder Umdrehung des Motors der volle Wertbereich jedes
PWM-Kanals einmal hoch und einmal runter durchlaufen werden und das
bei allen 3 PWM-Kanälen mit 120Grad Phasenverschiebung. Au hauerha :D
Denn mal viel Spaß beim programmieren :rolleyes: Hätte ich keine Lust dazu.
Außerdem muß es ja noch mit dem Motor synchronisiert werden, damit das
Drehfeld zur aktuellen Stellung des Rotors paßt (je nach Lastsituation)
Für sowas gibt es Hardware-Bausteine die extra dafür genaut sind. :D
Die messen - glaube ich - über die Motorspulen auch noch die aktuelle
Stellung des Rotors und regeln danach die 3 Phasen-Signale.

Gruß
Dino
 
Hi Thomas,

Hört sich nach "Grundlagenfoschung" an ;)
Na denn wollen wir doch mal forschen :D
Man wächst an seinen Aufgaben ;)

Ich laß mich mal überraschen, was da raus kommt ...
Das wird bestimmt interessant. Irgendwo hab ich auch noch nen
Grundlagenartikel in ner elektor über Brushless-Motoren. Im
Notfall kann ich ja mal sehen wo der ist und nen bischen stöbern :)

Gruß
Dino
 
Kann mich hier Neuuser nur anschliessen suche auch nach einem solchen Regler.Der solte auf jedenfal Rotorlage überwachen und Drehzahlregelung haben. Ein guter ansatz währe Uli Huber (UHU) Kontroller zumindest für die Hardware ein guter ansatz nur die SW fehlt jezt noch und mann müsste schauen ob nicht doch ein AT90PWM besser dafür währe.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)