Dawn-Clock icon indicating copy to clipboard operation
Dawn-Clock copied to clipboard

Increase PWM frequency for MOSFET

Open SilverFire opened this issue 7 years ago • 8 comments

По умолчанию частота ШИМ 480 Гц, что даёт ощутимые мерцания. Поднятие частоты решает проблему

screenshot-002

SilverFire avatar Dec 01 '18 13:12 SilverFire

Попробовал твой фикс, но лучше не стало. всё, что не постоянный сигнал - сплошной стробоскоп.

kkostenkov avatar Feb 10 '19 15:02 kkostenkov

При частоте 4кГц (этот патч делает именно такую) мерцаний нет – инфа 100% Может зависеть от платформы Ардуино и используемого мосфета. Проверь, что частота реально изменилась и на затворе и на стоке мосфета, если есть чем :)

SilverFire avatar Feb 10 '19 19:02 SilverFire

а как реализовать поддержку 65536 уровней яркости? реально ли в текущей прошивке?

lesha01 avatar Feb 12 '19 18:02 lesha01

Если ардуино на STM32, то там АЦП 16-битный и, соответственно будет 65536 градаций.

SilverFire avatar Feb 13 '19 10:02 SilverFire

А если прикрутить программный 16-битный ШИМ? Вот этот вариант у меня работал в моей упрощенной версии рассвета, но что-то не получается к этому умному рассвету прикрутить:

void setup()
{
  cli();
  DDRB |= 1<<1 | 1<<2;         
  PORTB &= ~(1<<1 | 1<<2);
  TCCR1A = 0b00000010; 
  //TCCR1A = 0b10100010;  
  TCCR1B = 0b00011001;  
  ICR1H = 255;
  ICR1L = 255;
  sei(); 
  Serial.begin(9600);
}

void loop() 
{
  if(Serial.available()) 
  {
    char c = Serial.read();
    uint16_t pwm = Serial.parseInt();
    if(c == 'A')
    { 
      pwm ? TCCR1A|=1<<7 : TCCR1A&=~(1<<7);
      OCR1AH = highByte(pwm);  
      OCR1AL = lowByte(pwm);
    }
    if(c == 'B')
    { 
      pwm ? TCCR1A|=1<<5 : TCCR1A&=~(1<<5);
      OCR1BH = highByte(pwm);  
      OCR1BL = lowByte(pwm);
    }
  }
}

lesha01 avatar Feb 13 '19 10:02 lesha01

Я не так силён в этом вопросе, потому сходу подсказать не смогу – нужно разбираться. Вопрос из интереса: зачем столько градаций?

SilverFire avatar Feb 13 '19 10:02 SilverFire

Это позволяет более плавно менять яркость, а не рывками. В промежутке 1-50 из 255 это очень заметно и не в полной мере имитирует рассвет: каждые 12 сек (при получасовом рассвете) яркость меняется рывком. При использовании 16-битного ШИМ (использую обычную светодиодную ленту 12В, которая наклеена по периметру окна) оптимальный по ощущениям диапазон при линейном изменении яркости – это 1-25000 из 65535 на 30 минут рассвета. В идеале, конечно, скважность ШИМ вообще стоит менять по некой кривой, т.к. восприятие яркости человеком нелинейно, но и простое увеличение уровней яркости тоже даёт хороший эффект.

lesha01 avatar Feb 13 '19 10:02 lesha01

Да, я замечал что рывками получается, но когда спишь, это не заметно :)

SilverFire avatar Feb 14 '19 10:02 SilverFire