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


von Jens B. (kaeptnahab)


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
1
     TCCR1A |= (1<<COM1C1)|(1<<COM1C0);
2
     TCCR1B |= (1<<WGM13);//CS0 will be set/clr to switch on/off later
3
4
     ICR1 = 10000;
5
     OCR1A = 500;
6
7
8
  // output channel C for Timer 1 -> FOC1C --> PB7
9
  TCCR1C  = (1<< FOC1C);
10
11
  // set PB7 as output Port
12
  DDRB   |= 0x80;

von spess53 (Gast)


Lesenswert?

Hi

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

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

MfG Spess

von Jens B. (kaeptnahab)


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...;-))

von Karl H. (kbuchegg)


Lesenswert?

komplettes Programm herzeigen

von avion23 (Gast)


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.

von Jens B. (kaeptnahab)


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....
1
void uIOASS_BuzzerInit( void )
2
{
3
     TCCR1A |= (1<<COM1C1)|(1<<COM1C0);     
4
     TCCR1B |= (1<<WGM13);//CS0 will be set/clr to switch on/off later
5
6
     ICR1 = 10000;
7
     OCR1A = 500;
8
9
10
  // output channel C for Timer 1 -> FOC1C --> PB7
11
  TCCR1C  = (1<< FOC1C);
12
13
  // set PB7 as output Port
14
  DDRB   |= 0x80;
15
16
  // global Buzzer Variable
17
  gBuzzerActive = FALSE;
18
19
}
Dann irgendwann:
1
void vIOASS_BuzzerOn( void )
2
{
3
  power_timer1_enable();
4
  DDRB  |= (1 << 7);/*...dir  for buzzer out...*/
5
  PORTB |= (1 << 7);/*...port for buzzer on ...*/
6
7
  TCCR1B  |= (1<<CS10);
8
}
ca. 0,5s später:
1
void vIOASS_BuzzerOff( void )
2
{
3
  power_timer1_disable();
4
  DDRB  &= ~(1 << 7);/*...dir  for buzzer in ...*/
5
  PORTB &= ~(1 << 7);/*...port for buzzer off...*/
6
7
  TCCR1B  &= ~(1<<CS10);
8
}

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

von Karl H. (kbuchegg)


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.

von Floh (Gast)


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.
:-)

von Jens B. (kaeptnahab)


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....

von Karl H. (kbuchegg)


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.

von spess53 (Gast)


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

von Jens B. (kaeptnahab)


Lesenswert?

Moin Zusammen,

habs gelöst.
So funktionierts (und dann mit CS10 ein/aus schalten):
1
void uIOASS_BuzzerInit( void )
2
{
3
     TCCR1A=0x08;
4
     TCCR1B=0x11;
5
     TCNT1H=0x00;
6
     TCNT1L=0x00;
7
     //ICR1H=0x00;
8
     //ICR1L=0x00;
9
     ICR1 = 1000;//0x03E8;==4kHz//frequency driven at resonance frequency according to data sheet
10
     OCR1AH=0x00;
11
     OCR1AL=0x00;
12
     OCR1BH=0x00;
13
     OCR1BL=0x00;
14
     //OCR1CH=0x01;
15
     //OCR1CL=0x00;
16
     OCR1C = 500;//duty cycle, obviously doesn't affect sound pressure, so 50% to avoid harmonic waves
17
18
     TCCR1B  &= ~(1<<CS10);//buzzer off
19
20
     // output channel C for Timer 1 -> FOC1C --> PB7
21
  TCCR1C  = (1<< FOC1C);
22
23
  // set PB7 as output Port
24
  DDRB   |= 0x80;
25
26
  // global Buzzer Variable
27
  gBuzzerActive = FALSE;
28
}

Thanx&Greetz
Jens

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.