INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Meine Lampe flackert...
26.07.2015, 08:41
Beitrag #1
Meine Lampe flackert...
Hi,
ich habe mir eine etwas komplexere LED-Lampe gebastelt. Im Prinzip besteht sie aus einem weißen LED-Streifen, einem RGB-Streifen, ein paar Attiny44 und ein paar IRFZ44N Mosfets. Mit dem RGB-Teil ist alles ok, aber jetzt ist mir beim weißen Streifen ein leichtes Flackern aufgefallen. Ich betreibe das ganze mit ca. 1kHz PWM, da dürfte man ja eigentlich kein Flackern sehen. Vielleicht übersehe ich aber was oder habe irgendwo einen Fehler drin.
Hier sind die Details:
Die Lampe ist 2m lang. Der weiße LED-Streifen läuft mit 12V und hat sein eigenes Netzteil (geregelt, 5A max). Es handelt sich um 60 LEDs/m, also 120 LEDs. Das ganze ist in 8 Abschnitte unterteilt, also 15 LEDs pro Abschnitt. Zwischen zwei Abschnitten ist jeweils die Masse-Leitung unterteilt und an einen IRFZ44N angeschlossen. Jeweils zwei der IRFZ44N hängen an einem Attiny44, der die Dinger per PWM steuert. In der Lampe sind also 4 Attiny44 und 8 IRFZ44N.
Die Attinys haben einen Sketch drauf, der jeweils ein Byte "Helligkeit" erhält, das dann per Lookup-Table auf einen Bereich zwischen 0 und 8191 hochrechnet und damit dann die Zähler für's PWM füttert.
Hier ist der Sketch:
Code:
// #include <SoftwareSerial.h>

// SoftwareSerial softSerial(99, 7); // RX, TX


//                           +-\/-+
//                     VCC  1|    |14  GND
//             (D 10)  PB0  2|    |13  AREF (D  0)
//             (D  9)  PB1  3|    |12  PA1  (D  1)
//       RSET          PB3  4|    |11  PA2  (D  2)
//  PWM  INT0  (D  8)  PB2  5|    |10  PA3  (D  3)
//  PWM        (D  7)  PA7  6|    |9   PA4  (D  4) SCK
//  PWM  MOSI  (D  6)  PA6  7|    |8   PA5  (D  5) MISO PWM
//                           +----+

// D0
// D1
// D2    Data Out
// D3    Clock Out
// D4
// D5    PWM-Output 2  (OC1B)
// D6    PWM-Output 1  (OC1A)
// D7    Data In (and TX serial debug)
// D8    Clock In
// D9
// D10  

#define PIN_DATA_OUT 2
#define PIN_CLOCK_OUT 3
#define PIN_PWM_OUT1 6
#define PIN_PWM_OUT2 5
#define PIN_DATA_IN 7
#define PIN_CLOCK_IN 8


const uint16_t pwmtable[256] PROGMEM =
{
    0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,

[...] Eine lange Liste von Zahlen weggelassen zur besseren Darstellung

7908    ,
8191    
};



void setup() {
  
   // softSerial.begin(9600);
   // delay(1000);  
   // softSerial.println(F("Huhu"));
  
   // set PWM Pin to output and LOW
   pinMode(PIN_PWM_OUT1,OUTPUT);   //PA6  TIMER1A, OC1A
   digitalWrite(PIN_PWM_OUT1,LOW);
   pinMode(PIN_PWM_OUT2,OUTPUT);   //PA5  TIMER1B, OC1B
   digitalWrite(PIN_PWM_OUT2,LOW);
  
   // set data out and clock out pin
   pinMode(PIN_DATA_OUT,OUTPUT);
   // the state of data out does not matter
   pinMode(PIN_CLOCK_OUT,OUTPUT);
   digitalWrite(PIN_CLOCK_OUT,LOW);

   // init PWM
  TCCR1A = // Fast PWM mode.
           (1 << WGM11);
  TCCR1B = // Fast PWM mode.
           (1 << WGM12) | (1 << WGM13) |
          // No clock prescaling (fastest possible
          // freq).
           (1 << CS10);
  OCR1A = 0;
  OCR1B = 0;
  // Set the counter value that corresponds to
  // full duty cycle. For 15-bit PWM use
  // 0x7fff, etc. A lower value for ICR1 will
  // allow a faster PWM frequency.
  ICR1 = 0x1fff;
  
  attachInterrupt(0,clock,RISING);  // D8, Pin 5, PB2
  
}


uint16_t level = 0;
unsigned long lastReceived = 0;
boolean receiving = false;

volatile boolean clocked = false;

void loop() {

  if(clocked) shift_in();

  // only do anything if we have received something
  if(!receiving) return;
  
  // allow 5ms latch time
  // it does not make much sense to send data more often than
  // 100 times a second
  if(millis() - lastReceived < 5) return;

  // ok, we have new data and nothing received since at least 5ms
  // send to PWM
  receiving = false;
  
  byte level1 = level & 0xFF;
  if(level1 == 0 || level1 == 255) {
    TCCR1A &= ~(1 << COM1A1);
    digitalWrite(PIN_PWM_OUT1,level1 ? HIGH : LOW);
  }else{
    TCCR1A |= (1 << COM1A1);
    OCR1A = pgm_read_word( & pwmtable[level1]);
  };  
  level1 = level >> 8;
  if(level1 == 0 || level1 == 255) {
    TCCR1A &= ~(1 << COM1B1);
    digitalWrite(PIN_PWM_OUT2, level1 ? HIGH : LOW);
  }else{
    TCCR1A |= (1 << COM1B1);
    OCR1B = pgm_read_word( & pwmtable[level1]);
  };  
}


void clock() {
  
  clocked = true;
  
};  


// shift_in
// called on rising edge on D8
void shift_in() {
  cli();
  clocked = false;
  sei();
  digitalWrite(PIN_DATA_OUT,(level & (1 << 15)) ? HIGH : LOW);
  digitalWrite(PIN_CLOCK_OUT,HIGH);
  // read our data  
  level <<= 1;
  level |= digitalRead(PIN_DATA_IN) ? 1 : 0;
  // we are still receiving
  lastReceived = millis();
  receiving = true;
  // hopefully this is enough time for the next segment
  // delayMicroseconds(10);
  digitalWrite(PIN_CLOCK_OUT,LOW);
};

Vielleicht könnte mal jemand speziell über die Timer-Sachen schauen, ob das Ding tatsächlich mit ca. 1kHz und ca. 13 Bit Auflösung läuft.
Ach ja: Die Tinys laufen mit 8MHz. Da bin ich mir auch relativ sicher, da ansonsten die Kommunikation zu den Teilen auch nicht funktionieren würde. (Oder?)

Vor der Attiny-Kette hängt eine Pro-Mini. Der empfängt Daten per RS485 und gibt sie an die Attinys weiter. Das Flackern tritt auch auf, wenn das Teil nichts sendet, daher lasse ich hier mal eine nähere Beschreibung weg.

Das Flackern ist wahrnehmbar, wenn alle 8 Abschnitte auf einem Wert von etwa 90% des Maximums sind. Ich habe auch den Eindruck, dass es nicht von Anfang an auftritt, sondern ein paar Sekunden braucht. (Es kann natürlich auch sein, dass das ein physio-/psychologischer Effekt ist.) Wenn nicht (zumindest fast) alle Abschnitte an sind, dann nehme ich kein Flackern (oder zumindest fast kein) Flackern wahr.

Ich weiß an der Stelle nicht so richtig weiter. Ich habe ein paar Vermutungen, aber keine so richtige Theorie. Hier meine Überlegungen:
1. Wenn alle 8 Abschnitte einschalten, dann gibt es irgendwie eine Stromspitze und das Netzteil bricht kurz ein. Das fände ich etwas seltsam, da das Netzteil ohnehin für die 120 LEDs überdimensioniert ist. Eigentlich wollte ich damit mindestens 300 LEDs treiben.
2. Die IRFZ44N schalten nicht immer so richtig durch. ...aber warum nur, wenn (fast) alle Abschnitte an sind?
3. Die Attinys haben keinen Quarz und sind nicht miteinander synchronisiert. Ich kann mir also vorstellen, dass die PWM-Timer nach dem Einschalten langsam auseinanderlaufen. Dadurch könnte es irgendwelche Schwebungseffekte geben. Ich frage mich, warum das dann bei den normalen RGB-Ketten nicht auch der Fall ist.
4. ...oder?

Weiß jemand Rat oder zumindest einen Weg, herauszufinden, was da los ist?

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2015, 08:56
Beitrag #2
RE: Meine Lampe flackert...
Hast du mal ein anderes Netzteil ausprobiert? Könnte sein das dein Netzteil nicht so ganz sauber ist und bei Belastung und etwas Betriebswärme anfängt Störungen zu produzieren. Ist es ein richtiges Flackern oder eher ein Flimmern?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2015, 08:59
Beitrag #3
RE: Meine Lampe flackert...
Moin,
du verwendest Softwareseriell, also da habe ich den Verdacht die Routine die Interrupts sperrt...somit dürften auch Timerinterrupts solange ausgesetzt sein. Such also mal in der Richtung...
Und nicht jeder PWM Ausgang geht voll Hardwaremäßig bis zum Portpin durch...hier empfiehlt es sich mal das Datenblatt der CPU zu durchleuchten auf welchen Pin's Signale der Timer direkt ausgegeben werden können. Bei manchen Pin's macht das die Software.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.07.2015, 17:21 (Dieser Beitrag wurde zuletzt bearbeitet: 26.07.2015 17:23 von Thorsten Pferdekämper.)
Beitrag #4
RE: Meine Lampe flackert...
(26.07.2015 08:56)Scherheinz schrieb:  Hast du mal ein anderes Netzteil ausprobiert? Könnte sein das dein Netzteil nicht so ganz sauber ist und bei Belastung und etwas Betriebswärme anfängt Störungen zu produzieren.
Ich habe bisher kein anderes ausprobiert. Es würde mich aber wundern, da das Flackern weg ist, wenn ich die LEDs "voll aufdrehe".
...aber ein Versuch wäre es vielleicht Wert.

Zitat:Ist es ein richtiges Flackern oder eher ein Flimmern?
Was ist der Unterschied?

(26.07.2015 08:59)Bitklopfer schrieb:  du verwendest Softwareseriell,
Nein, tue ich nicht. Das ist alles auskommentiert.

Zitat:Und nicht jeder PWM Ausgang geht voll Hardwaremäßig bis zum Portpin durch...hier empfiehlt es sich mal das Datenblatt der CPU zu durchleuchten auf welchen Pin's Signale der Timer direkt ausgegeben werden können. Bei manchen Pin's macht das die Software.
Schau mal in mein Coding. Ich verwende da immer direkt die Timer und die dazugehörigen Pins.

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Meine Freunde und ihre Ideen Gandalf 2 1.324 25.05.2016 18:25
Letzter Beitrag: SkobyMobil
  Meine Projekte - für RC-Modelle dqb312 7 2.967 04.04.2016 21:11
Letzter Beitrag: hotsystems
  Meine Arduino/Attiny-Projekte Retian 8 3.806 25.11.2015 23:42
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste