Forum: Mikrocontroller und Digitale Elektronik PWM setzt aus


von zibi d. (zibi)


Lesenswert?

Guten Abend zusammen,

Ich brauche eine Anregung "was es sein könnte/ist"..
viele LEDs werden per MOSFET (BUZ21) an und aus geschaltet.
Im "ein" Zustand sollen die leds gedimmt werden, per PWM.

Das Problem: neben der korrekten Funktion flackern die LEDs kurz mit 
voller Leistung auf, und das periodisch (Absand ca 10-15sec).
Also 400ms aus, 60ms an(gedimmt), usw.... , kurz ungedimmt an ...
Dazu lösche ich für die "aus" Phase die CSxx bits im TCCR1B.
Verwendet wird ein attiny2313. Vielen Dank im Voraus!
#ifndef F_CPU
#define F_CPU 12000000UL
#endif

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define LED PB3
#define sw1 PD2
#define sw2 PD3


int main(void)
{
  DDRD=0x00;
  PORTD=0xff;
  DDRB=0xff;
  PORTB=0x00;


  //initial timer1 as PWM
  TCCR1A= (1<<COM1A1)|(1<<WGM11);
        TCCR1B= (1<<WGM13)|(1<<WGM12)|(1<<CS10);
  //end initialise PWM
  ICR1=0x6fff;    //top value
  OCR1A=0x0fff;    //default compare value



  while(1)
  {
  TCCR1B &=0b11111000;  //turn PWM off
  PORTB=0x00;
  _delay_ms(400);

  TCCR1B= (1<<WGM13)|(1<<WGM12)|(1<<CS10);  //turn PWM on
  _delay_ms(60);

       }
}

von Karl H. (kbuchegg)


Lesenswert?

zibi dziubek schrieb:

>   TCCR1B &=0b11111000;  //turn PWM off

Das schaltet aber nicht die PWM 'off' sondern setzt nur den Prescaler 
des Timers auf 0 zurück. Der Timer ist deswegen trotzdem noch im PWM 
Modus und hat die Kontrolle über den Portpin. Daher ....

>   PORTB=0x00;

... ist das wirkungslos


Ich würds ehrlich gesagt gar nicht so machen. Das 'Ausschalten' machst 
du wahrscheinlich nur deswegen, weil du die LED auch wirklich 
ausschalten musst und nicht nur auf ganz kleiner PWM Stufe glimmen.

Dreh die PWM mit den COM Bits um. Dann kannst du mit dem richtigen 
PWM-Wert tatsächlich auch aus erreichen. Und dann manipulierst du 
ausschliesslich nur noch das OCR1A Register um die LEDs ein / aus zu 
schalten.

von zibi d. (zibi)


Angehängte Dateien:

Lesenswert?

Danke für den Tipp, ich werde es jetzt ausprobieren.

Jedoch sagt das Datenblatt:


siehe Bild.

von Karl H. (kbuchegg)


Lesenswert?

zibi dziubek schrieb:

> Jedoch sagt das Datenblatt:
>
>
> siehe Bild.

Was soll mir das jetzt sagen?
Sag ich doch: Der Timer ist gestoppt, weil er keinen Prescaler mehr hat.
Aber das beeinflusst ja die WGM Bits nicht. Und solange die auf PWM 
stehen, hat der Timer den Portpin unter Kontrolle. Du hast halt eine 
PWM, die momentan nicht läuft - aber - du hast nach wie vor einen Timer 
im PWM Modus!

von zibi d. (zibi)


Lesenswert?

Kapiert! timer stop heist NICHT als port pin freigegeben.
Vielen Dank :D

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.