Ankündigung

Einklappen
Keine Ankündigung bisher.

Grundsätzliches zum LED-Dimmen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Zitat von Eugenius Beitrag anzeigen
    Die Auflösung sagt nichts über "Flackern" an. Sondern die PWM-Frequenz. Die muss schon mind. 500 Hz sein. Je mehr desto besser.
    nein, ich meine nicht Flackern, sondern ruckeln beim rauf- und runterdimmen.
    Ich hätte es gern "stufenlos" und dafür sollte man bei < 1% auf der log. Skala bleiben.. da reichen nicht mal 16bit. Speziell bei den "kleinen" dimmstufen, oben ist es dann unkritisch.
    OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

    Kommentar


      #17
      VCC=24V.
      Was hat die Diode mit galvanischer Trennung zu tun?
      Alles was über 12V ist, wird durch die Diode verheizt, somit bleiben am Gate max. 12V übrig. Evtl. erzähle ich Quatsch und die Schaltung total daneben ist, aber die funktioniert...

      Zu 16Bit: hast du schon mal einen Dimmer gebaut?
      Beim analogWrite von Arduino mit 256 Stufen kann ich schon verstehen dass es "ruckelt"... (das ist der Grund warum ich für SAMD-Core einen PR gemacht habe um bis zu 16 bit zu nutzen).

      ab 10bit merkst du nichts mehr (gute Kennlinie vorausgesetzt)
      Ich nutze jeden Tag bei mir 10bit und 12bit. ich habe kein Unterschied und kein Ruckeln gesehen. 16Bit will ich nicht mal nutzen.

      Kommentar


        #18
        Zitat von Eugenius Beitrag anzeigen
        Zu 16Bit: hast du schon mal einen Dimmer gebaut?
        ja, gestern Abend
        ich hab aber schon beruflich Embedded Controller programmiert, also Datenblatt lesen & verstehen und die Bits in die entsprechenden Register schubsen hab ich eben nicht zum Ersten mal gemacht.

        Zitat von Eugenius Beitrag anzeigen
        analogWrite
        ich nutze den Hardware-PWM, konfiguriere also entsprechend die Timer-Register und entsprechende Compare-Matches.

        Code:
        // Set PB1/2 as outputs.
          DDRB |= (1 << DDB1) | (1 << DDB2);
        
          TCCR1A =
              (1 << COM1A1) | (1 << COM1B1) |
              // Fast PWM mode.
              (1 << WGM11);
          TCCR1B =
              // Fast PWM mode.
              (1 << WGM12) | (1 << WGM13) |
              // No clock prescaling (fastest possible freq).
              (1 << CS10);
          OCR1A = 0;
          //  15-bit PWM => 488Hz
          ICR1 = 0x7fff;
        das ist meine Werte-Tabelle für die Dimmstufen gem. Weber-Fechner:
        const uint16_t pwmtable_16[50] = {0, 1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 11, 14, 17, 22, 27, 33, 41, 51, 63, 78, 96, 118, 146, 180, 222, 273, 337, 415, 511, 629, 775, 954, 1175, 1447, 1782, 2194, 2701, 3326, 4095, 5042, 6207, 7642, 9409, 11584, 14262, 17559, 21618, 26615, 32767};
        man sieht, dass im unteren Bereich doppelte Werte vorkommen, weil die 15bit nicht mal für 50 Stufen ausreichen. Eigentlich bräuchte man 100 Stufen, damit man die Stufen nicht als Stufen wahrnimmt. Da kommt aber schon die HW an die Grenzen...

        und so wird dann die Helligkeit eingestellt:

        void set_brightness(int lvl)
        {
        OCR1A = pwmtable_16[lvl];
        }
        Zitat von Eugenius Beitrag anzeigen
        ab 10bit merkst du nichts mehr (gute Kennlinie vorausgesetzt)
        Ich nutze jeden Tag bei mir 10bit und 12bit. ich habe kein Unterschied und kein Ruckeln gesehen. 16Bit will ich nicht mal nutzen.
        Also zwischen OCR1A = 1 (Tastverhältnis 1/32768) und OCR1A = 2 (Tastverhältnis 2/32768) sieht man einen deutlichen "Sprung" - un das bei 15bit.
        Wie machst du das mit 10bit ohne?!
        Zuletzt geändert von Ing-Dom; 12.12.2017, 08:40.
        OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

        Kommentar


          #19
          Zitat von Eugenius Beitrag anzeigen
          VCC=24V.
          Was hat die Diode mit galvanischer Trennung zu tun?
          Alles was über 12V ist, wird durch die Diode verheizt, somit bleiben am Gate max. 12V übrig. Evtl. erzähle ich Quatsch und die Schaltung total daneben ist, aber die funktioniert...
          Also - das Problem ist ja, dass man unterschiedliche DC Bezüge hat. Einmal diue 24V und einmal KNX. Durch unterschiedliche Netzteile, große Leitungslängen kommt es hier zu Potentialunterschieden zwischen den GNDs, die für sich schon die zulässige V_GS überschreiten und das Gate des Mosfets durchschießen.
          Ursache sind z.B. die Entstörkondensatoren der Netzteile, Einkopplung, Surge..

          Aktuell im Testaufbau habe ich die GNDs einfach verbunden, damit ist der Potentialunterschied weg. Dafür fließen aber mehr oder weniger unkontrolliert Ausgleichsströme.
          Mit einer Z-Diode könnte man die Ausgleichströme begrenzen, so dass diese nur bei einer Potentialdiff von > 12V fließen.
          Die Idee gefällt mir aber nicht mehr..
          Grundsätzlich aber ein ganz anderer Einsatzzweck einer Z-Diode wie bei dir..

          Du verwendest diese ja, um die betriebsmäßig vorhandene 24V für die Ansteuerung nutzen zu können..

          Zitat von Eugenius Beitrag anzeigen
          Nachteil von der Schaltung: Ohne Mikrokontroller sind die LEDs immer an, da PullUp Gate offen hält.
          naja, dafür könnte man ja einfach einen Verarmungstypen einsetzen, der leitet wenn am Gate keine Spannung anliegt und sperrt, wenn Spannung anliegt.
          OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

          Kommentar


            #20
            Für 32u4 @ 8Mhz (12bit und 1000Hz):
            Code:
            void timer1_init(void){
                pinMode(9, OUTPUT); //HW CH2
                pinMode(10, OUTPUT);//HW CH3
                pinMode(11, OUTPUT);//HW CH4
                //Phase Correct PWM 12 bit @ 8Mhz System Clock => 1000Hz PWM
                ICR1 = 0x0F9E; //0x0FA0;//0x0FFF;
            //    TCCR1A = 0b10101010;//COM1A1/COM1B1/COM1C1/WGM11
                TCCR1A = 0b11111110;//COM1A1/COM1B1/COM1C1/WGM11 //invertiert
                TCCR1B = 0b00010001;//WGM13/WGM12/CS11
                OCR1A = 0;
                OCR1B = 0;
                OCR1C = 0;
            }
            
            void timer3_init(void){
                pinMode(5, OUTPUT); //HW CH1
                //Phase Correct PWM 12 bit @ 8Mhz System Clock => 1000Hz PWM
                ICR3 = 0x0F9E; //0x0FA0;//0x0FFF;
            //    TCCR3A = 0b10101010;//COM3A1/COM3B1/COM3C1/WGM31
                TCCR3A = 0b11111110;//COM3A1/COM3B1/COM3C1/WGM31 //invertiert
                TCCR3B = 0b00010001;//WGM33/WGM32/CS31
                OCR3A = 0;
            }
            
            void setPWM(byte channel, word value){
                switch(channel){
                    case 3: //D11
                        OCR1C = value;
                        break;
                    case 2: //D10
                        OCR1B = value;
                        break;
                    case 1: //D9
                        OCR1A = value;
                        break;
                    case 0: //D5
                        OCR3A = value;
                        break;
                    default:
                      break;
              }
            }
            und die Kennlinie (255 Stufen wie es von KNX DPT 5.004 gefordert wird):
            Code:
            const word characteristic_12bit[] = {0,139,141,143,145,147,149,150,152,155,157,159,161,
                                                 163,165,167,170,172,174,176,179,181,184,186,188,
                                                 191,193,196,199,201,204,207,209,212,215,218,221,
                                                 224,227,230,233,236,239,242,246,249,252,255,259,
                                                 262,266,269,273,277,280,284,288,292,295,299,303,
                                                 307,312,316,320,324,328,333,337,342,346,351,356,
                                                 360,365,370,375,380,385,390,395,401,406,411,417,
                                                 422,428,434,439,445,451,457,463,469,476,482,488,
                                                 495,501,508,515,522,529,536,543,550,557,565,572,
                                                 580,588,596,604,612,620,628,636,645,653,662,671,
                                                 680,689,698,707,717,726,736,746,756,766,776,786,
                                                 797,807,818,829,840,851,863,874,886,897,909,922,
                                                 934,946,959,972,985,998,1011,1024,1038,1052,1066,
                                                 1080,1094,1109,1124,1139,1154,1169,1185,1201,1217,
                                                 1233,1249,1266,1283,1300,1317,1335,1352,1370,1389,
                                                 1407,1426,1445,1464,1484,1503,1523,1544,1564,1585,
                                                 1606,1628,1649,1671,1693,1716,1739,1762,1785,1809,
                                                 1833,1858,1882,1908,1933,1959,1985,2011,2038,2065,
                                                 2093,2120,2149,2177,2206,2236,2265,2296,2326,2357,
                                                 2389,2420,2453,2485,2518,2552,2586,2620,2655,2690,
                                                 2726,2763,2799,2837,2874,2913,2952,2991,3031,3071,
                                                 3112,3153,3195,3238,3281,3325,3369,3414,3459,3505,
                                                 3552,3599,3647,3696,3745,3795,3845,3897,3948,3998};
            nicht verwirren lassen vom Sprung 0 auf 139. Das ist wegen dem PullUp. erst ab 139 sieht man, dass die LEDs an sind.


            diese nutze ich bei 10bit:
            Code:
            const word characteristic_10bit[] = {0,1,1,1,2,2,3,3,3,4,4,4,4,4,4,4,4,4,
                                                 5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,
                                                 7,7,7,7,7,8,8,8,8,8,9,9,9,9,9,10,10,
                                                 10,10,11,11,11,11,12,12,12,12,13,13,
                                                 13,14,14,14,15,15,15,16,16,16,17,17,
                                                 17,18,18,19,19,20,20,20,21,21,22,22,
                                                 23,23,24,25,25,26,26,27,28,28,29,30,
                                                 30,31,32,32,33,34,35,35,36,37,38,39,
                                                 40,41,42,43,44,45,46,47,48,49,50,51,
                                                 52,54,55,56,57,59,60,61,63,64,66,67,
                                                 69,70,72,74,75,77,79,81,83,85,87,89,
                                                 91,93,95,97,99,102,104,106,109,111,
                                                 114,116,119,122,125,128,131,134,137,
                                                 140,143,146,150,153,157,160,164,168,
                                                 172,176,180,184,188,193,197,202,206,
                                                 211,216,221,226,231,237,242,248,254,
                                                 259,265,272,278,284,291,298,304,311,
                                                 319,326,334,341,349,357,366,374,383,
                                                 391,401,410,419,429,439,449,459,470,
                                                 481,492,503,515,527,539,552,564,578,
                                                 591,605,619,633,647,662,678,693,710,
                                                 726,743,760,777,795,814,833,852,872,
                                                 892,912,934,955,977,1000,1023};
            P.S. analogWrite ist auch HW PWM, nimmt aber die Registereinstellung ab, mit dem Nachteil, dass es bei AVR nur 8bit möglich sind.
            P.P.S: https://github.com/Adminius/Dimmer32u4 und https://github.com/Adminius/DimmerZero
            Zuletzt geändert von Eugenius; 12.12.2017, 09:53.

            Kommentar


              #21
              Zitat von Eugenius Beitrag anzeigen
              nicht verwirren lassen vom Sprung 0 auf 139. Das ist wegen dem PullUp. erst ab 139 sieht man, dass die LEDs an sind.
              ja, das war mir schon bei deiner Schaltung klar.. der 10k flacht dir die Flanke ganz schön ab, damit wirds nix mit ganz kurzen Schaltzeiten. Ist halt ne Frage, wie weit man runter dimmen können will. Positiver Nebeneffekt - flache Flanke idR besser bzgl EMV. Ich gehe derzeit mit 100R aufs Gate.

              wie hast du die Tabellen ermittelt? Ausprobiert, irgendeine Funktion?
              OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

              Kommentar


                #22
                Ich glaube ich habe dann 1k statt 10k verwendet. Aber ja, je kleiner, desto schneller.

                Für die Kurve habe ich die Excel Liste benutzt.
                https://www.mikrocontroller.net/articles/LED-Fading

                und noch ein paar Anpassungen/Verschiebungen.

                P.S. Optokoppler: ELD217
                P.P.S. Interessante Infos: http://joost.damad.be/2012/09/dimmin...osfet-and.html

                Kommentar


                  #23
                  Hier eine (interessante) arduino-Bibliothek zum Dimmen von LED's. Kurven sind auch schon dabei.

                  https://github.com/jgillick/arduino-LEDFader

                  Gruß Ivan

                  Kommentar


                    #24
                    mal ne Frage zum DPT5.004.

                    100% entsprechen ja 100d bzw. 64h.

                    Intuitiv würde ich sagen, auf 100% müsste der Dimmer voll hochgedimmt sein.
                    Das heißt, es sind nicht 255 sondern "nur" 100 Dimmstufen.

                    Wie verhalten sich käufliche Dimmer an dieser Stelle?
                    OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

                    Kommentar


                      #25
                      DPT5.xxx sind immer 8bit, also Wertebereich 0 - 0xFF. Der einzige Unterschied ist, dass in der ETS (z.B. Busmonitor) eine Umrechnung stattfindet und die 0xFF auf 100% skaliert werden.

                      Den Wert direkt zu verwenden macht ja auch keinen Sinn - auf 255% zu dimmen bringt ja nix.

                      Hoffe das beantwortet deine Frage.

                      Kommentar


                        #26
                        Zitat von Sonnengruesser Beitrag anzeigen
                        dass in der ETS (z.B. Busmonitor) eine Umrechnung stattfindet und die 0xFF auf 100% skaliert werden.
                        DPT 5.004 definiert sich so
                        0x00 - 0xFF auf 0 - 255%, so:

                        0x00 = 0%
                        0x01 = 1%
                        ...
                        0x64 = 100%
                        ...
                        0xFF = 255%

                        Bei DPT 5.001 ist das anders:
                        0x00 = 0%
                        0x01 = 0,4%
                        ..
                        0xFF = 100%

                        welchen Datentyp setzen also idR ein Dimmer um? DPT5.001 oder DPT 5.004?
                        Ist ja ein Unterschied, ob ich bei 0x32 oder bei 0x7F 50% dimme...
                        Sensor und Aktor sollten da ja ein gleiches Verständnis haben...
                        OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

                        Kommentar


                          #27
                          Ach so, das meinst du

                          Meine MDT Dimmer, Jalousieaktoren und Heizungsaktoren verwenden 5.001, also 0xFF = 100%. Genau wie meine Jung Taster.

                          Kommentar


                            #28
                            Ich habe in meinen DIY Dimmern immer 255% verwendet, hat immer gut funktioniert

                            Kommentar


                              #29
                              Danke, das hilft mir weiter.
                              OpenKNX www.openknx.de | NanoBCU und OpenKNX-HW verfügbar

                              Kommentar


                                #30
                                Grade noch mal in die Datenpunktliste geschaut (z.B. beim Jung LED-Aktor). Überall 5.001

                                Kommentar

                                Lädt...
                                X