Sari la conținut
ELFORUM - Forumul electronistilor

Light dimmer cu PIC12F cod sursa


Mondan

Postări Recomandate

  • Răspunsuri 37
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Mondan

    18

  • Liviu M

    7

  • nico_2010

    5

  • ventzel

    5

Top autori în acest subiect

Imagini postate

PIC-ul a fost alimentat dintr-un acumulator de 3.7V. La fel.

GP2=1 ; triac aprins , becul sta aprin fara sa clipesca.

 

Loop:

goto Loop

GP2=0 ; triac srtins , becul sta stins

Loop:

goto Loop

 

Cand faci dimming, se face, dar becul clipeste la o frecventa joasa vreo 1-2Hz.

----------------------------------------------------

 

<Ar trebui sa faci cel putin o verificare suplimentara cat dureaza fiecare perioada intre 2 treceri prin zero. Daca ai echivalentu a 9-11ms sa zicem consideri ca ii ok.>

Merita incercart, desi zic ca prin asta stricam 'farmecul' sincronizarii.

Sau sa incerc ca sincronizarea sa se faca o data la 5 perioade.

 

<Daca nu, faci resincronizare si astepti urmatoarea perioada.>

Pai tocmai ii mai dam o clipire daca sarim din perioade.

 

 

Altceva,

La ce tensiune pinul ala INPUT este considerat in 0 logic ?

Pai la sub 0.8 (la Vdd=5V)

Cat timp intrarea are tensiunea asta ?

 

Uin=310V*sin(2*3.14*50*t)

Uin=310V*sin314*t)

Uin<0.8V

 

 

Acum,

am 1uS/ instructiune

 

btfsc port, pin  ;1uS

gorto $-1   2uS

Abs(Uin)<0.8V

doar pentru 16uS ar fi sinusoida sun 0.8V.........

Link spre comentariu

Cand faci dimming, se face, dar becul clipeste la o frecventa joasa vreo 1-2Hz.

 

Apare la orice nivel sau numa la intensitati mici?

Calculu temporizarii din zero pana la comanda triacului cum o faci? Perioada retelei ar trebui masurata intre 2 treceri prin zero si ajustata eventual la fiecare ciclu daca ea ii intre anumite limite, cel mai simplu prin media aritmetica cu valoarea precedenta. Pe valoarea asta a perioadei calculezi temporizarea in functie de ce luminozitate vrei. 

Daca prinzi o perioada care nu se incadreaza in limite ii mai bine sa ignori ciclu respectiv. Poti avea o situatie in felu urmator: ai la t0=0 o detectie corecta la trecerea prin zero, faci temporizare 6ms pana la comanda triacului, si la 7ms ai o detectie gresita a trecerii prin zero. Urmaeaza iara 6ms temporizare si iti da comanda la triac la 13ms de t0 care ii defapt pe urmatoarea semiperioada a retelei la 3ms de trecerea prin zero reala. 

Pana nu pui codu sursa nu am idee care ii situatia si mai mult nu pot presupune.

 

Trecerea prin zero la schema asta ii foarte aproape de trecerea prin zero real a retelei. Probleme de diferente de faza apar la schemele cu rezistenta-optocuplor sau detectia dupa un transformator coborator de tensiune cazuri in care momentu cand controlleru "vede" 0 pe pinu respectiv ii cu cateva zeci-sute de us inainte.

Link spre comentariu

<Apare la orice nivel sau numa la intensitati mici?>

Apare si la intensitati mici si la intensitati mari.

Numai cand e complet aprins sau complet stins nu apare (deci fara citirea trecerii prin 0)

 

 

<Calculu temporizarii din zero pana la comanda triacului cum o faci?>

Am pus in Proteus generator de semnal 50Hz (100Hz dupa redresare)

Delay-ul a fost astfe ajustat:

post-183833-0-88949600-1424494011_thumb.jpg

[galben- semal retea]

[rosu- semnal in pin detectie trecere prin 0 , maxim 5V]

[albastru - semnal in poarta tiristor ref. T1 ]

 

 

<Perioada retelei ar trebui masurata intre 2 treceri prin zero si ajustata eventual la fiecare ciclu daca ea ii intre anumite limite>

Asta ar fi un algoritm prea complex pentru un dimmer, da putin in inteligenta artificiala. Dar il voi incerca.

 

 

 < ai o detectie gresita a trecerii prin zero>

Ce ar putea sa genereze asta ?

 

<Pana nu pui codu sursa nu am idee care ii situatia si mai mult nu pot presupune.>

Eu il pun, dar e in ASM pt. ca folosesc totusi un integrart cu memorie limitata:

 

	list      p=12f675          	#include <p12f675.inc>        	errorlevel  -302             	__CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _INTRC_OSC_NOCLKOUT  ;;;;w_temp        EQU     0x20      del1         EQU    0x25del2         EQU    0x26del3         EQU    0x27simDC        EQU    0x28 ;**********************************************************************		ORG     0x000             ; processor reset vector;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GP5 e un LED care are o conexiune fixa la +;;;;GP2 iesirea tiristor;;;;;;  citire tensiune retee - pe GP1;;;;         ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Main;;;;;;;;;;;;;;;;;;;;;;;;;; initializare port ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;bcf STATUS, RP0clrf GPIOmovlw 0xFF       movwf CMCON       ;; digital I/Obsf STATUS, RP0clrf ANSELmovlw 0xFF        ;; toate pe input, movwf TRISIObcf TRISIO,2      ;;  GP2 pe output - tirtistrr sau LED optocupl.bcf TRISIO,5      ;;  LED bcf STATUS, RP0   ;;  TRIS  Bank 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AsteptPush:;----------------- start daca se apasa push ---------------------------------------------------AstepatPB:btfsc GPIO,0  goto AstepatPB;----------------------------------------------------------------------------------------------Repeta:;===========================================================================================;;        Repata la fiecare ciclu sinus ;;;;;;===========================================================================================AstepatR:btfsc GPIO,1  ;; asteapta tensiune retea se apropie de 0V (coboara);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;goto AstepatRmovlw 0x0F    ;; Toff minim "PWM"movwf del1    Delay1:nop    nopnopdecfsz del1,Fgoto Delay1;+++++++++++++++++ Aici un delay variabil +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++movf simDC,0xE0 ;; peroada stins   - FF maxim movwf del1    Delay12:nop               nopnopnopnopnopnop               nopnopnopnopnopnop               nopnopnopnopnopnopnopnopnopnopdecfsz del1,Fgoto Delay12bsf GPIO, GP2 ;; pune iesirea pe 1              ;; Aprinderea trisoruluimovlw 0x0F;; delay cat tine tirisorul aprins - FF e 1/2 din 50Hz movwf del1    Delay12T:nop               nopnopnopnopnopnop               nopnopnopnopnopnop               nopnopnopnopnopnopnopnopnopnopdecfsz del1,Fgoto Delay12Tbcf GPIO, GP2 ;; stingerea tristoruluigoto Repeta  	END                       ; directive 'end of program'

Sunt lasate multe nop-uri pentru cain timp ce face delay va face si altceva.

Repet: in Preoteus nu se observa problema, doar in montajul real. Am folosit in simulare exact acceleasi valori de rezistori ca in montajul real.

Link spre comentariu

Da. s-a rezolvat la acest punct. Au fost detectii false de 0. L-am probat 5 min la intensitate scazuta si nu a clipit.

 

-----------------------------------------------------------

Acum parte a doua:

 

Se va seta sa:

- porneasca din fluier, stinge din push

- pornesaca din push, singe din fluier

- porneasca si stinge din fluier

 

Deci in timp ce becul e aprins si el isi face algoritmul mai sus amintit;

- va citi daca push este apasat scurt sau lung (are doua functii)

si

- va sesiza daca cineva fluiera.

 

In C e dificil de scris asta, ca in interiorul unui delay sa definesti alte functii, dar delay-ul "sa ia" tot atat timp.

---------------------------------------------------------------------------------

 

Cum am fost 'acuzat' ca vrea sa fur idei:

http://www.elforum.info/topic/87668-amplificator-operational-din-pic16f-si-breloc-cu-fluer/

 

Inca studiez programul de aici.

Montajul astepta fluieratul la 2 khz. Dar el nu masoara perioada intre maxim si minim. Astepta de la maxim un timp predefinit si citeste daca apaut minimul.

 

Pentru a gasi frecventa peredominanta 2KHzarr fi un FFT, dar la PIC12F nu cred ca e folosit. 

Si va invit la acea discutie daca veti vrea.

Editat de Mondan
Link spre comentariu

Ar fi fost dificil in C de facut delay cat becul e aprins.

 

Am facut diferenta intre

- push apasare scurta si

- push apasare lunga

 

numarand in cate perioade push-ul a fost "gasit" apasat.

De ex: la 100Hz dupa redresare, daca in 100 de perioade succesive push-ul a fost 'gasit' apasat,

atunci a fost apasat pentru 1 secunda , deci e press long

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări