PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Phasenkorrekte PWM mit Hochbefehlen



Murus
11.09.2005, 18:32
Hallo zusammen,

in meinem Buch wird die Erzeugung einer Phasenkorrekten PWM nur per Register-Anweisungen gezeigt. (Mit Timer1 Auf PB1)

Gibts dafür auch Bascom-Hochbefehle? Ich komm net so ganz draus, wo man die Zählwerte setzt etc.

Herzliche Grüsse
Mario

Murus
11.09.2005, 22:10
Also, hab mal etwas im Datenblatt gewühlt. Der Timer1 hat im PWM-Modus ja zwei Werte, die man setzen kann. Wenn er an denen vorbeirauscht, löst er den Interrupt aus.
Nur: Wieso macht er das mit zwei Werten? Einer würde doch reichen... (Er zählt doch hoch und runter, oder, beim 8-Bit von 0-255, dann von 255-0, oder??)
Wieso zwei Werte? Geht das net auch mit einem?
Wie geb ich dem das genau ein?
Config Timer1=PWM, Prescale=1, und weiter??

Herzliche Grüsse
Mario

Marco78
11.09.2005, 22:28
Welche zwei Werte? Kannst du das Datenblatt mal zitieren?

Murus
11.09.2005, 23:25
Ich zitiere aus der Bascom-Hilfe:

And the Timer can be used in PWM mode.
Man kann zwischen 8,9 und 10Bit Auflösung wählen.
Man kann auch sagen, ob er nach einem "match to the compare registers" hoch oder runterzählen soll.
Note that there are 2 compare Registers A and B
Config Timer1= PWM, PWM=8, Compare A PWM= Clear Up, Compare B PWM= Clear down
To set compare registers:
Compare1a=100
Compare 1b=200

Zitat Ende

Nun: Was bedeutet das alles?? Wie funktioniert diese PWM?

Herzliche Grüsse
Mario

Marco78
11.09.2005, 23:34
Compare1a=100
Compare 1b=200

Sind das die beiden Werte die du meinst?
Jeder Wert ist für einen der beiden Ausgänge ;)
Da du bis jetzt noch nicht geschrieben hast um welchen AVR es sich handelt musst du dir selbst die Arbeit machen und suchen welche Pins das sind :P
Bezeichnet sind sie mit OC1a und OC1b

Murus
12.09.2005, 00:00
Ahaaa, so is dat gemeint!! Ahaa, der kann also zwei PWMs gleichzeitig auf zwei Pins ausgeben... Hab übrigens nen ATmega8...:)
Asooo....
Im 8Bit Modus zählt er also von 0 bis 255 und wieder runter. Und immer wenn er über einen der Werte rauscht, toggelt er den jeweiligen Pin..... Bei 10 Bit kann man die PWM am höchsten auflösen, oder?

Nur: Wie schreibe ich das jetzt korrekt?
Config Timer1=PWM, PWM=8, und jetzt? Was heisst dieses Clearup/Clear down??
Geht das nicht irgendwie einfacher? Mit nur einem Pin? Und wie invertiere ich? (er soll beim erreichen des Wertes den Pin nicht H sondern L und umgekehrt schalten....)


Herzliche Grüsse und vielen Dank

Mario

Marco78
12.09.2005, 00:13
Geht das nicht irgendwie einfacher? Mit nur einem Pin?

Entweder einen anderen Timer benutzen oder einfach nur einen Pin der zwei benutzen. Es zwingt dich ja niemand, OC1b auch zu verwenden.

Beim zweiten Problem kann ich dir nicht helfen. Mir ist es egal ob er von H auf L oder von L auf H schaltet. Sorry

Murus
12.09.2005, 11:00
Ok, hier im Forum hat einer noch eine Anleitung hinterlassen, da steht alles drin!

Also, PWM kann ich jetzt erzeugen.
Jetzt möchte ich ein Servo in Mittelstellung halten. Dafür brauch ich 20ms Pause zwischen den 1.5ms-Pulsen.
Nur: Wie mach ich dat jetzt mit dem Timer1 auf PWM-Modus?
Ich benutze den internen 1-Mhz-Oszi....
Der macht mir 1 000 000 Schritte in der Sekunde.
D.H. 20ms dauern 20000 Schritte, oder?
Und die 1.5ms dauern 1500 Schritte...
Hmm, also müssen wir die Frequenz teilen, zu viele Schritte, oder?

Waaaah, wie mach ich das alles??

Herzliche Grüsse
Mario

Rage_Empire
12.09.2005, 12:54
Hm, gibt auch den Befehl "Pulseout"

Schon mal angeschaut?

Murus
12.09.2005, 14:12
Nützt mir als Lerneffekt nix....
Ich möchte per PWM mit Timer1 (und nur so) ein Servo ansteuern. Hab aber irgendwie das Problem mit der Beziehung ms und den Takten....
Wie mach ich das? (alle 20ms den 1.5ms Puls)

Greets
Mario

Rage_Empire
12.09.2005, 14:33
das macht man glaub ich nicht mit PWM. Timer auf 20ms setzten und im Interrupt Pulseout....auf 1,5ms. Einfacher als mit PWM.

Murus
12.09.2005, 15:18
Aaaaaaargh!!!!! Ich WILL es mit PWM machen! Ich weiss selber, dass es tausend andere Wege gibt.... hab ich aber oben schon gesagt!
Ich krieg einfach die Überleitung von ms zu Takten nicht hin....
Wie kann ich die PWM einstellen, damit sie mit 1000000Mhz 1.5ms Pulse macht, und das alle 20ms.... Es geht um das Verständnis, nicht um die Methode.

Herzliche Grüsse
Mario

Rage_Empire
12.09.2005, 15:24
1000000Mhz? Wow!!!!!....den AVR will ich auch....is ja besser als intel und amd zusammen :D

Es gibt ein Berechnungsprogramm, welches du im Downloadbereich findest, welches dir die Zahlen und Prescaler ausrechnet.

Murus
12.09.2005, 15:39
lol... Meine natürlich Hz...:) Wär aber cool gewesen...
Also das Proggi find ich jetzt partout nich.... Hast du einen Link?
Danke und Gruss
Mario

NumberFive
12.09.2005, 20:04
1/ f = t

1/1000000 hz = 0,000001 sec = 0,001 msec




#define SERVO1 OCR1A
#define SERVO2 OCR1B

// PWM Timmer
SIGNAL(SIG_OVERFLOW1)
{
TCNT1 = 0;

/* configure to set outputs on compare match so we can turn on the
* pulse in the next statement */
TCCR1A |= BV(COM1A1)|BV(COM1A0)|BV(COM1B1)|BV(COM1B0);

/* force compare match to set outputs */
TCCR1A |= BV(FOC1A)|BV(FOC1B);

/* configure to clear outputs on compare match so that the output
* compare function ends the pulse */
TCCR1A &= ~(BV(COM1A0)|BV(COM1B0));
}

void init_servos(void)
{
/* Use Timers 1 generate the pulses for 2 R/C servos; each
* timer can do up to 3 servos. */
/*
* configure OC1A for mode 0: normal, top=0xffff prescale=8 (f~=30):
*
* WGM33=0, WGM23=0, WGM13=0, WGM03=0, CS32=0, CS31=1, CS30=0
*/
DDRD |= BV(PORTD5) | BV(PORTD4);
TCCR1A &= ~(BV(WGM11) | BV(WGM10) | BV(COM1A1) | BV(COM1B1));
TCCR1A |= BV(COM1A0) | BV(COM1B0);
TCCR1B &= ~(BV(WGM13) | BV(WGM12) | BV(CS12) | BV(CS10));
TCCR1B |= BV(CS11);
TCNT1 = 0;
TIMSK |= BV(TOIE1);

/* set all servos to their center positions */
SERVO1 = SERVO_MID;
SERVO2 = SERVO_MID;
}



so sieht mein PWM Servo code aus bei 16 MHz

vielleicht hilft es dir

Murus
12.09.2005, 21:16
In C... :) Verstehe leider kein Wort...
Aber wenigstens das mit der Frequenz und Periode ist jetzt klar...
Nur: Kriegt man das mit 8Bit PWM und 1000000Hz überhaupt genau hin??

Herzliche Grüsse
Mario

NumberFive
13.09.2005, 08:33
8 bit = max 256 = 0,001 msec * 256 = 0,256 msec bis der abläuft.

man bin heute morgen noch nicht so fit mußda nochmal drüber nach denken.

warum c ist auch nicht anders als basic alles nur ne sprache

SIGNAL(SIG_OVERFLOW1)

wird auf gerufen wenn der timmer ab gelaufen ist.
der rest ist der init des Timers.

Neine ich denk das du das PWM nicht mit dem 8bit timer hin bekommst.
Der ist zu schnell

Murus
15.09.2005, 13:17
Ok, dann kann mans so also nur schlecht machen...

Herzlichen Dank für die Info!!

Greets
Mario