Dimmer adalah rangkaian elektronik yang memodifikasi bentuk sinyal ac murni menjadi sinyal terpotong-potong sehingga daya keluaran bisa diatur. Pemotongan sinyal ac ini berguna sebagai peredup lampu, memperlambat motor, mengatur pemanasan dan lainnya.
Dimmer yang lebih komplek menggunakan PWM sebagai pengendalinya. PWM bisa dihasilkan oleh rangkaian SCR, chip/IC PWM atau mikrokontroller. Dimmer PWM ini mampu menghasilkan tingkatan daya yang kecil, sehingga pengontrolan menjadi lebih presisi.
Dimmer PWM bisa dikategorikan menjadi dua macam yaitu :
- Penyalaan berdasarkan titik nol.
- Penyalaan bebas.
Penyalaan berdasarkan titik nol
Waktu penyalaan bergantung pada saat sinya menyentuh nilai nol. Maka dibutuhkan mekanisme untuk mendeteksi waktu sinyal tersebut bernilai 0.
Komponen SCR memiliki sifat forward blocking, forward conduction, dan reverse blocking, maka komponen ini cocok digunakan sebagai dimmer elektronik.
Rangkaian dimmer lampu ac yang memanfatkan sifat SCR:

Pada aplikasi dimmer digital, perlintasan titik nol harus dideteksi terlebih dahulu sebelum melakukan menyalaan, Pendeteksian nilai nol bisa dilakukan dengan rangkaian zero crossing detector / ZCD berikut :


Perancangan dimmer PWM mengikuti kaidah berikut:
- Waktu penyalaan, sinyal bolak-balik (AC) senantiasa bergerak naik dan turun, maka sinyal pengontrol PWM haruslah dimulai saat sinyal AC meninggalkan nilai nol
- Frekuensi AC, Sinyal pengontrol PWM juga harus memiliki frekuensi tepat dengan frekuensi sinyal AC (listrik)
Kendala membuat dimmer metode zero cross adalah :
- frekuensi ac 220v dari penyedia listrik seperti PLN bisa saja berubah-ubah. pada contoh dimmer lampu 220v, intensitas cahaya menjadi tidak konsisten. Untuk mengantisipasi ini sebaiknya dilakukan pengukuran frekuensi secara berkala.
- Sulit untuk sinkronisasi frekuensi jala listrik dengan frekuensi pengontrol, karena keterbatasan perhitungan digital, misalnya faktor pergeseran frekuensi akibat pembagian bilangan yang tidak sempurna. Sebagai contoh perangkat digital akan sulit mencapai frekuensi 50,00019 Hz.
- Memakai resources mikrokontroller seperti arduino untuk mendeteksi ZCD terus menerus.
- Jika ada kesalahan setting waktu penyalaan (program diinterupsi) maka beban seperti lampu akan berkedip.
- Pada duty cycle rendah, untuk dimmer lampu akan terlihat flicker karena perbandingan waktu on sangat kecil dibandingkan waktu off.
Rangkaian dimmer arduino dengan beban lampu:

Penampakan modul dimmer lampu:


Penghasil sinyal PWM yang favorit adalah arduino, karena mampu menghitung frekuensi dan melakukan penyesuaian apabila ada pergeseran frekuensi:
Sketch / koding dimmer lampu arduino
fitur:
- input zcd dari semua pin (tidak harus pin int0/pin 9 dan int1/pin 10)
- input kontrol berupa duty cycle (rentang 0.0 – 100.0 %)
#define PWM 9 //!!!Mega hanya pin 10-13. 50-53, 14-15, A8-A15
#define ZCD 10 // A0 = 14, A5 = 19
#define frekuensi 50 //50 Hz
#define inputSerial 0
volatile uint16_t dutyCycle;
#define maxDutyCycle ((16000000L / (2 * 1024L * frekuensi)) - 1)
volatile intptr_t *portPWM;
volatile uint32_t millisZCDSebelumnya;
byte bitPWM;
void setup() {
Serial.begin(9600);
Serial.println("Dimmer arduino");
Serial.println("https://www.project.semesin.com/");
Serial.println();
dutyCycle = 0;
TCCR2A = _BV(WGM21);
TCCR2B = _BV(CS22) | _BV(CS21) | _BV(CS20);
OCR2A = maxDutyCycle;
OCR2B = setDutyCycle(dutyCycle);
TIMSK2 = _BV(OCIE2B);
*digitalPinToPCMSK(ZCD) |= bit (digitalPinToPCMSKbit(ZCD));
PCIFR |= bit (digitalPinToPCICRbit(ZCD));
PCICR |= bit (digitalPinToPCICRbit(ZCD));
portPWM = (volatile intptr_t *) portOutputRegister(digitalPinToPort(PWM));
bitPWM = digitalPinToBitMask(PWM);
pinMode(PWM, OUTPUT);
}
void loop() {
#if inputSerial
if (Serial.available())
{
int data = Serial.parseInt();
dutyCycle = setDutyCycle(data);
while(Serial.available())
{
delay(2);
Serial.read();
}
}
#else
for (byte i = 20; i <= 100; i++)
{
dutyCycle = setDutyCycle(i);
delay(20);
}
for (byte i = 99; i != 20; i--)
{
dutyCycle = setDutyCycle(i);
delay(20);
}
#endif
}
uint16_t setDutyCycle(uint8_t dutyCycle)
{
return maxDutyCycle - (1.0 * dutyCycle / 100 * (maxDutyCycle - 1)) + 1;
}
#if defined(__AVR_ATmega328P__)
# if ((ZCD >= 0) & (ZCD <= 7))
ISR (PCINT2_vect)
# elif ((ZCD >= 8) & (ZCD <= 13))
ISR (PCINT0_vect)
# elif ((ZCD >= 14) & (ZCD <= 19))
ISR (PCINT1_vect)
# endif
#elif defined(__AVR_ATmega2560__)
# if ((ZCD >= 50) & (ZCD <= 53)) || ((ZCD >= 10) & (ZCD <= 13))
ISR (PCINT0_vect)
# elif ((ZCD >= 14) & (ZCD <= 15))
ISR (PCINT1_vect)
# elif ((ZCD >= A8) & (ZCD <= A15))
ISR (PCINT2_vect)
# endif
#endif
{
if(millisZCDSebelumnya < millis())
{
millisZCDSebelumnya = millis() + 7;
OCR2B = dutyCycle;
TCNT2 = 0;
}
}
ISR (TIMER2_COMPB_vect)
{
*portPWM |= bitPWM;
delayMicroseconds(50);
*portPWM &= ~bitPWM;
}
Penyalaan bebas
Waktu penyalaan dimmer tidak dipengaruhi oleh nilai nol,
Rangkaian dimmer ac sederhana :

Sirkit melalui dioda disebut juga penyearah setengah gelombang, yang menghasilkan kondisi dimmer setengah terang. Rangkaian ini biasanya digunakan pada solder, heatgun untuk pemanasan awal.
Pengaturan dimmer PWM lebih diutamakan pada frekuensi PWM-nya. Dimmer lampu akan terlihat berkedip jika frekuensi tidak sama. Untuk mengatasi pemasalahan tersebut rangkaian peredup lampu (Dimmer) didesain dengan penggunaan frekuensi yang lebih tinggi dari frekuensi sinyal AC tanpa memperhatikan waktu nol dan nilai frekuensinya.

Sinyal PWM bisa diperoleh dari rangkaian pembangkit PWM (PWM generator) atau dari mikrokontroller seperti arduino. Aplikasi rangkaian dimmer lampu arduino (rangkaian dimmer arduino) bisa menggunakan perintah analogWrite().
Berikut komponen elektronika yang digunakan dalam perancangan dimmer PWM lampu 220v:
- Dioda 1N5408 4 buah
- Dioda 1N4007
- Dioda zener 10V
- Resistor 220 ohm 2 buah
- Resistor 330 ohm
- Resistor 68 Kohm
- Kapasitor 2.2 uH
- Optocoupler 4N35
- Mosfet IRF 830
- Lampu dan Fitting
Berikut skema rangkaian dimmer lampu dc/ac yang dikontrol PWM:
