Afstellen Led Dimmer

Bavelt

Golden Member

Op 11 december 2022 17:34:42 schreef MGP:
[...]

Dat begrijp ik nu niet, we zitten nu al dagen te chatten waarom je uw 555 vanaf het begin van de sinus de mosfets moet inschakelen voor een bepaalde tijd, binnen de 10mS, en je begrijpt niet waarom je dat nodig is....
Denk er eens goed over na, beter dan wat tekst lezen.. :?

Sorry, ik zal niks meer vragen.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Zoals gezegd: de 555 triggert op de zero-cross, dus daar begint de uitgangspuls ook...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lambiek

Special Member

Op 11 december 2022 17:47:00 schreef Bavelt:
Sorry, ik zal niks meer vragen.

Geen sorry zeggen, is een normale vraag.

Bij leading edge wacht je een X tijd na de nuldoorgang voordat je de lamp ontsteekt. Hoe langer je wacht hoe meer de lamp gedimd is.

Heb je deze al eens gelezen.

https://www.circuitsonline.net/artikelen/view/53/8

Als je haar maar goed zit, GROETEN LAMBIEK.
Arco

Special Member

TS vraagt niet wat leading/trailing edge is (dat weet 'ie al), maar waarom deze schakeling trailing edge 'doet'...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 11 december 2022 18:04:27 schreef Lambiek:
[...]
Geen sorry zeggen, is een normale vraag.

Een sorry is idd overbodig maar na een topic van 142 berichten waar met handen en voeten uitgelegd wordt wat je moet doen en waarom en dan zo'n vraag stellen daar zakt de moed van in mijn schoenen (dat mag toch?) en ik ben nochtans een heel geduldig persoon.

So what, op naar het volgende probleem.

LDmicro user.
Bavelt

Golden Member

Op 11 december 2022 18:34:00 schreef MGP:
[...]
Een sorry is idd overbodig maar na een topic van 142 berichten waar met handen en voeten uitgelegd wordt wat je moet doen en waarom en dan zo'n vraag stellen daar zakt de moed van in mijn schoenen (dat mag toch?) en ik ben nochtans een heel geduldig persoon.

So what, op naar het volgende probleem.

Een heleboel berichten idd over hoe ik een puls krijg op de trigger ingang van de timer, hoe de zero cross detectie goed te krijgen, een testopstelling maken met andere spanning dan 230V , etc, etc.
Beetje door pech achtervolgd omdat ik defecte componenten had.
krabbelen een weer opstaan. Uiteindelijk steeds dichter bij de oplossing.

En na de bijna voltooiing voor mezelf (en het forum) nog even recapituleren.
Hoe heb ik het doel bereikt? Hoe zat het ook alweer? Waarom is dit geen leading- en wel trailing edge? Kan ik dat zó iemand uitleggen? Dat had ik even niet scherp.

Die laatste vraag bleek teveel...
En ontmoedigt mij nogmaals om een topic te starten. De hobby electronica ten spijt.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Gewoon doorgaan, de aanhouder wint... ;)
Dat sommigen antwoord geven op iets anders als wat je gevraagd hebt kun jij niks aan doen...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lambiek

Special Member

Op 11 december 2022 18:34:00 schreef MGP:
en dan zo'n vraag stellen daar zakt de moed van in mijn schoenen (dat mag toch?)

Natuurlijk mag dat, ik neem het je ook niet kwalijk. ;)

Als je haar maar goed zit, GROETEN LAMBIEK.
Bavelt

Golden Member

Ondanks dat het projectje al af was, ben ik - mede op inspiratie van Arco -, toch maar even hiermee doorgegaan. Gewoon omdat het leuk is.

Ik heb voor de zero cross detectie gebruik gemaakt van een AC Optocoupler.
Geen ELP20, maar een LTV 814, puur omdat het plaatselijke winkeltje die had.
Het ding werkt prima. Met 1K5 weerstanden in de AC ingangen krijg ik een keurige puls, en dus ook geen diodebrug meer nodig.

Dan heb ik de 555 vervangen door een uC. Omdat ik me herken in wat Arco zo treffend schetst het dikwijls 'ge-emmer' is om die dingen aan de praat te krijgen. Er is altijd wel wat met die chip.

EN omdat ik het werken met PIC's leuker vindt. Zonder gerommel met RC-waarden.

Daarom koos ik voor de mij vertrouwde PIC16F1847. Ik gebruik daarvan nu PORTA.0 als analoge ingang, waar ik de loper van een potmeter van 50K heb gehangen (andere einden aan VCC en GND). Ik had zelf nog niet eerder met analoog gewerkt, dus een mooie test. EN een programmaatje gemaakt Om met de potmeter de pulslengte te variëren (die uiteindelijk tzt de MOSFETS gaan aansturen).
De puls die van de Optoupler komt, triggert de Interrupt op PORTB.4 Dan start ik de timer die om de 1 mS een timer interrupt geeft.
Met de waarde van de Potmeter vertaald naar een getal (potmeter rond = 100%) bepaal ik dan hoe lang de puls (LATB.5) hoog moet blijven.

Het werkt allemaal ook nog.

De vraag die ik nu heb is: Doe ik het een beetje goed zo (zie MB-programma hieronder)? Met name de lage waarde van de puls geeft wat onregelmatigheden:

Bij waarden kleiner dan 3ms zie je dat hij na 1 mS weer heel even naar 0 gaat (bij de negatieve flank van de pulsingang). Bij hogere waarden gaat het wel goed.

pic basic code:

Program Dimmer
'====================================================================================================
' Project name: Dimmer
' MCU:          PIC16F1847
' Oscillator:   Internal 8 MHz
' Input Pulse   LATB.4                  Pin 10
' Output Pulse  LATB.5                  Pin 11
' Potmeter      PORTA.0                 Pin 17

 Dim PulseLen   As Byte
     Cnt1       As Byte
     Pot        As Float

'====================================================================================================
Sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'====================================================================================================
  If IOCBF4_Bit = 1 Then              'Interrupt on change Portb.4
     LatB.5     = 1
     Cnt1       = 0                   'Reset counter
     TMR2ON_bit = 1                   'Start Timer
     IOCBF4_Bit = 0                   'Reset Interrupt on change flag
  End If
  If TMR2IF_bit = 1 Then              'Interrupt on timer
     Inc(Cnt1)
     If Cnt1 = PulseLen Then          'Puls length reached
        LatB.5     = 0
        TMR2ON_bit = 0                'Stop Timer
        Cnt1       = 0
     End If
     TMR2IF_bit = 0
  End If
End Sub

main:

OSCCON =  %01110000                   '8Mhz Internal
ANSELB =  %00000000                   'All Port B Digital
ANSELA =  %00000001                   'PortA.0 analog
TRISB  =  %00010000                   'B.4 Input
TRISA  =  %11111111                   'All Port A Input

LatB.5 = 0

ADC_Init()                            'Init ADC

GIE_Bit    = 1
IOCIE_Bit  = 1
IOCBP4_Bit = 1
IOCBN4_Bit = 0
  
PR2        = 249
T2CON      = %00001101                'Pre: 4 Post: 2
TMR2IE_bit = 1
TMR2ON_bit = 0
PEIE_bit   = 1
Cnt1       = 0

While True
 Pot = ADC_read(0)
 PulseLen = Pot / 100
Wend

end.
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De belasting van een A/D input moet 10k of lager zijn. (daarboven werkt het nog wel, maar is lang niet lineair meer; veel hoger werkt helemaal niet)
Is die onderste lijn de opto uitgang, of de gemaakte puls? En wat is de tijdbasis? (ms/div)

Bij 'vieze' netspanning kun je soms meer als 1 nuldoorgang detecteren, heb ik ook wel meegemaakt...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

De bovenste lijn is de opto ingangspuls. De onderste de Output van de PIC.
De verdeling is 1mS/div.

Het lijkt geen viezigheid op de AC. Zodra ik de potmeter richting pulslengte 2mS draai, is die 'dip' naar beneden weg.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Op de uitgang van de opto kun je zien of er soms meerdere pulsen zijn...

Waarom is Pot een float? (ik zie daar geen nut voor, een word is voldoende...)
Float kan in sommige gevallen ook onverwachte resultaten geven bij deling door integere getallen.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Een float hoeft inderdaad niet. Dat werd gebruikt in een ander voorbeeld.
Als ik echter de minimale pulsbreedte even vastzet op 1, dus niet uitlees uit de potmeterstand, gaat het hierbij ook niet goed.

Het lijkt er net of of bij deze pusbreedte de interrupt ook reageert op de negatieve flank van de puls van de optocoupler. Dat zou niet moeten omdat ik

pic basic code:

IOCBN4_Bit = 0

heb gezet.

Maar exact bij de negatieve flank start hij een tweede puls op.

pic basic code:

Program Dimmer
'====================================================================================================
' Project name: Dimmer
' MCU:          PIC16F1847
' Oscillator:   Internal 8 MHz
' Input Pulse   LATB.4                  Pin 10
' Output Pulse  LATB.5                  Pin 11
' Potmeter      PORTA.0                 Pin 17

 Dim PulseLen   As Byte
     Cnt1       As Byte
     Pot        As Word
     
     i1         As Byte
     

'====================================================================================================
Sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'====================================================================================================
  If IOCBF4_Bit = 1 Then              'Interrupt on change Portb.4
     LatB.5     = 1                   'pulse output high
     Cnt1       = 0                   'Reset counter
     TMR2ON_bit = 1                   'Start Timer
     IOCBF4_Bit = 0                   'Reset Interrupt on change flag
  End If
  If TMR2IF_bit = 1 Then              'Interrupt on timer every 1 mSec
     Inc(Cnt1)
     If Cnt1 = PulseLen Then          'Puls length reached
        LatB.5     = 0
        TMR2ON_bit = 0                'Stop Timer
        Cnt1       = 0
     End If
     TMR2IF_bit = 0
  End If
End Sub

main:

OSCCON =  %01110000                   '8Mhz Internal
ANSELB =  %00000000                   'All Port B Digital
ANSELA =  %00000001                   'PortA.0 analog
TRISB  =  %00010000                   'B.4 Input
TRISA  =  %11111111                   'All Port A Input

LatB.5 = 0

ADC_Init()                            'Init ADC

GIE_Bit    = 1
IOCIE_Bit  = 1
IOCBP4_Bit = 1
IOCBN4_Bit = 0
  
PR2        = 249
T2CON      = %00001101                'Pre: 4 Post: 2
TMR2IE_bit = 1
TMR2ON_bit = 0
PEIE_bit   = 1
Cnt1       = 0

While True
 'Pot = ADC_read(0)
' PulseLen = Pot / 100

 PulseLen = 1

Wend

end.

[Bericht gewijzigd door Bavelt op dinsdag 20 december 2022 15:18:48 (68%)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Als 'ie ook op negatieve puls reageert kun je testen:

pic basic code:


  If IOCBF4_Bit = 1 Then              'Interrupt on change Portb.4
    If PortB.4   = 1 Then
      LatB.5     = 1                   'pulse output high
      Cnt1       = 0                   'Reset counter
      TMR2ON_bit = 1                   'Start Timer
    End If
    IOCBF4_Bit = 0                   'Reset Interrupt on change flag
  End If
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ja, dan is het inderdaad weg.

Maar dat betekent dus dat de interrupt routine zowel op de positieve als negatieve flank een interrupt geeft.

Terwijl dat met IOCBP4 en IOCBN4 zou moeten worden geregeld.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Dat lijkt inderdaad niet te kloppen...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik ben iets verder gaan speuren. Ik heb het signaal uit de optocoupler even door een Schmitt-trigger gehaald, zodat ik een mooie schone ingangspuls heb.
En dan werkt het goed.

Probleem lijkt dus toch wel te zitten in de puls van de optopcouler.

Ik heb deze even uitvergroot en krijg dan onderstaand plaatje ('het 'wiebelt' ook een beetje in x-richting):

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Klein condensatortje over de opto output kan helpen. (en/of de pull-up of -down groter maken van de opto output)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Dat biedt heel ietsjes soelaas: Pull-Up van 4K7 naar 10 K en C-tje van 4n7 over de opto output.

Wat ook een stabielere puls geeft, is als ik een delay inbouw voordat de output-puls wordt gemaakt: ik wacht dan tot de hele ingangspuls voorbij is, (die duurt ook precies 1ms), dan wacht ik 2mSec.

pic basic code:

 If IOCBF4_Bit = 1 Then              'Interrupt on change Portb.4
     Delay_MS(2)
        LatB.5     = 1                'pulse output high
        Cnt1       = 0                'Reset counter
        TMR2ON_bit = 1                'Start Timer
     IOCBF4_Bit = 0                   'Reset Interrupt on change flag
  End If
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Je weet wel dat delay loops in een interrupt een no-no zijn, toch... ;)
(trouwens komt het inschakelen dan ook niet meer in de nuldoorgang, maar 2ms later...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ja, klopt. Het was even als test; hij is er al weer uit :)

De beste onderdrukking is toch de afvraging If PORTB.4 = 1 -etc-

Nu nog wat puzzelen om de stappen wat egaler te maken.

De ADC_READ(0) geeft een 10 bits resultaat: dus 0 - 1024.

Ik deelde dat door 100 en kreeg daardoor 10 stappen. Maar de timer staat op 1 ms. Dat is in verhouding tot de ingangspuls (10 mS) waarschijnlijk te grof.

Het testledje zie je dan ook duidelijk 'sprongen' maken als je aan de potmeter draait.

Misschien de timer iets hoger zetten om een wat egaler verloop te krijgen.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Dat was niet zo moeilijk: PR2 op 24 en delen door 10...
Dan worden het 100 stappen van 0 naar 10 mS

Werkt best wel leuk zo! :)

[Bericht gewijzigd door Bavelt op woensdag 21 december 2022 00:18:38 (14%)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 19 december 2022 00:08:52 schreef Arco:
De belasting van een A/D input moet 10k of lager zijn. (daarboven werkt het nog wel, maar is lang niet lineair meer; veel hoger werkt helemaal niet)

Kan ik dat ergens in de datasheet lezen? Ik heb er op lopen zoeken maar niet zo snel tegengekomen...

Ik heb als pormeter inmiddels 5K gekozen.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Tjonge, had ik daar nooit zo gevonden...

Thx!

Fouten zijn het bewijs dat je het probeert..