Überwachen Sie das Übertakten

Das Übertakten des Prozessors oder des Speichers ist verstĂ€ndlich, aber warum die Hintergrundbeleuchtung des Monitors ĂŒbertakten?



Es geht um den alten 23-Zoll-Samsung SyncMaster BX2340 (veröffentlicht im Januar 2011) mit LED-Hintergrundbeleuchtung. Mit der Zeit bemerkte er, dass es anstrengend war, fĂŒr ihn zu arbeiten und sich immer schwieriger zu konzentrieren. Und nicht nur arbeiten, sondern zum Beispiel lesen. Der Monitor selbst blieb derselbe, aber es wurde schwieriger fĂŒr mich. Und fĂŒr andere Bildschirme hat es ganz gut funktioniert.

Einmal im Internet las ich ĂŒber die subjektiven GefĂŒhle von Benutzern von Telefonen mit OLED-Displays mit einer Bildwiederholfrequenz von 240 Hz. Beschwert ĂŒber MĂŒdigkeit und Kopfschmerzen. Und es gab Hinweise (ohne Beweise) auf Studien zum Einfluss der Dimmfrequenz der Hintergrundbeleuchtung auf den Körper: Obwohl das Auge bei 240 Hz kein Flackern sieht, reagiert das Gehirn darauf. Ein konstantes Leuchten oder eine Frequenz von mehr als 3 kHz belastet das Gehirn nicht auf diese Weise.

Dann habe ich auf YouTube ein Video ĂŒber das Wiederherstellen der Hintergrundbeleuchtung des Monitors fĂŒr Gleichstrom erhalten. Die Intervention in das System war kardinal. Unter dem Video gab es Kommentare zur Farbverschiebung bei niedrigen Strömen an den DrĂ€hten. Und meine Hintergrundbeleuchtung arbeitet mit 10-25%, weil der Raum ziemlich dunkel ist. UPD : In dem Video hatte der Autor nur eine Girlande mit LEDs, und ich hatte 4.

Es wurde beschlossen, die Helligkeitsregelung mit PWM zu verlassen, aber die Frequenz zu erhöhen. Ich habe nicht einmal angefangen, das Flimmern mit einer nicht-invasiven Methode unter Verwendung eines Fotowiderstands oder einer Fotodiode zu messen. Ich habe den Monitor sofort zerlegt.



Backlight Controller - OZ9993CN. Es gab kein normales Datenblatt, nur einen Gruppen-Hintergrundbeleuchtungstreiber von O 2 Micro. Es stellte sich heraus, dass der Treiber auch an der Erhöhung der Spannung (gemĂ€ĂŸ Messungen von 14,4 V auf 54,6 V) unter Verwendung eines leistungsstarken externen Feldeffekttransistors und einer InduktivitĂ€t beteiligt ist.

Eine der Schaltungen hat eine Ă€hnliche Bedeutung wie der Treiber, die Pin-Nummern stimmen nicht ĂŒberein:



Auf der Karte ist der PWM-Signalpfad zum Treiber als B-Dim (Backlight Dimming?) Signiert, ich musste nicht suchen. Als nÀchstes kam ein Klon des USBee AX USB-Digitaloszilloskops in Verbindung mit Sigrok auf der PC-Seite ins Spiel. Die Messung ergab, dass die Hintergrundbeleuchtungsfrequenz 180 Hz betrÀgt (dies wird nicht ausreichen!). Hoher Signalpegel - 5 V.



Jetzt mĂŒssen Sie die PWM-Frequenz irgendwie alle 16 auf Kilohertz-Werte erhöhen. Das erste, was Ihnen in den Sinn kam, war, einen Mikrocontroller in die PWM-SpurlĂŒcke zu stecken, um das Signal zu empfangen und es 16-mal schneller abzuspielen. Wir brauchen 2 Timer, einer misst die Dauer der niedrigen und hohen Pegel, der andere gibt ein PWM-Signal. Nachdem wir die Koeffizienten des Teilers aufgenommen haben, können wir ĂŒberhaupt auf Arithmetik verzichten, indem wir einfach kopieren. Nein, Arduino wird nicht. Es wird auch keinen Assembler geben, es wird GCC geben. Der kleine MK mit mindestens zwei Timern (ab Lager) war ATtiny15. Aber WinAVR will nicht mit ihm arbeiten, deshalb musste ich eine Ă€ltere Version nehmen - ATtiny45 (ATtiny25 / 85 wird auch funktionieren).

Schema:

100n ┌────────├───────┐ │ ┌────────────┐ │ │ │ 1 8 ├─┮─ VCC │ │ 2 7 ├─ PB2 (INT0) INPUT │ │ 3 6 ├─ PB1 (OC1A) OUTPUT GND ─┎── 4 5 │ └────────────┘ ATtiny45 

Wir wÀhlen die Faktoren der Timer-Teiler aus. Nehmen Sie die CPU-Frequenz von ca. 8 MHz aus dem eingebauten RC-Generator.

  • Timer messen. Wie viele Maßnahmen in der Dimmphase? . Damit dies mit einem minimalen Genauigkeitsverlust in das Acht-Bit-Register des Zeitgebers passt, nehmen wir den Vorteiler 256, der Maximalwert des ZĂ€hlers ist 8.000.000 USD / 180/256 USD / Ca.  173,6 USD .
  • PWM-Timer Wir werden die Frequenz 16-mal grĂ¶ĂŸer machen: , dann ist der Vorteiler um ein Vielfaches kleiner: .

Das Eingangssignal ist mit dem externen Interrupt-Zweig verbunden. Handler davon:

 /* External Interrupt 0 */ ISR(INT0_vect, ISR_NAKED) { uint8_t timer = TCNT0; //     if (PINB & 1<<PB2) { //  .   -    OCR1C = timer; //   TCNT0 = 0; //     } else { //   -  OCR1A = timer; //   } reti(); } 

Was ist ISR_NAKED?
"ISR_NAKED" bedeutet, dass das Speichern / Wiederherstellen von Registern und Flags des Prozessors verworfen wird, dies wird zur Beschleunigung durchgefĂŒhrt. Dies kann erreicht werden, indem sichergestellt wird, dass sie in der Hauptschleife nicht betroffen sind (wir haben dort nur eine endlose while(1) {} ) und dass keine Aufrufe von Unterroutinen erfolgen. Nun, am Ende schreiben wir die RĂŒckkehr von der Funktion mit dem Spannen des Interrupt- reti() .

Gelötet, geblitzt - und es hat funktioniert!



Aber der Gashebel begann zu quietschen. Wir schauen uns an, was sich am Gate des Feldreglers befindet, der den Strom durch die LeistungsinduktivitÀt steuert:



Mit dem Gas ist alles in Ordnung, es arbeitet weiterhin mit einer Frequenz von 320 kHz, aber wenn frĂŒher die PWM-Frequenz 180 Hz betrug und fast unhörbar ist (nur wenn Sie Ihr Ohr mitbringen), dann sind 2,9 kHz sehr gut hörbar. Und der Komfort hat eindeutig nicht zugenommen. Aber was ist, wenn Sie die Frequenz ĂŒber die Obergrenze der Hörbarkeit bringen? Zum Beispiel ? Wir Ă€ndern den Multiplikator des PWM-Timer-Teilers von 16 auf 2 und blinken ihn. Es stellte sich heraus, dass alles in Ordnung war. Fast.

Acht-Bit-Timer reichen in diesem Fall nicht aus , Sie benötigen mehr Mineralien . Dies Ă€ußert sich in niederfrequenten Helligkeitsschwankungen mit einem sanften Anstieg und Verschwinden einer Frequenz von mehreren Sekunden. Um mit dieser Geißel fertig zu werden, können Sie den Kristallfetter nehmen, aber dies ist nicht unser Weg. Wir werden die Bittiefe des Mess-Timers programmgesteuert erhöhen und einen Schwellenwert (Hysterese) fĂŒr die zuverlĂ€ssige Erkennung der Helligkeitsumschaltung durch den Benutzer einfĂŒhren (0–100 mit einer Auflösung von 1). Wir erhöhen die Genauigkeit des Mess-Timers um das 256-fache und der Multiplikatorfaktor wird gleich 1.

Messen des Timer-Überlauf-Handlers mit der Option „Es ist ein Fehler aufgetreten und die Dauer des Levels hat sich in die LĂ€nge gezogen“:

 /* Timer/Counter0 Overflow */ ISR(TIM0_OVF_vect, ISR_NAKED) { #define TIME_H_LIM (UCHAR_MAX-1) if (time_h < TIME_H_LIM) { // Normal way time_h += 1; } else { // High part overflowed if (PINB & 1<<PB2) { OCR1A = TIME_H_LIM; // Always on } else { OCR1A = 0; // Always off } OCR1C = TIME_H_LIM; time_h = 0; time_cycle = 0; time_on = 0; } reti(); // Because ISR_NAKED } 

Die externe Unterbrechung ist jetzt auch etwas komplizierter:

 /* External Interrupt 0 */ ISR(INT0_vect, ISR_NAKED) { // F_CPU / Timer1 prescaler / F_PWM_IN / grades / 4 #define THRESHOLD (F_CPU / 1 / F_PWM_IN / 100 / 4) uint16_t time; uint8_t time_l = TCNT0; if ((TIFR & 1<<TOV0) && (time_l <= UCHAR_MAX/2)) { // Overflow occured right now time_l = UCHAR_MAX; // 0xff } time = (time_h << 8) + time_l; if (PINB & 1<<PB2) { // Risen if (abs(time - time_cycle) > THRESHOLD) { time_cycle = time; OCR1C = time_h; } TCNT0 = 0; time_h = 0; if (TIFR & 1<<TOV0) { TIFR = 1<<TOV0; // Clear Timer0 overflow flag } } else { // Falled if (abs(time - time_on) > THRESHOLD) { time_on = time; OCR1A = time_h; } } reti(); // Because ISR_NAKED } 

Es gibt globale Variablen, die ich in Register geschrieben habe, wir haben schließlich Übertaktung. SRAM wird nur zum Speichern der RĂŒcksprungadresse verwendet, wenn Interrupt-Handler eingegeben werden. Der höchste Teil des IntervallmessungszĂ€hlers befindet sich in der Variablen time_h, und die Werte der gemessenen PWM-ZykluslĂ€nge und des Arbeitszyklus befinden sich in time_cycle bzw. time_on. THRESHOLD - Schwelle zum Erkennen von HelligkeitsĂ€nderungen.

Jetzt hat alles wie vorgesehen funktioniert.

VollstÀndiger Code
 /* PWM frequency multiplier x128 100n ┌────────├───────┐ │ ┌────────────┐ │ │ │ 1 8 ├─┮─ VCC │ │ 2 7 ├─ PB2 (INT0) INPUT │ │ 3 6 ├─ PB1 (OC1A) OUTPUT GND ─┎── 4 5 │ └────────────┘ ATtiny45 fuses: lfuse=0xe2 hfuse=0xdf */ #include <avr/interrupt.h> #include <avr/wdt.h> #include <stdlib.h> #include <limits.h> #define F_CPU 8000000UL #define F_PWM_IN 180U register uint8_t time_h asm("r4"); // High part of time counter register uint16_t time_cycle asm("r12"); // Period register uint16_t time_on asm("r14"); // H level duration __attribute__((naked)) int main(void) { time_h = 0; time_cycle = 0; time_on = 0; ACSR |= 1<<ACD; // Comparator disable // Timer0 TCCR0A = 0; // CK/1 TCCR0B = 1<<CS00; // Timer1 DDRB |= 1<<PB1; // PWM output // CK/2, Clear the OC1A output line TCCR1 = 1<<CTC1|1<<PWM1A|2<<COM1A0|2<<CS10; TIMSK |= 1<<TOIE0; // Timer0 overflow // Ext int 0 MCUCR |= 1<<ISC00; // Any logical change on INT0 generates an interrupt request GIMSK |= 1<<INT0; // External Interrupt Request 0 Enable PORTB |= 1<<PB2; // Input wdt_enable(WDTO_120MS); // Watchdog on sei(); // Interrupts enable while (1) { // Do not use flags or registers wdt_reset(); // Watchdog reset } } /* External Interrupt 0 */ ISR(INT0_vect, ISR_NAKED) { // F_CPU / Timer1 prescaler / F_PWM_IN / grades / 4 #define THRESHOLD (F_CPU / 1 / F_PWM_IN / 100 / 4) uint16_t time; uint8_t time_l = TCNT0; if ((TIFR & 1<<TOV0) && (time_l <= UCHAR_MAX/2)) { // Overflow occured right now time_l = UCHAR_MAX; // 0xff } time = (time_h << 8) + time_l; if (PINB & 1<<PB2) { // Risen if (abs(time - time_cycle) > THRESHOLD) { time_cycle = time; OCR1C = time_h; } TCNT0 = 0; time_h = 0; if (TIFR & 1<<TOV0) { TIFR = 1<<TOV0; // Clear Timer0 overflow flag } } else { // Falled if (abs(time - time_on) > THRESHOLD) { time_on = time; OCR1A = time_h; } } reti(); // Because ISR_NAKED } /* Timer/Counter0 Overflow */ ISR(TIM0_OVF_vect, ISR_NAKED) { #define TIME_H_LIM (UCHAR_MAX-1) if (time_h < TIME_H_LIM) { // Normal way time_h += 1; } else { // High part overflowed if (PINB & 1<<PB2) { OCR1A = TIME_H_LIM; // Always on } else { OCR1A = 0; // Always off } OCR1C = TIME_H_LIM; time_h = 0; time_cycle = 0; time_on = 0; } reti(); // Because ISR_NAKED } 


Man kann es Autosuggestion nennen, aber das Ergebnis ist: Das Leben ist besser geworden, das Leben hat mehr Spaß gemacht! Sogar langhĂ€ngende Projekte gingen weiter.

Wenn in Ihrem Fall die Frequenz der Hintergrundbeleuchtung Ihr Wohlbefinden und Ihre ProduktivitĂ€t in keiner Weise beeintrĂ€chtigt, können Sie sich glĂŒcklich schĂ€tzen. Wahrscheinlich. Ebenso wie Menschen, die versichern, dass sie sich absolut wohl fĂŒhlen, wenn der CO 2 -Gehalt im Raum mehr als 0,2% (2000 ppm ) betrĂ€gt .

Aber was ist mit dem Link zu Github?

Source: https://habr.com/ru/post/de448730/


All Articles