Página 1 de 2

[Ajuda] Dimmer para LED 3W - PIC12f629

MensagemEnviado: 04 Abr 2010 02:20
por rmateus
Olá a todos!

Estou montando uma lanterna com LED's de 3W e há alguns dias achei na rede este circuito com PIC12f629 pra controlar o LED.

Achei bem interessante, pois tem poucos componentes, o uC é pequeno e cabe em qualquer lanterna. Montei o circuito, gravei o PIC, mas não funcionou...o LED já inicia aceso e não muda a intensidade ou desliga.

Utilizei um BD140 no lugar do ZTX751.

Não consigo definir se o problema foi na gravação do PIC, no código ou no BIOS (eu) .
Pelo que pude entender, o circuito controla a intensidade do LED (2 modos+off) e possui um pisca programável, com apenas um botão.
A partir daí, não consigo interpretar corretamente o código e não encontrei mais nada sobre este circuito...


Coloquei o código no PIC SIM IDE e o programa acusa 160 erros!!! :shock:

Alguém poderia me dar uma luz?

Valeu!

P.S: Entendo muito pouco de programação...só o basicão mesmo!!!

Imagem

Código: Selecionar todos
;*******************************************************************
;     G.SAMBLANCAT - SUPER LUXEON LEDS 2005 - ZTX751
;
;*******************************************************************
;

         list r=dec

         include "P12F629.inc"

         __config   _BODEN_OFF & _EXTRC_OSC_NOCLKOUT & _WDT_OFF &_MCLRE_OFF 


;Definitions des variables
         CBLOCK   0x20
         TPO1
         PWM               ; largeur d'impulsion On
         LEVEL            ; 0:Off, 1:economie, 2:plein regime
         OLDLEV
         VDDMES            ; inverse de Vdd
         NBTOP
         CTRLOOP
         FLAG
         PTRSOS, CTRFLASH
         CTROFFL            ; ctr d'inactivite pour faire 1 min
         CTROFFH            ; ctr "          " nb de minutes
         endc

#Define      LED      GPIO,0      ; sortie led commande
#Define      VOLT   GPIO,1

#Define      BUTTON   GPIO,2   ; bouton de reglage
#Define      DIODREF   GPIO,4

#Define      FLASH   FLAG,1   ; flag si flash mode

#Define      DELAI_BASE   060h
#Define      TIMEOFF      60   ; minutes inactivite avant extinction

BANK0      macro
         bcf      STATUS,RP0
         endm
BANK1      macro
         bsf      STATUS,RP0
         endm

;*************************************************************
;    VARIATEUR DE SUPERLED
;*************************************************************
         org      0
         
start        bsf      LED
         bsf      DIODREF
         movlw   b'11101110'      ; dioderef + led en sortie
         BANK1
         movwf   TRISIO
         movlw   04
         movwf   WPU            ; seul BUTTON en pull-up
         BANK0
         
         movlw   88
         movwf   CTROFFL
         movlw   TIMEOFF
         movwf   CTROFFH
         
         movlw   b'00000000'      ; prescaler 1:2
         option
         
         movlw   b'00000100'      ; Vref=int, Cin- GP1
         movwf   CMCON
         
         clrf   LEVEL         ; lumiere eteinte
         clrf   NBTOP
         bcf      FLASH

main0      movlw   DELAI_BASE
         movwf   CTRLOOP

;Mesure indirecte de Vdd dans VDDMES par la ref
         movlw   b'10000100'
         BANK1
         movwf   VRCON
         BANK0

loopmes      BANK1
         incf   VRCON,1         ; incr. Vref jusqu'au
         BANK0               ; basculement
         btfss   CMCON,COUT
         goto   loopmes
         
         BANK1
         movf   VRCON,0
         andlw   0fh
         BANK0
         movwf   VDDMES

;Ici on a   Vdd = 5v -> 8   -> 048h voulu
;         Vdd = 3v -> 14   -> 07fh voulu
         call   SETVDDMES
         movwf   PWM         ; 5V -> VDDMES=048h

;------- Boucle principale - Top sur la led ----------
Mainloop   bsf      LED
               
;Teste si mode flash en cours
suite_run   btfsc   FLASH      ; va au mode flash
         goto   eclats

;passe a la suite si 100% eteint
loop0      movf   LEVEL,0
         btfsc   STATUS,Z
         goto   pasled
         
;sinon allume led et mesure
         bcf      LED         ; courant sur la led
         
;Fait les deux demi-periodes
pasled      btfsc   LEVEL,1
         goto   plein100   ; si level<>2
         movlw   06
         movwf   PWM         ; met un faible niveau minimum
         
plein100   clrf   TPO1
loop1      incf   TPO1,1
         movf   TPO1,0
         xorwf   PWM,0
         btfss   STATUS,Z
         goto   loop1

         bsf      LED         ; eteint la led

loop2      incf   TPO1,1
         btfss   TPO1,7
         goto   loop2
      
;Teste si l'etat de la touche a change
tstkey      movf   GPIO,0
         xorwf   OLDLEV,0
         andlw   4
         btfsc   STATUS,Z
         goto   nochange
                  
;changement -> sauve etat
         movf   GPIO,0
         movwf   OLDLEV
         btfsc   BUTTON      ; =0 relache
         goto   nochange

;la touche vient d'etre appuyée
;Raz le compteur d'inactivité
         movlw   88
         movwf   CTROFFL
         movlw   TIMEOFF
         movwf   CTROFFH
   
;teste si c'est le premier top -> raz chrono
         movf   NBTOP,0
         btfss   STATUS,Z
         goto   no_razt
         movlw   DELAI_BASE   ; premier top - met le delai de scrut
         clrf   CTRLOOP

no_razt      incf   NBTOP,1      ; compte un top de plus

;Decremente le compteur de boucle
nochange   decfsz   CTRLOOP,1
         goto   Mainloop
;decremente compteur d'inactivite
         decfsz   CTROFFL,1
         goto   nododown
         movlw   88
         movwf   CTROFFL
         decfsz   CTROFFH,1
         goto   nododown
;Le delai de TIMEOFF minutes est passe : on baisse
         movlw   TIMEOFF
         movwf   CTROFFH
         goto   baisse

;un delai de base est passe (environ 2 secondes de scrutation)
;on compte les tops
nododown   movf   NBTOP,0
         btfsc   STATUS,Z
         goto   main0

         decf   NBTOP,1
         btfss   STATUS,Z
         goto   no_down
         
;********************************************************
;1 top -> on baisse le jus, plus flash
baisse      bcf      FLASH
         movf   LEVEL,0
         btfsc   STATUS,Z
         goto   fintops

;test du choix du nouveau level baissé
         movf   LEVEL,0
         btfsc   STATUS,Z      ; level 2 -> level 1
         goto   fintops
         decfsz   LEVEL,1
         goto   fintops
         
;si extinction complete...         ; level 1-> level 0
         movlw   b'11111111'      ; tout en entree
         BANK1
         movwf   TRISIO
         clrf   VRCON         ; plus de Vref
         BANK0
         call   TEMPO3M
         movlw   b'00010000'
         movwf   INTCON
         
         sleep               ; veille totale a 30uA !
         nop
         
         movlw   b'11111110'      ; remet led en sortie
         BANK1
         movwf   TRISIO
         movlw   080h
         movwf   VRCON
         BANK0
         movlw   1
         movwf   NBTOP
         goto   fintops      ; retourne en marche


no_down      decf   NBTOP,1
         btfss   STATUS,Z
         goto   no_up
;********************************************************
; 2 tops -> on monte le jus !!!
         bcf      FLASH      ; pas flash
         movf   LEVEL,0
         xorlw   2
         btfsc   STATUS,Z   ; incremente level
         goto   fintops      ; avec saturation a 2
         incf   LEVEL,1
         goto   fintops

no_up      decf   NBTOP,1
         btfss   STATUS,Z
         goto   fintops
; 3 tops -> flash S.O.S
         bsf      FLASH
         clrf   PTRSOS      ; raz pointeur de signal
         call   SOSTAB
         movwf   CTRFLASH

fintops      clrf   NBTOP
         goto   main0
         
;--------- Mode flash a eclats programmable ---------------
eclats      bsf      LED
         movf   CTRLOOP,0
         xorlw   DELAI_BASE
         btfss   STATUS,Z   ; test si unite de temps passee
         goto   tempsos

         decfsz   CTRFLASH,1
         goto   tempsos

;l'intervalle entre tops est passe
         incf   PTRSOS,1   ; incr pointeur
         call   SOSTAB
         xorlw   0ffh
         btfsc   STATUS,Z   ; si fin raz pointeur
         goto   razptrs
         
         xorlw   0ffh
         movwf   CTRFLASH

         bcf      LED         ; allume la led !
tempsos      call   TEMPO3M
         goto   tstkey
         
razptrs      clrf   PTRSOS
         call   SOSTAB
         movwf   CTRFLASH
         goto   tempsos
;--------------------------------------------------------
TEMPO3M      movlw   060h      ; tempo 3mS
         movwf   TPO1
         decfsz   TPO1,1
         goto   $-1
         return
;---------------------------------------------------
;Table des rapports cycliques en fonction de Vdd
SETVDDMES   addwf   PCL,1
         retlw   010h      ;0
         retlw   018h
         retlw   020h      ;2
         retlw   020h      ;3
         retlw   026h
         retlw   02Ah
         retlw   030h      ;6
         retlw   038h
         retlw   040h      ;8
         retlw   048h
         retlw   058h      ;10
         retlw   060h
         retlw   070h      ;12
         retlw   079h
         retlw   07Eh      ;14
         retlw   07Eh      ;15
;---------------------------------------------------
;Definition du signal flash programmable
;(nombre de blancs entre flash)
SOSTAB      movf   PTRSOS,0
         addwf   PCL,1
         retlw   1
         retlw   1
         retlw   1
         retlw   3
         retlw   3
         retlw   3
         retlw   3
         retlw   1
         retlw   1
         retlw   4
         retlw   0ffh   ; marque la fin du signal
;*****************************************************
         END


* Código corrigido.

MensagemEnviado: 04 Abr 2010 12:24
por zazulak
Aparentemente o código nem executa, pois a primeira instrução que aparece nele é para apagar o LED.

Na hora de gravar o PIC, você gravou além do código a configuração para usar clock interno?

MensagemEnviado: 04 Abr 2010 12:55
por Sergio38br
Qual a tensão que vc ta alimentando o circuito??

[ ]`s
Sergio

MensagemEnviado: 04 Abr 2010 13:12
por rmateus
zazulak escreveu:Aparentemente o código nem executa, pois a primeira instrução que aparece nele é para apagar o LED.

Na hora de gravar o PIC, você gravou além do código a configuração para usar clock interno?


Ops! Apanhei tanto pra gravar o PIC, em função do OSCAL e de outras coisas, que na hora de postar o código, postei uma variação do original...

No código original, a configuração era assim:

Código: Selecionar todos
__config   _BODEN_OFF & _EXTRC_OSC_NOCLKOUT & _WDT_OFF &_MCLRE_OFF 


A propósito, este circuito não poderia utilizar o oscilador interno???

MensagemEnviado: 04 Abr 2010 13:20
por rmateus
Sergio38br escreveu:Qual a tensão que vc ta alimentando o circuito??

[ ]`s
Sergio


Neste momento, com 5V fonte regulada, mas na lanterna pretendo utilizar baterias tipo 18650 3,7V.
O que você acha?

MensagemEnviado: 05 Abr 2010 22:38
por rmateus
Pessoal,

Duas noites até tarde e nada de funfar...

Cata daqui e dali, achei em um fórum, um cara falando sobre este mesmo circuito, só que com outro nome e fazendo referência a revista Everyday Practical Electronics, onde o circuito foi originalmente publicado.

Pesquisei mais um monte e achei a revista pra baixar em PDF (não sei se posso postar o link aqui...).

Mas o texto explica o funcionamento do circuito:

Operating Principle
The torch described here uses a PIC12F629 microcontroller to control the Luxeon l.e.d. The complete circuit diagram is shown in Fig.5.
The function of the PIC (IC1) is to control the current delivered to the l.e.d. (D1), keeping it to a maximum of 350mA for a supply voltage of
up to 3,42V. This is done by using pulse width modulation (PWM) of the power-switching transistor, TR1.
This allows the l.e.d. to be controlled without using a current limiting resistor, while also compensating for the supply voltage falling as the battery discharges over time.
In full power mode, the pulse width ratio is controlled at about 50% for a supply voltage of 4,5V, reaching 95% with 3V.
To do this, the PIC has to constantly determine the battery’s supply voltage.
This task is complicated by the PIC itself being subject to that same supply voltage. Consequently, a Zener diode (D2) is used to provide a 2,7V reference to the PIC’s internal comparator via the GP1 pin. From this reference, the PIC’s internal programmable voltage reference option then allows Vdd to be estimated in respect of the value held by the VRCON register.
The four least significant bits of the VRCON register are inversely proportional to the supply voltage.
The software uses this information to control the l.e.d.’s intensity.
Measurement of the supply voltage is done every 0,7 seconds. The software varies the internal programmable voltage reference until the internal comparator’s output level changes state. The value of VRCON is then inversely proportional to Vdd (3V >15, 5V >8, etc). Table SETVDDMES allows the correct value for the pulse width modulation to be selected.
The Zener diode is powered by PIC pin GP4, buffered by resistor R2, but only on an intermittent basis, thus reducing the total power consumption.
Power saving is also achieved by controlling the PIC at a slow clock rate, around 300kHz, as set by capacitor C1 and resistor R3.
Light Intensity
Pushbutton switch S1 is the light intensity control, connected to pin GP2.
This is used as an input with its “weak pull-up” activated, holding it normally high. The pin goes low when the switch is pressed. The software counts the number of presses in a given time, and sets the intensity accordingly.
The circuit is basically intended to be powered at 6V. It can, though, be powered at between 3V and 5,5V if diode D3 is omitted. Note, though, that
the maximum brightness level requires a minimum supply voltage of 4V.
Software Considerations
The software is based on a main loop, in which the PWM signal is generated at about 150Hz, depending on the battery’s voltage. Any
change of state on switch S1 is also detected. Switch presses are counted during 256 successive iterations. The total number of presses
is then tested in order to modify the lighting mode
.
A 0,7 second period is used as the timebase for the CTROFFL/H counters.
Its goal is to measure the period at the end of which the light level is automatically lowered.


Não entendi a parte escrita em vermelho e nem sei mais se vai servir pro que eu pretendia inicialmente...um lanterna com duas intensidades, ON/OFF no mesmo botão... :roll:

[ ]'s

MensagemEnviado: 08 Abr 2010 16:40
por tcpipchip
usa este projeto para acender LED

Vai ficar mais forte...

http://www.youtube.com/watch?v=NkkU0UO3sek&feature=player_embedded

MensagemEnviado: 08 Abr 2010 17:04
por vtrx
usa este projeto para acender LED

Vai ficar mais forte...

Uauau,hehe,será que o cara programou em basic ou similar para ficar daquele tamanho???lol.

MensagemEnviado: 08 Abr 2010 22:10
por RobL
Coloquei o programa no MPLAB, compila sem erro e no simulador roda normal.
Para simular é meio chato pois há os valores de tensão do comparador.
Ao rodar, na simulação o LED apaga logo de saída. Não deveria então acender quando liga.

Será que teu circuito está correto?
O zener de 2,7V é importante. Tem lá em torno de 2,7V?
A malha aplicada ao pino 2 GP5 é o oscilador.
Será que está oscilando, na frequencia esperada (300kHz)?
Tem certeza que ligou o transistor corretamente (base, emissor, coletor) conforme o esquema?

Faça um teste:
TESTE 1:
Tire o chip e faça um jump entre o Positivo da bateria e o pino 7.
Ligue a alimentação (SEM O CHIP), rapidinho. O led deve ficar apagado.
Se ficar apagado, coloque um R de 1K entre base e emissor e teste, sem o jump. Coloque o chip e ligue.

TESTE 2:
Tire o diodo em série com a alimentação (faça um jump nele). Teste.
Não erre a polaridade sem o diodo, senão o chip vai pro brejo.

TESTE 3:
Ao ligar se o LED acende, meça a tensão no pino 7. Deveria estar próximo de +B (+Vdd). Mas deve estar zero, se o led estiver aceso.
Será que o programa foi gravado corretamente?

MensagemEnviado: 08 Abr 2010 23:27
por rmateus
tcpipchip escreveu:usa este projeto para acender LED

Vai ficar mais forte...

http://www.youtube.com/watch?v=NkkU0UO3sek&feature=player_embedded




Cruzzzzz credo!!! :shock: Parece uma bazuca!!! kkkkkk

Pensei em algo mais compacto, tipo assim:


Lanterna Xing-ling (cobaia)
Imagem

Com as lâmpadas originais 1 metro da parede...mais do que isso, nem dava pra enxergar direito...
Imagem

Lentes novas com suporte, já montadas
Imagem

Imagem

Com LED's montados
Imagem

Imagem

Iluminando com LED's Esta foto tive que bater na diagonal, pra poder ver o círculo do foco. No fim das contas achei muito aberto, mas vou deixar assim mesmo...A lanterna está na mesa, 2 metros do teto.
Imagem

Agora só falta o circuito e as baterias. Se alguém tiver um circuitinho parecido com esse com PIC ou com AVR e quiser dar umas dicas, agradeço.

Abraços!

MensagemEnviado: 08 Abr 2010 23:53
por rmateus
RobL escreveu:Coloquei o programa no MPLAB, compila sem erro e no simulador roda normal.
Para simular é meio chato pois há os valores de tensão do comparador.
Ao rodar, na simulação o LED apaga logo de saída. Não deveria então acender quando liga.


E aí RobL, beleza?

Cara, não tenho experiência no MPLAB, só fui seguindo o que li por aí, derrepente dei uma pisada na bola...não sei...

RobL escreveu:Será que teu circuito está correto?
O zener de 2,7V é importante. Tem lá em torno de 2,7V?


Tem 2,4V. Estranho?

RobL escreveu:A malha aplicada ao pino 2 GP5 é o oscilador.
Será que está oscilando, na frequencia esperada (300kHz)?


Tenho dúvidas quanto ao oscilador, acho que não; pois usei 33pF, ao invés de 47pF. Depois me disseram que o clock do circuito baseia-se nesta freqüência (R3xC1).

RobL escreveu:Tem certeza que ligou o transistor corretamente (base, emissor, coletor) conforme o esquema?


Esse sim, tenho! rsrsrs
Utilizei um BD140. Outro camarada comentou que o VCEsat do DB é bem maior que o do ZTX. Pra reduzir as probabilidades, acho que vou aproveitar e comprar os ZTX.

RobL escreveu:Faça um teste:
TESTE 1:

TESTE 2:

TESTE 3:


Farei-os neste findi! no domingo eu posto os resultados!

RobL escreveu:Será que o programa foi gravado corretamente?


Penso que sim. Na primeira vez que gravei um 12F629 apanhei bastante, mas já gravei outros códigos neles e ficaram ok!

Até aprender a manha do OSCAL foi um parto de gêmeos.... :D


Kra, muito obrigado pelas dicas!

Bom findi e abraço!

MensagemEnviado: 09 Abr 2010 07:49
por RobL
Com o zener dando 2,4V vai interpretar como bateria descarregada.
Para iniciar testes é recomendável usar 2,7V, pois o autor se baseou nessa tensão para tomar várias decisões no programa, através do comparador e do divisor de tensão interno do PIC.

Note que o resistor de 1K entre base e emissor tem a finalidade de possibilitar o corte do transistor, para teste.

O objetivo de tirar o diodo em série com a alimentação, é para aumentar o nível de tensão na porta a fim de cortar o transistor.
Isto poderia lhe dar a idéia de usar um resistor pullup no pino 7. Para teste pode até ser, mas, quando desligado o led, ficará consumindo bateria.
O mesmo acontecerá com o resistor de 1K entre emissor e base.

MensagemEnviado: 22 Mai 2010 19:03
por rmateus
RobL escreveu:Com o zener dando 2,4V vai interpretar como bateria descarregada.
Para iniciar testes é recomendável usar 2,7V, pois o autor se baseou nessa tensão para tomar várias decisões no programa, através do comparador e do divisor de tensão interno do PIC.

Note que o resistor de 1K entre base e emissor tem a finalidade de possibilitar o corte do transistor, para teste.

O objetivo de tirar o diodo em série com a alimentação, é para aumentar o nível de tensão na porta a fim de cortar o transistor.
Isto poderia lhe dar a idéia de usar um resistor pullup no pino 7. Para teste pode até ser, mas, quando desligado o led, ficará consumindo bateria.
O mesmo acontecerá com o resistor de 1K entre emissor e base.



RobL,

Queria agradecer as dicas e retornar os resultados obtidos com a tua ajuda.

Depois de várias semanas tentando terminar meu TCC (ainda não terminei), voltei a montar o circuito.
Estava esperando juntar mais umas peças no pedido da Farnell pra compensar o frete e pedir os ZTX751.
Nesse meio tempo (TCC e Emprego), as peças chegaram e comecei do zero.

Com o ZTX tudo funcionou direitinho, exceto o fato de que ainda não tenho conhecimento suficiente pra me aventurar a mudar o código original, então o circuito está funcionando, no modo máximo, a 350mA como previsto no projeto original.

O fato de eu ter utilizado um BD140 no lugar do ZTX, fazia com que o circuito, além de não acender o LED totalmente, ficasse consumindo muito quando desligado.

Depois da chegada dos ZTX, descobri que existe um equivalente bem mais fácil de encontrar: o 2SA1315


Enfim, se puderes me dar uma dica de como altero o código pra obter outras correntes pra LED de 3W, tipo 350/700mA, 500/1A, te agradeço.

MensagemEnviado: 27 Mai 2010 19:14
por rmateus
Mais alguém poderia me dar umas dicas?

Valeu!

MensagemEnviado: 30 Mai 2010 22:06
por rmateus
Calma!

Um de cada vez!!!! :lol: