Fazer um overclock do processador ou da memória é compreensível, mas por que fazer um overclock da luz de fundo do monitor?

É sobre o antigo Samsung SyncMaster BX2340 de 23 polegadas (lançado em janeiro de 2011) com luz de fundo LED. Com o tempo, ele começou a perceber que trabalhar para ele era cansativo e se concentrava cada vez mais difícil. E não apenas trabalho, basta ler, por exemplo. O monitor em si permaneceu o mesmo, mas ficou mais difícil para mim. E para outras telas funcionou muito bem.
Uma vez
na Internet , li sobre os sentimentos subjetivos dos usuários de telefones com displays OLED com uma taxa de atualização de 240 Hz. Queixou-se de fadiga e dor de cabeça. E havia referências (sem provas) de estudos sobre o efeito da frequência de escurecimento da luz de fundo no corpo: embora o olho não veja cintilação em 240 Hz, o cérebro responde a ela. Um brilho constante ou com uma frequência superior a 3 kHz não carrega o cérebro dessa maneira.
Então, no YouTube, recebi um
vídeo sobre como refazer a luz de fundo do monitor para corrente contínua. A intervenção no esquema foi fundamental. Sob o vídeo, houve comentários sobre a mudança de cor em baixas correntes nos fios. E minha luz de fundo funciona entre 10 e 25%, porque a sala está bem escura.
UPD : No vídeo, o autor tinha apenas uma guirlanda de LEDs e eu tinha 4.
Foi decidido deixar o controle de brilho usando
PWM , mas aumentar a frequência. Eu nem comecei a medir a cintilação por um método não invasivo usando um fotorresistor ou um fotodiodo, desmontei imediatamente o monitor.

Controlador de luz de fundo - OZ9993CN. Não havia folha de dados normal, apenas um driver de luz de fundo de grupo fabricado pela O2 Micro. Verificou-se que o motorista também está envolvido no aumento da tensão (de acordo com medidas de 14,4 V a 54,6 V) usando um potente transistor e indutância de efeito de campo externo.
Um dos circuitos tem um significado semelhante ao do driver; os números dos pinos não correspondem:

Na placa, o caminho do sinal PWM para o driver é assinado como B-Dim (Backlight escurecendo?), Não precisei pesquisar. Em seguida, um clone do osciloscópio digital USBee AX USB, associado ao sigrok no lado do PC, entrou em cena. A medição mostrou que a frequência da luz de fundo é de 180 Hz (não será suficiente!). Alto nível de sinal - 5 V.

Agora você precisa, de alguma forma, aumentar a frequência do PWM para valores de kilohertz, uma vez a cada 16. A primeira coisa que veio à mente é colocar um microcontrolador no intervalo da trilha do PWM para receber o sinal e reproduzi-lo 16 vezes mais rápido. Precisamos de 2 temporizadores, um medirá a duração dos níveis baixo e alto, o outro emitirá um sinal PWM. Tendo captado os coeficientes do divisor, podemos ficar sem aritmética, apenas copiando. Não, o Arduino não. Também não haverá montador, haverá GCC. O pequeno MK com pelo menos dois temporizadores (do estoque) era ATtiny15. Mas o WinAVR não quer trabalhar com ele, então tive que usar uma versão mais antiga - ATtiny45 (ATtiny25 / 85 também funcionará).
Esquema:
100n ┌───────┤├───────┐ │ ┌────────────┐ │ │ │ 1 8 ├─┴─ VCC │ │ 2 7 ├─ PB2 (INT0) INPUT │ │ 3 6 ├─ PB1 (OC1A) OUTPUT GND ─┴─┤ 4 5 │ └────────────┘ ATtiny45
Selecionamos os fatores dos divisores do timer. Pegue a frequência da CPU de cerca de 8 MHz, a partir do gerador RC incorporado.
- Temporizador de medição. Quantas medidas no período de escurecimento?
. Para que isso se encaixe no registro de oito bits do timer com uma perda mínima de precisão, usamos o pré-divisor 256, o valor máximo do contador será
. - Temporizador PWM Aumentaremos a frequência 16 vezes: , o pré-divisor é tantas vezes menor:
.
O sinal de entrada está conectado à perna de interrupção externa. Manipulador do mesmo:
ISR(INT0_vect, ISR_NAKED) { uint8_t timer = TCNT0;
O que é ISR_NAKED?"ISR_NAKED" significa que a gravação / restauração dos registros e sinalizadores do processador é descartada, o que é feito para acelerar. Isso pode ser feito garantindo que eles não sejam afetados no loop principal (temos apenas um loop while(1) {}
) e que não haverá chamadas de sub-rotinas. Bem, no final, prescrevemos o retorno da função com o armar do sinalizador de reti()
interrupção reti()
.
Soldado, brilhou - e funcionou!

Mas o acelerador começou a chiar. Observamos o que está no portão do controlador de campo que controla a corrente através do indutor de potência:

Tudo está em ordem com o acelerador, ele continua a operar a uma frequência de 320 kHz, mas se anteriormente a frequência PWM era de 180 Hz e é quase inaudível (somente se você trouxer a orelha), então 2,9 kHz é muito audível. E o conforto claramente não aumentou. Mas e se você elevar a frequência além do limite superior da audibilidade? Por exemplo
? Alteramos o multiplicador do divisor do timer PWM de 16 para 2 e o exibimos. Acabou que tudo estava em ordem. Quase.
Temporizadores de oito bits, neste caso, não são suficientes
, você precisa de mais minerais . Isso se manifesta na forma de flutuações de baixa frequência no brilho, com um aumento suave e desaparecimento de uma frequência de vários segundos. Para lidar com esse flagelo, você pode levar o cristal mais gordo, mas esse não é o nosso caminho. Aumentaremos a largura de bit do temporizador de medição programaticamente e introduziremos um limite (histerese) para detecção confiável da troca de brilho pelo usuário (0–100 com uma resolução de 1). Aumentamos a precisão do temporizador de medição em 256 vezes, e o fator multiplicador se torna igual a 1.
Medindo o manipulador de estouro de timer com a opção "algo deu errado e a duração do nível arrastada":
ISR(TIM0_OVF_vect, ISR_NAKED) { #define TIME_H_LIM (UCHAR_MAX-1) if (time_h < TIME_H_LIM) {
A interrupção externa agora também é um pouco mais complicada:
ISR(INT0_vect, ISR_NAKED) {
Existem variáveis globais que eu registrei, nós temos overclock depois de tudo. A SRAM é usada apenas para armazenar o endereço de retorno ao inserir manipuladores de interrupção. A parte mais alta do contador de medição de intervalo está na variável time_h, e os valores da duração do ciclo PWM e do ciclo de trabalho medidos estão em time_cycle e time_on, respectivamente. LIMIAR - limiar para detectar mudanças no brilho.
Agora tudo funcionou como pretendido.
Código completo #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 }
Você pode chamá-lo de sugestão automática, mas o resultado é o seguinte: a vida se tornou melhor, a vida se tornou mais divertida! Até projetos de longa data seguiram em frente.
Se, no seu caso, a frequência da luz de fundo não afeta seu bem-estar e produtividade de nenhuma maneira - considere-se com sorte. Provavelmente. Assim como as pessoas que garantem que estão absolutamente confortáveis quando o conteúdo de CO
2 na sala é superior a 0,2% (2000
ppm ).
Mas e o link para o github?