Hallo,

Ik heb hier een lichtdimmer met een bta 06.400g triac er in die werk nog goed maar met potmeter, die is 500K en door de potmeter lopen spanningen van max 200V.

Nu wil ik deze sturen met een avr , maar hoe ?

ik heb hier nog wel optokoppelaars liggen: moc3041 (tlp3041)

transisors
11x BD139
12x BD140
1x Buzz11

5x 12 volt relais

kick (edit: sorry ik zal me beter gedragen)

[Bericht gewijzigd door Ibanez op ]

evt. vervangen door een tor die een hoge spanning kan hebben, en een laagspanningspotmeter. Moet wel te doen zijn op de één of andere manier.

Waarom een microprocessor gebruiken om een potmeter te vervangen? Klinkt niet echt logisch iig.

Heb je haast? Na een uur al kicken...

Google er eens op. Heb hier wel het eea. aan links voorbij zien komen, met name voor de nuldoorgangsdetectie. Kwam dat niet van LaStei af?? (die zit zelf dacht ik meer in de pic-ding hoek, maar het principe zal niet anders zijn)

als ik 5 weerstanden van 100K pak dan kan ik met die 5 relais dus een weerstand ladder bouwen, en dus kiezen tussen , 100 200 300 400 500 K

Zou dat werken?

Zucht. Google ja!

Zo direct gaat 't niet werken. Je kunt dus het best iets nieuws bouwen met een AVR.

Kijk bijvoorbeeld eens op:
http://semitone.sourceforge.net/wiki/index.php/Semitone_Crystal

Met een potmeter en een tor ga je veel te veel vermogen verstoken in die tor.

Opties voor de AVR zijn fase aansnijding, fase afsnijding of gelijkrichten en dan aansturen met PWM.

Een triac is niet geschikt voor PWM omdat die eenmaal in geleiding blijft geleiden. Bij wisselspanning is dat geen probleem omdat hij bij de nuldoorgang weer stopt met geleiden.

Fase aansnijding is waarschijnlijk het makkelijkste. Je moet eerst een circuit hebben waaruit je de nuldoorgang (100 maal per seconde) van de wisselspanning kan meten zodat je daarop kan synchroniseren. Na de nuldoorgang start je een timer die loopt tot maximaal de volgende nuldoorgang. Wanneer de timer zijn waarde bereikt heeft ontsteek je de triac. Hoe langer je wacht hoe minder licht.

Een MOC3041 is niet geschikt omdat daar een nuldoorgang detectie circuit in zit, die onsteek dus alleen direct na de nulldoorgang niet midden in de sinus. Een MOC3021 is wel geschikt.

Ik denk dat het eenvoudiger is, een dimmer te bouwen op basis van een avr dan een bestaande dimmer aan te passen. Als is dat laatste min-of-meer te doen door de potmeter te vervangen door een LDR (of 2) en de avr via PWM een lampje te laten opgloeien.

Ik bedoelde dat je de potmeter vervangt door een tor en een potmeter die je minder spanning laat verstoken. En dat je dat dan weer aan de triac vast hangt.

dan pak ik het ff simpel aan als nood oplossing, stappenmotor drijft nu de potmeter aan.:)

Als je belangstelling moest hebben: de trappenhuisautomaat hier is in feite een avr-gestuurde dimmer, die na verloop van tijd het licht zachtjes dooft ipv. het abrupt te doven op het ogenblik dat je ergens in 't midden van de trap staat. 't Is wel een project, waarbij de avr rechtstreeks aan het net hangt!

Hier heb je het schema:
http://www.uploadarchief.net/files/download/TraphalDimmer.png
De broncode is geschreven voor een ATmega8 (ik had toen niets kleiners in huis; een ATtiny13 kan net zo goed de was doen). Als j'r niet uitkomt, roep maar...


/*
  Traphaldimmer

  De software voor een elektronische trappenhuisautomaat, die reageert op
  de wijze waarop de druktoets ingedrukt wordt (heel kort - normaal - lang)
  en het licht, na het verloop van de gekozen tijd, langzaam laat doven.
  Dit is de 8MHz-versie!

  Pros 2006
*/

#define SYSCLK 8000000UL
#define JA  1
#define NEE 0
#define MAXTIME 50000


#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif

#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

#define delay(x) t = x;\
                  while (t > 0)\
                      t--


#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>


volatile unsigned int status, dimtime, toetstime;
volatile unsigned char dimmen;
unsigned int t;


// Init PD2 als INT0
void enable_INT0(void)
{
  cbi(DDRD, PD2);		       // PD2 = ingang
  sbi(PORTD, PD2);		       // Pull-up weerstand inschakelen
  sbi(MCUCR, ISC01);		       // 1 0 The falling edge of INT0 generates an interrupt request.
  cbi(MCUCR, ISC00);
  sbi(GICR, INT0);
}


// Init PD3 als INT1
void enable_INT1(void)
{
  /*
     MCUCR-register
     ISC11 ISC10 Description
     0 0 The low level of INT1 generates an interrupt request.
     0 1 Any logical change on INT1 generates an interrupt request.
     1 0 The falling edge of INT1 generates an interrupt request.
     1 1 The rising edge of INT1 generates an interrupt request.
   */
  cbi(DDRD, PD3);		       // PD3 = ingang
  sbi(PORTD, PD3);		       // Pull-up weerstand inschakelen
  sbi(MCUCR, ISC11);
  cbi(MCUCR, ISC10);
  sbi(GICR, INT1);
}


// De timer1 interrupt-routine
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
  if (status == 1) {		       // Eerste timer-interrupt
    cbi(PORTC, PC5);		       // 0 = triac ontsteken
    status = 0;
    OCR1A = 20;			       // Korte timertijd instellen
    TCNT1 = 0;			       // Counter terug op 0 zetten
  } else {			       // Tweede timer-interrupt
    sbi(PORTC, PC5);		       // 1 = triac doven
    cbi(TIMSK, OCIE1A);		       // Timer 1 stoppen
  }
}


SIGNAL(SIG_INTERRUPT0)		       // een interrupt op PD2
{
  unsigned int t;
  // INT0 is verbonden met de nuldoorgangsdedector, en wordt bijgevolg 100 x per seconde geactiveerd

  if (dimtime < MAXTIME) {	       // Als de minimum-lichtsterkte nog niet bereikt is...
    if (dimmen == JA) {
      dimtime += 3;		       // Lichtsterkte verminderen
    }
    t = dimtime / 50;		       // t = max. 1000!!!
    if (t < 100) {
      cbi(PORTC, PC5);		       // triac onmiddelijk ontsteken
      t = 60;			       // Minimum-waarde voor timer
    }
    status = 1;
    OCR1A = t;
    TCNT1 = 0;			       // Counter terug op 0 zetten
    TIMSK = (1 << OCIE1A);	       // Timer 1 starten
  } else {
    sbi(PORTC, PC5);		       // 1 = triac doven
  }
}


void init(void)
{
  sbi(DDRC, PC5);		       // PC5 = uitgang
  sbi(DDRC, PC4);		       // PC4 = uitgang
  cbi(DDRB, PB0);		       // PB0 = ingang
  sbi(PORTB, PB0);		       // Pull-up weerstand inschakelen
  status = 1;
  TCCR1A = 0x00;		       // disable PWM and Compare Output Mode
  TCCR1B = (1 << CS10) | (1 << CS11);  // Gebruik de 256-prescaler
  TCNT1 = 0;
  OCR1A = 1000;
  enable_INT0();
  sei();			       // Globale interrupt-vlag aan
}



/*
  We hebben 3 taken te vervullen:
  A) De drukknoppen pollen
  B) Tijdens een nuldoorgang een timer starten, die na afloop (max 90mSec) de triac ontsteekt
  C) Na de gekozen tijd het licht langzaam dimmen

  A wordt uitgevoerd door de main-routine
  B en C vormen de taak v/d INT0-routine

  "dimtime" is omgekeerd evenredig met de helderheid van de lampen
  "minuterietime" bepaalt hoe lang het licht blijft branden, voor het dimmen een aanvang neemt
*/

int main(void)
{
  unsigned long int minuterietime;
  unsigned char flipflop = 0;

  init();

  dimmen = NEE;
  dimtime = MAXTIME;		       // Licht uit
  minuterietime = 0;
  toetstime = 0;

  while (1) {			       // Deze lus wordt 1000 x per seconde uitgevoerd
    if (bit_is_clear(PINB, PINB0)) {   // Drukknop ingedrukt?
      if (dimtime > 51) {	       // Als de lamp nog niet op volle kracht brandt
	dimtime -= 40;		       // Licht zachtjesaan naar volle kracht
	minuterietime = 15000;	       // Na 15 sec terug dimmen
      } else {			       // Lamp brandt reeds op volle kracht
	if (minuterietime < 600000) {  // Max 10 minuten
	  minuterietime += 100;	       // 1/10 sec bijtellen
	}
      }
      dimmen = NEE;		       // Niet dimmen, tot (minuterietime == 0)
    } else if (minuterietime > 0) {
      minuterietime--;
    }
    if (minuterietime == 0) {	       // minuterietime afgelopen; dimmen is toegestaan
      dimmen = JA;		       // Het dimmen zelf wordt door de INT0-routine uitgevoerd
    }
    if (flipflop == 0) {
      cbi(PORTC, PC4);
      flipflop = 1;
    } else {
      sbi(PORTC, PC4);
      flipflop = 0;
    }
    delay(2000);		       // 1 mS wachten
  }
}

Op 9 januari 2007 18:50:42 schreef Ibanez:
kick

Ongeduldig?

Ongepaste kick... topic kan dan best plotseling een dagje op slot zitten.

Hallo,

Ik heb een vraagje/opmerking bij dit circuit. Ik ben aan iets gelijkaardig bezig, enkel wil ik er een gewone digitale dimmer van maken, gebaseerd op een ATmega 8 AVR. Ik ben nu echter sinds gisteren al meer dan 12u bezig met het zoeken naar een probleem waar ik maar niet vanaf geraak. De avr stuurt de gate van mijn TIC206M aan via een MOC3022 maar wat ik ook probeer, de triac wilt maar niet schakelen... Mijn redenering klopt toch ook als ik zeg dat als ik gewoon 5V aanleg en dus eigenlijk de triac constant aanstuur, de lamp (75W) die ik ermee verbonden heb toch ook constant zou moeten branden?
Ik krijg het probleem maar niet opgelost, ik weet nu ook niet of ik mijn MOC3022 heb verwoest maar denk het niet... Misschien moet ik de TRIAC proberen te triggeren via een transistor maar ik had het geheel liever volledig elektrisch gescheiden gehouden (voor de zero crossing gebruik ik ook een transfo voor galvanische scheiding).

Hopelijk kan iemand mij verderhelpen want ik zoek mezelf nog dood met die probleem

De MOC3022 kan je rechtstreeks vanuit een AVR-pin sturen via een weerstand van 330Ω. Of, om te testen, via dezelfde weerstand rechtstreeks vanaf 5V.
Hoe je met de MOC3022 een triac stuurt, staat beschreven in de datasheet v/d MOC.

Hallo,

Dat heb ik allemaal zo gedaan, ook via die weerstand. Echter ik krijg de triac maar niet ontstoken, mijn lamp blijft niet branden. Ik ben nu teruggevallen op een zeer simpel test-circuit zoals beschreven hierboven maar ik stuur dan de T6 aan via de voeding van 5V. Echter de TRIAC wil nog steeds niet geleiden.. Op het schema is de TRIAC's A1 verbonden met GND maar dit moet toch gewoon L1 zijn (230V) neem ik aan?
Maar als ik dit zo bouw brandt de lamp nog steeds niet... Ik kan het echt niet meer geloven, ik heb nog al dimmer circuits proberen te bouwen en nog nooit is er 1 gelukt, precies een vloek of ik doe iets heel elementair verkeerd maar in algemeen kan je een traic toch gewoon bezien als een schakelaar die je via een klein stroompje kan sturen..

Hallo,

Ik heb het ondertussen aan de praat gekregen.

Weet je ook, wàt er precies fout was?

Had oorspronkelijk het circuit gemaakt zoals voorgesteld in de datasheet van de MOC maar dat met de resistive load. Nu zorgt de ontstoorspoel er eigenlijk al voor dat het geheel dus een inductive load was en heb dan maar eens geprobeerd om het circuit zo te bouwen en met succes.
De dimmer is nu volledig digitaal aan te sturen met mijn AVR en alles werkt perfect.
Het enige wat ik mij nog afvraag, het schema hierboven, kan dit ook werken? Dus een transistor gebruiken ipv een MOC. Ik had dit eens vlug getest maar krijg de TRIAC maar niet aan. Het lijkt mij ook allemaal vreemd aangezien je een DC spanning 0 of 5 V aanlegt aan de gate van de triac maar wat is dan je referentie aangezien M1 en M2 verbonden zijn met wisselspanning die dus ook negatief gaat..

Je kunt een triac in alle 4 de kwadranten ontsteken; dus met een positieve of negatieve spanning op de gate t.o.v. A1, en dat terwijl er een positieve of negatieve spanning over A1-A2 staat. Linksom of rechtsom moet je dus gewoon de gate bij A1 vandaan trekken, maakt niet uit in welke richting.

Ja, dat kan. Je kan een negatieve stroom schakelen door de gate van een positieve stroom te voorzien.
Er zit wel een addertje onder 't gras: een triac kent 4 quadranten wat aansturing betreft. Gate positief of negatief, gecombineerd met belasting negatief of positief. Laat nou de vierde quadrant (gate positief, belasting negatief) meer gate-stroom vergen om betrouwbaar te werken dan de overige drie. Soms wel het dubbele!

Daar moet je rekening mee houden. Nu merk je het bij een lamp snel, als de triac bij negatieve belastingsstroom niet goed wil schakelen. De lamp gaat aardig flikkeren.
Wil je echter een inductieve last schakelen, een trafo bv., dan kan je het ergste verwachten. Doordat de trafo geen wisselspanning meer krijgt, maar enkel halve sinussen, raakt de kern in verzadiging en neemt de stroom zienderogen toe, wat zich kenbaar maakt door rook- en geursignalen. En als je even pech hebt door heuse vlammen.

Het kan dus met een transistor, als je er maar voor zorgt dat de gate meer dan voldoende stroom krijgt.
Een andere optie bestaat er in, de positieve voedingsrail als gemeenschappelijke leiding met de MT1 v/d triac te nemen. Dan wordt de gate altijd negatief gestuurd, en vermijdt je die vierde quadrant.
Of je stuurt via een MOC, wat wellicht nog het beste is.

Ik had nog overwogen om dat te vermelden, maar ik dacht ik houd het nog een beetje simpel. Het handigste is om ofwel die 4de kwadrant helemaal te vermijden, of de gatestroom zodanig te kiezen dat het daar goed gaat, dan gaat het in de overige kwadranten ook wel goed.

Een MOC is altijd wel aan te raden, zeker voor beginners wat betreft hoogspanning en/of elektronica in het algemeen. De rest van de schakeling hoeft dan niet aan de hoogspanning te hangen, zodat je daar rustig aan kunt rommelen, meten en een niet-galvanisch gescheiden programmer aan kunt hangen.