www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik pwm mit verschiedenen Frequenzen.


Autor: Chabah Chabah (Firma: .......) (chabah)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
#include <stdio.h>
#include <avr/io.h>
 #include <util/delay.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <stdlib.h>
 
int main()
{
uint16_t F;
DDRD = (1<<PD5); //SETZE OC1A ALS AUSGANG IN PD5
TCCR1A = (1<<COM1A0)|(1<<COM1A1)|(0<<WGM10)|(1<<WGM11);  //mit COM1A1 NICHT-INVERTIEREND PWM(S.108, T.45)
TCCR1B = (1<<WGM12)|(1<<WGM13)|(1<<CS10)|(0<<CS12); //cal CS10 bedeutet no Presing) --> clk/1 (S.110, T.48)
 for (F= 200000;F< 1000000; F=F+10){
ICR1 = (16000000/F)-1; //Der Zähler zählt bis zu diesem Wert: f=(f_cpu/N*(1+ICR1))

OCR1A = ICR1/2; //Dutycycle 50% 
if (TCNT1>ICR1){
     TCNT1 =0;
}
}
 while(1);
 }
Ich freue mich auf eine Antwort.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Eine etwas bessere Code Formatierung wäre hilfreich)
 uint16_t F

 for (F= 200000;F< 1000000; F=F+10){

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

Autor: Barny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau Herr Einstein!

2^16 = 65.536 < 100.000

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>100000 hat doch in einer 16 Bit Variable Platz.

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

Autor: Chabah Chabah (Firma: .......) (chabah)
Datum:

Bewertung
0 lesenswert
nicht 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,,,

Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chabah Chabah (Firma: .......) (chabah)
Datum:

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

Autor: chabah (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 .

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.