Forum: Mikrocontroller und Digitale Elektronik pwm mit verschiedenen Frequenzen.


von Chabah C. (Firma: .......) (chabah)


Angehängte Dateien:

Lesenswert?

Hallo an alle,
Ich  habe ein atmega32 und möchte damit pwm  mit laufenden Frequenzen in 
höhen Bereichen  mit kleinen Schrittweisen erzeugen. So zu sagen : pwm 
angefangen mit 200Khz bis 1Mhz mit 10 Hz Sprung.
Meine Frage ist:
 Geht das überhaupt?
Ich  habe folgendes code geschrieben, laüft ,aber Sprung in diesem Fall 
ist sehr Grob mit Khz bereiche.
1
#include <stdio.h>
2
#include <avr/io.h>
3
 #include <util/delay.h>
4
#include <avr/interrupt.h>
5
#include <stdint.h>
6
#include <stdlib.h>
7
 
8
int main()
9
{
10
uint16_t F;
11
DDRD = (1<<PD5); //SETZE OC1A ALS AUSGANG IN PD5
12
TCCR1A = (1<<COM1A0)|(1<<COM1A1)|(0<<WGM10)|(1<<WGM11);  //mit COM1A1 NICHT-INVERTIEREND PWM(S.108, T.45)
13
TCCR1B = (1<<WGM12)|(1<<WGM13)|(1<<CS10)|(0<<CS12); //cal CS10 bedeutet no Presing) --> clk/1 (S.110, T.48)
14
 for (F= 200000;F< 1000000; F=F+10){
15
ICR1 = (16000000/F)-1; //Der Zähler zählt bis zu diesem Wert: f=(f_cpu/N*(1+ICR1))
16
17
OCR1A = ICR1/2; //Dutycycle 50% 
18
if (TCNT1>ICR1){
19
     TCNT1 =0;
20
}
21
}
22
 while(1);
23
 }
Ich freue mich auf eine Antwort.

von Karl H. (kbuchegg)


Lesenswert?

(Eine etwas bessere Code Formatierung wäre hilfreich)
1
 uint16_t F
2
3
 for (F= 200000;F< 1000000; F=F+10){

und du denkst wirklich, dass 100000 in einem uint16_t Platz hat?

von Barny (Gast)


Lesenswert?

>und du denkst wirklich, dass 100000 in einem uint16_t Platz hat?
Wieso?
100000 hat doch in einer 16 Bit Variable Platz.
Und zwar 1,526 mal ;)

von Mike (Gast)


Lesenswert?

Genau Herr Einstein!

2^16 = 65.536 < 100.000

von Matthias L. (Gast)


Lesenswert?

>100000 hat doch in einer 16 Bit Variable Platz.

Andersrum. Eine 16Bit-Varaible hat 1,5.. mal in 100k Platz.

von Chabah C. (Firma: .......) (chabah)


Lesenswert?

2^16 = 65 536

Also in meinem Versuch habe ich höhere Frequenzen bekommen, etwa bis 700 
Khz und mehr ,,ich glaube die 16 bits stehen für was anders (was ich 
nicht weiss)..

Aber zurück auf meine Frage..

hat jemend eine Idee mit dem 10 Hz Sprung in höhen 
Frequenzen????...wobei es bei kleinen Frequenzen von 10 Hz bis 1 Khz 
sprung war immer klein und akzeptable ..Bei höhen kommt man auf Sprung 
mit 10 Khz pro Schritt..und das ist schlimm für mich,,,

von Michael M. (Gast)


Lesenswert?

naja, gehen wir mal von einer software-pwm aus.
nachdem du nichts zu deiner gewünschten auflösung der 1MHz pwm sagst, 
geh ich einfach mal von handelsüblichen 8 bit aus.
du hättest also zum setzen des Pegels (1/1MHz)/2^8 = 3,9ns zeit.
sagen wir mal, du brauchst (und das ist realistisch angenommen) 50 
befehle für setzen, sprünge, verzweigung, usw...
dann müsste deine MPU (bei CPI=1) mit mindestens 12,8GHz laufen.

mal schaun, wie viel bit bei der pwm dein atmel mit den 50 instruktionen 
und der maximalen taktfrequenz von 20MHz schafft: ich komme auf 2^x = 
0,4. das könnte wohl ein problem werden...


okay, die pwm vom atmel zu erzeugen, wird also "schwierig". naja, das 
kann man ja mit externer logik oder einem FPGA oder CPLD noch 
hinkriegen.
schauen wir uns den 1MHz takt mal an, der dazu nötig ist. 10Hz passen in 
1MHz recht genau 100000 mal rein. das ist also die zahl der werte, die 
dein atmega als takt ausgeben können muss. hier reichen nicht mal mehr 2 
8bit-register, sondern es braucht 3. bis man das in einer 8bit struktur 
zusammengesetzt hat, ist doch deine zeit für das setzen längst 
abgelaufen.

von sam (Gast)


Lesenswert?

ICR1 ist auch nur ein 16 bit register.
und dein F ist nicht f(Frequenz)  sondern T (periodendauer 1/f)
d.h. eine die Frequenz ist umgekehrt proportional zur Periodendauer.
d.h. wenn du eine änderung um 10Hz anstrebst musst du T auf 1/(f +/- 10) 
setzen ... wobei du T nur in 50ns schritten angeben kannst.
d.h. es ist schon ab ca. 13 kHz nicht mehr möglich die frequenz um 10Hz 
zu erhöhen, weil diese Frequenzdifferenz unter der Auflösung der 
Periondendauer von 50ns liegt.

ich gehe hier von den schnellsten AVR's mit 20MHz aus z.b. ATMega48

von Chabah C. (Firma: .......) (chabah)


Lesenswert?

Vielen Dank erstmal für die Vorschläge...
ich werde erst die   FPGA bzw CPLD recherchieren..dann sage ich 
bescheid..

von chabah (Gast)


Lesenswert?

ok...ich bin wieder da...
also so weit habe ich   FPGA bzw CPLD angegukt..was ich verstanden habe:
CPLD  kann man nicht mit c programmieren, FPGA  schon...

Ich möchte auf jedem Fall mit c weitermachen..

hat jemend ein konkrettes Beispiel für mich...welches Bauteil ist 
nötig..ob ich das an den µc erweitern ??

oder wie sieht den Aufbau für mein Ziel aus??

ziel ist :--> pwm erzeugen mit verschiedenen Frequenzen: 200Kh-1Mhz mit 
Schrittweise 10 Hz .

Problemm :--> Schrittweise kommt in khz mit dem Atmega32 .

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.