www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM mit ATMega2561, Frequenz und Pulsbreite änderbar


Autor: Jens Berkemeyer (kaeptnahab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ja, bevor die Frage auftaucht, ich hab hier schon gesucht und nichts 
gefunden, was mir hilft oder es eben nicht verstanden....;-))

Ich brauch von meinem 2561 eine PWM, die in Frequenz und Tastverhältnis 
änderbar ist, zur Ansteuerung eines Piezo-Piepsers.
Systemtakt ist 8MHz.
Port muss B7 sein, s. Code unten.
Ich habe mir ICR1 zur Frequenzeinstellung (TOP-Wert)
und OCR1A  zur Pulsbreiteneinstellung gedacht.
Unten der Code, CS0 wird beim einschalten auf 1, beim Ausschalten auf 0 
gesetzt (An/Aus)
,allerdings wird der Port dann nur eingeschaltet, dann wieder aus. Von 
Frequenz keine Spur…
   _
__| |__

Habt Ihr nen Tip, Verbesserungsvorschlag für mich?? Hab irgenwie nen 
Knoten im Kopf...
LG Jens
     TCCR1A |= (1<<COM1C1)|(1<<COM1C0);
     TCCR1B |= (1<<WGM13);//CS0 will be set/clr to switch on/off later

     ICR1 = 10000;
     OCR1A = 500;


  // output channel C for Timer 1 -> FOC1C --> PB7
  TCCR1C  = (1<< FOC1C);

  // set PB7 as output Port
  DDRB   |= 0x80;

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

(1<<COM1C0) -> (1<<COM1C1)

TCCR1C  = (1<< FOC1C);    Unnötig

MfG Spess

Autor: Jens Berkemeyer (kaeptnahab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Spess,

erstmal Danke für die Antwort.
Das hab ich nicht so recht verstanden, weil ich ja COM1C1 schon gesetzt 
habe,
hab aber mit rumexperimentiert und wechselweise gesetzt odr auch beide 
nicht,
hat leider die Situation nicht verbessert...

Vielleicht sonst noch ne Idee?

Hatte schon an die Frequenz gedacht, aber mit 8MHz clock, Teiler 1 und 
ICR=10k sollte mehr wie 1Hz rauskommen, oder? Ich machs ja nur für 0,5s 
an...;-))

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

Bewertung
0 lesenswert
nicht lesenswert
komplettes Programm herzeigen

Autor: avion23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jens,
wie wäre es wenn du es mit einer LED testest? Die Sache mit der PWM ist 
recht einfach. Datenblatt auf, Beschreibung von TCCR1A/B raussuchen und 
alles konfigurieren.

Autor: Jens Berkemeyer (kaeptnahab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das kpl. Programm wär wohl n bisschen viel hier hochzuladen, sind ja 
knapp 50 Dateien...
Aber ich versuchs mal zu verbessern:

Erstmal initialisieren....
void uIOASS_BuzzerInit( void )
{
     TCCR1A |= (1<<COM1C1)|(1<<COM1C0);     
     TCCR1B |= (1<<WGM13);//CS0 will be set/clr to switch on/off later

     ICR1 = 10000;
     OCR1A = 500;


  // output channel C for Timer 1 -> FOC1C --> PB7
  TCCR1C  = (1<< FOC1C);

  // set PB7 as output Port
  DDRB   |= 0x80;

  // global Buzzer Variable
  gBuzzerActive = FALSE;

}
Dann irgendwann:
void vIOASS_BuzzerOn( void )
{
  power_timer1_enable();
  DDRB  |= (1 << 7);/*...dir  for buzzer out...*/
  PORTB |= (1 << 7);/*...port for buzzer on ...*/

  TCCR1B  |= (1<<CS10);
}
ca. 0,5s später:
void vIOASS_BuzzerOff( void )
{
  power_timer1_disable();
  DDRB  &= ~(1 << 7);/*...dir  for buzzer in ...*/
  PORTB &= ~(1 << 7);/*...port for buzzer off...*/

  TCCR1B  &= ~(1<<CS10);
}

power enable/disable deshalb, weils noch etwas später im sleepmode auch 
funktionieren muss...

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

Bewertung
0 lesenswert
nicht lesenswert
Jens Berkemeyer schrieb:
> Hallo,
>
> das kpl. Programm wär wohl n bisschen viel hier hochzuladen, sind ja
> knapp 50 Dateien...

Dann mach dir ein Testprogramm, bei dem es nur um die PWM geht.
Solche Standalone-Programme um einen bestimmten Sachverhalt 
auszuprobieren, haben sich schon das eine oder andere mal bewährt.

Ohne großen Schnickschnack kriegt man damit raus, ob die eingestellte 
Timer Konfiguration grundsätzlich funktioniert oder nicht, oder ob man 
irgendwo anders im eigentlichen Programm suchen muss.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum soll die Pulsbreite beim Systempiepser änderbar sein?
Damit holst du dir nur unangenehme Oberwellen auf den Piezo.

Hab das bei mir so realisiert:
-toggle port pin on compare match
-clear timer on compare match
-takteiler noch in den Hörbereich
-und dann kannste über den Compare-Wert die Frequenz ändern.
:-)

Autor: Jens Berkemeyer (kaeptnahab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Floh,

das ist der Versuch, mehr Lautstärke aus dem Piezo zu holen,
wobei ich selbst aber glaube, dass bei 50/50 Tastverhältnis das Ding nur 
an seiner Resonanzfrequenz betrieben werden muss, um die max. Lautstärke 
zu erzielen (mal unabhängig von der Betriebsspannung).

Bei CTC (Mode 4) funktioniert das recht gut und ich kann mit OCR1A die 
Frequenz einstellen, sogar wobbeln...
Aaaber ist ja nicht meine Idee, ich solls halt "nur" machen.



Testprogramm bereite ich mal vor....

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

Bewertung
0 lesenswert
nicht lesenswert
Jens Berkemeyer schrieb:

> an seiner Resonanzfrequenz betrieben werden muss, um die max. Lautstärke
> zu erzielen (mal unabhängig von der Betriebsspannung).

Zumindest sagt man das immer.

> Testprogramm bereite ich mal vor....

Lass es aber auch auf deiner Hardware laufen und sieh nach, ob der Timer 
wirklich nicht will.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Das hab ich nicht so recht verstanden, weil ich ja COM1C1 schon gesetzt
>habe,

Entschuldige. Ich jetzt auch nicht mehr. Muss ich wohl Tomaten....

MfG Spess

Autor: Jens Berkemeyer (kaeptnahab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Zusammen,

habs gelöst.
So funktionierts (und dann mit CS10 ein/aus schalten):
void uIOASS_BuzzerInit( void )
{
     TCCR1A=0x08;
     TCCR1B=0x11;
     TCNT1H=0x00;
     TCNT1L=0x00;
     //ICR1H=0x00;
     //ICR1L=0x00;
     ICR1 = 1000;//0x03E8;==4kHz//frequency driven at resonance frequency according to data sheet
     OCR1AH=0x00;
     OCR1AL=0x00;
     OCR1BH=0x00;
     OCR1BL=0x00;
     //OCR1CH=0x01;
     //OCR1CL=0x00;
     OCR1C = 500;//duty cycle, obviously doesn't affect sound pressure, so 50% to avoid harmonic waves

     TCCR1B  &= ~(1<<CS10);//buzzer off

     // output channel C for Timer 1 -> FOC1C --> PB7
  TCCR1C  = (1<< FOC1C);

  // set PB7 as output Port
  DDRB   |= 0x80;

  // global Buzzer Variable
  gBuzzerActive = FALSE;
}

Thanx&Greetz
Jens

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.