Eletrônica Silveira
Olá, Seja Bem-Vindo ao Fórum Eletrônica Silveira!!!!
Para você poder ver os mais variados Projetos do nosso Fórum, você precisa fazer o cadastro!

Depois de se Cadastrar, não se esqueça de ler as regras do fórum!

http://eletronicasilveira.forumeiros.com/t3-regras-do-forum#3


Administrador do Fórum,
Rafael Silveira
HOMENAGEM

Na vida tudo passa tudo acontece mas alguém igual a você a gente jamais esquece




★ 22 de novembro de 1991

† 12 de março de 2016

Nosso eterno amigo, administrador e fundador deste fórum
Quem está conectado
56 usuários online :: 15 usuários cadastrados, Nenhum Invisível e 41 Visitantes :: 2 Motores de busca

Ademir, alexsandro rodrigues de a, ARIELSONxD, chaves_paulo, dionatanquadros, EdyGuitar, euripedes t matos, evilasiomarlene, jocelino, maxerox281169, Nisito BH-MG, Paulo Vieira, phissico, Self-design, wandows

[ Ver toda a lista ]


O recorde de usuários online foi de 264 em Seg 18 Mar 2013 - 11:54
Últimos assuntos
Eletrônica Perez
CM Eletrônica
Top dos mais postadores
Rafael Silveira (7816)
 
Caca Silva (5939)
 
renatoscp (3821)
 
CMeletronica (3102)
 
michel chagas (2791)
 
Railson (2118)
 
alexsandro rodrigues de a (1772)
 
naldo santos (1599)
 
ablacon64 (1220)
 
gilvantexas (1061)
 

Medidor de Velocidade

Publicidade

CÓDIGO FONTE PIC

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

CÓDIGO FONTE PIC

Mensagem por wilson carvalho em Ter 8 Abr 2014 - 19:35

Ola amigos.
gostaria de saber se alguém gostaria de se aventurar a compilar este código fonte de um projeto que pretendo montar.
Já tentei de várias maneiras e só da erro, outras pessoas também já tentaram sem sucesso, até um SR que na internet ele ensina a fazer programas em pic também não teve sucesso.
Se alguém quiser tentar compilar para o HEX para copiar no pic o código esta ai.
Este código foi criado por um engenheiro e é real.
Para quem gosta de desafio ai está


GRATO


(9) CÓDIGO FONTE DO PROGRAMA PARA O PIC16F876A

O programa foi desenvolvido utilizando-se o compilador PicBasic Pro, da Micro Engeneering
Labs (www.melabs.com) e é comporto por uma rotina principal e sete rotinas auxiliares, que são
acessadas pela principal.
CARREGADOR V7_0.BAS (rotina principal)
‘ ******* modulo principal – carregador V7_0.bas *********
'############# Carregador de Baterias Chumbo - ácido ####################
'
' Algoritmo que utiliza o processo de quatro estágios para carregar ou monitorar
'baterias de chumbo-ácido.
'
'Processos:
'1. CARGA LENTA - Se tensão da bateria for menor q Voff, recarrega em carga
'lenta, aplicando Itric, até tensão ficar acima de Voff.
'2. CARGA RÁPIDA - Aplica-se Ibulk até a tensão da bateria atingir Voct
'3. SOBRECARGA - Deve-se manter a tensão da bateria cte. e não passar de
'Voct. Qdo. a corrente atinge Ioct, muda-se de estágio.
'4. CARGA FLUTUANTE - Mantém a tensão da bateria constante sobre Vfloat.
'enquanto o usuário não retirar a bateria, a mesma permanece neste estágio.
'Ibulk = 10% da carga da bateria
'Itric = 1% " " " "
'Ioct = Ibulk/5
'
'Desenvolvido para PIC 16F876A
'Para baterias 12V e 24V de 12Ah até 160Ah
' R1= 3k9 R2= 680
' Temperatura também é lida e, se necessário, compensa as variáveis afetadas.
' v7.0
30/08/07
'#########################################################################
Define __16F876A
Define osc 10
include "defines.bas"
clear 'Limpa a RAM
' I/O E AD
TRISB=%00001111
TRISC=%00000000
TRISA = %11111111
ADCON1 = %10000010 'PORTA todo analogico e justificado p/ direita (ADRESL)
'TIMERS
OPTION_REG= %01010111 ; clock interno1, prescaler 1:256, pull-up ativo
asm
CLRF PORTA
CLRF PORTB
CLRF PORTC
endasm
include "variaveis.bas"
ON INTERRUPT Goto INT_in
GIE=1 'Ativa chave geral das interrupções
'______
' Main |
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
include "init.bas"
tst_inicial: 'verifica se é necessário começar pela carga lenta
call le_tensao
if( tensao < Voff ) then estagio=1 'começa em carga lenta
if( tensao >= Voff ) then estagio=2 'começa em carga rápida
tmr0ie=1 'Ativa interrupção do TMR0
MAIN_LOOP:
if( down == 0 and up == 0 ) then 'Entra na função de calibração de corrente
tmr0ie=0: pause 1000 'desativa interrupções
if( down == 0 and up == 0 ) then call calib_A: tmr0ie=1
endif
29
hpwm 1, duty, freq: call delay_400m
call le_corrente
if( estagio == 1 ) then call carga_lenta
if( estagio == 2 ) then call carga_rapida
if( estagio == 3 ) then call sobrecarga
if( estagio == 4 ) then call carga_flutuante
if( i_flag == 0 ) then erro_flag=2: goto erro 'Corrente na saída foi p/ zero
if( corrente >= Ibulk+10 ) then iold_flag= i_flag: erro_flag=3: goto erro 'Iout esta mto
alta
call show_lcd: goto main_loop
'___________
'Subrotinas |
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
include "quatro_estagios.bas" 'implementação do algoritmo de quatro estágios
include "subrotinas.bas" 'rotinas de leitura das variáveis envolvidas e de erro
include "calib.bas" 'algoritmo responsável pela calibração do carregador
include "math.bas" 'rotinas de divisão e multiplicação
show_lcd: 'Envia dados para o LCD
tmr0ie=0 'desativa interrupção
'¨¨¨¨ cálculo para achar Vout em volts - 2 casas decimais
resp=33: respB=67: CH= tensao: aprox=1: call multiplica: aprox=0
A= resp: B= cal_Vout: call divide
Va= resp: Vb= respB/10
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
'¨¨¨¨ cálculo para achar a corrente na saída do carregador
A= 202*corrente: B= cal_Iout: call divide
Ia= resp: Ib= respb/10
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
Lcdout $fe, 1 ' Clear LCD
;------ DADOS ENVIADOS PARA O DISPLAY LCD ----------------------
if( estagio == 1 ) then LCDOUT $fe,2, "1-3 Carga lenta "
if( estagio == 2 ) then LCDOUT $fe,2, "2-3 Carga rapida"
if( estagio == 3 ) then LCDOUT $fe,2, "3-3 Finalizando "
if( estagio == 4 ) then LCDOUT $fe,2, " Carregada "
'LCDOUT $fe,2, DEC estagio, " dty=", DEC duty, "flg=", DEC i_flag
'LCDOUT $fe,$C0, "V=", dec tensao, " i=", DEC corrente
LCDOUT $fe,$C0, DEC2 Va, ",", DEC1 Vb, "V ", DEC2 Ia, ",", DEC1 Ib, "A "', DEC temper,
"ºC"
;---------------------------------------------------------------
tmr0ie=1: RETURN 'ativa interrupção e retorna
'#### interrupções ##############
disable
INT_in: ' TIMER0 -> gera interrupção a cada 0,0262144s
'o comando pause altera diretamente os timers!!!!!!
'CH= 4578 = 2min
tmr0if= 0 'Limpa flag da interrupção e desativa
intcont= intcont+1
if( start_delay == 1 ) then delay= delay+1
read_tempo= read_tempo+1 'intervalo de leitura da temperatura
'*lê temperatura a cada 5min
if( read_tempo == 11444 ) then read_tempo=0: call temperatura
if( (estagio == 1) or (estagio == 3) ) then
if( intcont == 191 ) then call le_tensao '5s
endif
if( estagio == 2 ) then
if( intcont == 1144 ) then call le_tensao '30s
endif
if( estagio == 4 ) then
if( intcont == 382 ) then call le_tensao '10s
endif
RESUME: enable
End
30
CALIB.BAS (rotina auxiliar)
'/////////////////////////////////////////////////////////////////////////
' CALIB.BAS
'
' Contém a implementação do algoritmo responsável pela calibração do carregador
' de baterias, do tipo chumbo ácido, da TOROID DO BRASIL.
'/////////////////////////////////////////////////////////////////////////
calc_I: 'calcula Iblk, Itric e Ioct em função da capacidade da bateria
aprox=1 'habilita arredondamento na multiplicação
A=cal_Iout: B=2020: call divide: CH=cap: call multiplica: Ibulk= resp
A=Ibulk: B=5: call divide: Ioct= resp: if( respB > 50 ) then Ioct= Ioct+1
A=Ibulk: B=10: call divide: Itric= resp: if( respB > 50 ) then Itric= Itric+1
if( Itric == 0 ) then Itric=1
if( Ibulk == 0 ) then Ibulk=1
if( Ioct == 0 ) then Ioct=1
aprox=0: return
calc_V: 'calcula Voff, Vfloat e Voct
if( Vbat == 12 ) then 'bateria de 12V
A=1050: B=3367: call divide: CH= cal_Vout: call multiplica: Voff= resp
A=1302: B=3367: call divide: CH= cal_Vout: call multiplica: Vfloat= resp
A=1428: B=3367: call divide: CH= cal_Vout: call multiplica: Voct= resp
else 'bateria de 24V
A=2100: B=3367: call divide: CH= cal_Vout: call multiplica: Voff= resp
A=2604: B=3367: call divide: CH= cal_Vout: call multiplica: Vfloat= resp
A=2856: B=3367: call divide: CH= cal_Vout: call multiplica: Voct= resp
endif: return
calib_V: 'Subrotina p/ calibrar a tensão da fonte
Lcdout $fe, 1: Lcdout $fe,$2, " Calibracao (V) "
while( OK == 1 )
LCDOUT $fe,$C0, DEC2 Va, ",", DEC2 Vb, " V ", " ", dec4 cal_Vout
canal= 0: call read_ad: tensao= CH
'¨¨¨¨ cálculo para achar Vout em volts - 2 casas decimais
A= 5*tensao: B= cal_Vout: CALL divide
CH= 673: call multiplica
respB= resp - (resp/100)*100: resp= resp/100
Va= resp: Vb= respB
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
if( UP == 0 ) then cal_Vout=cal_Vout-1 'aumenta tensão
if( DOWN == 0 ) then cal_Vout=cal_Vout+1 'diminui tensão
wend
Lcdout $fe, 1: Lcdout $fe,$2, "Tensao calibrada"
call calc_V: WRITE 0, (cal_Vout >> Cool: WRITE 1, cal_Vout: return 'grava na e2prom a
calibração
calib_A: 'Subrotina p/ calibrar a corrente de saída
Lcdout $fe, 1: Lcdout $fe,$2, " Calibracao (A) "
while( OK == 1 )
LCDOUT $fe,$C0, DEC2 Ia, ",", DEC1 Ib, " A ", " ", dec4 cal_Iout
'¨¨¨¨ cálculo para achar a corrente na saída do carregador
A= 202: B= cal_Iout: call divide
CH= corrente: call multiplica
Ia= resp: Ib= respb/10
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
if( UP == 0 ) then cal_Iout=cal_Iout-1 'aumenta corrente
if( DOWN == 0 ) then cal_Iout=cal_Iout+1 'diminui corrente
wend
Lcdout $fe, 1: Lcdout $fe,$2, " Iout calibrada "
call calc_I: WRITE 2, (cal_Iout >> Cool: WRITE 3, cal_Iout: return 'grava na e2prom a
calibração
31
DEFINES.BAS (rotina auxiliar)
'/////////////////////////////////////////////////////////////////////////////////
' DEFINES.BAS
'
' Contem os "defines" e "symbols" utilizados para o software do carregador de
' baterias, do tipo chumbo-ácido, da TOROID DO BRASIL.
'/////////////////////////////////////////////////////////////////////////////////
SYMBOL DESCHARGE= PORTC.1 'Descarrega capacitores da saída do carregador
SYMBOL OK= PORTB.0 'Botão OK
SYMBOL UP= PORTB.2 'Botão para cima
SYMBOL DOWN= PORTB.1 'Botão para baixo
SYMBOL BIVOLT= PORTB.5 'Rele 127V / 220V
' ----------------------------------------------
'*** AD ***
Define ADC_BITS 10 ' Set number of bits in result
Define ADC_CLOCK 3 ' Set clock source (3=rc)
Define ADC_SAMPLEUS 100 ' Set sampling time in uS
' ----------------------------------------------
'*** LCD ***
DEFINE LCD_BITS 4 ' 4-bit Interface
Define LCD_DBIT 4 ' dados começam no bit4
Define LCD_DREG PORTC ' Porta de dados
Define LCD_RSREG PORTc ' Porta do RS
Define LCD_EREG PORTc ' Porta do enable
Define LCD_RSBIT 0
Define LCD_EBIT 3
DEFINE LCD_LINES 2
Low PORTC.1 ' LCD R/W line low (W)
' ---------------------------------------------
'*** PWM ***
DEFINE CCP1_REG PORTC 'Hpwm 1 pin port
DEFINE CCP1_BIT 2 'Hpwm 1 pin bit
' ---------------------------------------------
SYMBOL GIE= INTCON.7 ' CHAVE GERAL DAS INTERRUPÇÕES
SYMBOL PEIE= INTCON.6 'INTERRUPÇÕES DE PERIFERICOS
SYMBOL TMR0IE= INTCON.5 'INTERRUP. DO TIMER 0
SYMBOL TMR0IF= INTCON.2 ''FLAG DA INT. DO TMR0
SYMBOL RBPU= OPTION_REG.7 '0-> PULL UP ATIVO NO PORTB
32
INIT.BAS (rotina auxiliar)
'///////////////////////////////////////////////////////////////////////////////
' INIT.BAS
'
' Possui as mensagens de apresentação e configuração do carregador de baterias,
' do tipo chumbo-ácido, da TOROID DO BRASIL.
'///////////////////////////////////////////////////////////////////////////////
'Inicio da verificação de tensão da rede (127V / 220V)
canal= 3: call read_ad: Vrede= CH 'Identifica se está ligado em 127V ou 220V
'Lcdout $fe, 1: Lcdout $fe,$2, "AD Rede=", DEC Vrede: pause 3000
if( Vrede <= 550 ) then bivolt=1: Lcdout $fe, 1: Lcdout $fe,$2, " Rede 127V ": pause 1500
if( Vrede > 550 ) then Lcdout $fe, 1: Lcdout $fe,$2, " Rede 220V ": pause 1500
Lcdout $fe, 1: pause 1000: Lcdout $fe, 1: HPWM 1,0,FREQ 'limpa LCD, PWM off
Lcdout $fe,$2, " Carregador ": Lcdout $fe,$C0, "TOROID do Brasil": pause 2000
'* Para alterar a Capacidade da Bateria *
READ 4, cap 'lê a ultima opcao utilizada
if( cap == $ff ) then cap= 40 'valor padrão
Lcdout $fe, 1: Lcdout $fe,$2, " Capacidade (Ah)"
while( OK == 1 )
if( UP == 0 and cap != 160 ) then cap=cap+1: pause 180 'aumenta
if( DOWN == 0 and cap != 1 ) then cap=cap-1: pause 180 'diminui
Lcdout $fe,$C0, "= ", DEC3 cap
wend
WRITE 4, cap 'escreve na eeprom a capacidade
'* Opção de 12V ou 24V? *
pause 200: Lcdout $fe, 1: Lcdout $fe,$2, " Tensao (V)"
while( OK == 1 )
if( UP == 0 and Vbat != 24) then Vbat= 24: pause 220
if( DOWN == 0 and Vbat != 12 ) then Vbat= 12: pause 220
Lcdout $fe,$C0, "= ", DEC2 Vbat
wend
Lcdout $fe, 1: Lcdout $fe,$2, " Iniciando ": Lcdout $fe,$C0, " . "
'* Se calibrado pela 1ª vez, aplica mesma calibração
READ 0, cal_Vout 'lê variável (parte alta) responsável pela calibração da tensão
READ 1, aux_eprom ' cal_Vout= cal_Vout || aux_eprom
Lcdout $fe,$C0, " .. "
cal_Vout= (cal_Vout*256) + aux_eprom
pause 150: Lcdout $fe,$C0, " ... "
'if( cal_Vout != 0 ) then cal_Vout= (cal_Vout*256) + aux_eprom
'if( cal_Vout == 0 ) then cal_Vout= aux_eprom 'apenas parte baixa (8bits LSB)
if( cal_Vout == $ffff ) then cal_Vout= 1023 'ainda não foi calibrado, mantém valor padrão
call calc_V
pause 150: Lcdout $fe,$C0, " .... "
READ 2, cal_Iout 'lê variável responsável pela calibração da corrente
READ 3, aux_eprom ' cal_Vout= cal_Vout || aux_eprom
cal_Iout= (cal_Iout*256) + aux_eprom
if( cal_Iout == $ffff ) then cal_Iout= 1023
call calc_I
pause 150: Lcdout $fe,$C0, " ..... "
'while(1)
'call calc_I 'calcula Iblk, Itric e Ioct em função da capacidade da bateria
' Lcdout $fe, 1 'limpa LCD
' Lcdout $fe,$2, "tric=", dec Itric, " blk=", dec Ibulk
' Lcdout $fe,$C0, "oct= ", dec Ioct, " ", dec cal_Iout
' pause 5000
' Lcdout $fe, 1 'limpa LCD
' Lcdout $fe,$2, "off=", dec Voff, " flt=", dec Vfloat
' Lcdout $fe,$C0, "oct= ", dec Voct, " ", dec cal_Vout
' pause 5000
' if( UP == 0 and cap != 255 ) then cap=cap+1 'aumenta
' if( DOWN == 0 and cap != 0 ) then cap=cap-1 'diminui
'pause 100
'wend
pause 150: Lcdout $fe,$C0, " ...... "
pause 150: Lcdout $fe,$C0, " ....... "
if( down == 0 and up == 0 ) then call calib_V 'Entra na função de calibração de tensão
call temperatura 'faz 1ª leitura da temperatura
pause 150: Lcdout $fe,$C0, " ......... "
33
MATH.BAS (rotina auxiliar)
'/////////////////////////////////////////////////////////////////////////////////
' MATH.BAS
'
' Contem as rotinas de multiplicação, de divisão e de delay utilizados para o
' software do carregador de baterias, do tipo chumbo-ácido, da TOROID DO BRASIL.
'/////////////////////////////////////////////////////////////////////////////////
MULTIPLICA:
'Multiplica um inteiro por um float ( CH*(resp,respB) ) e guarda resultado
'em resp e respB. CH=inteiro (resp,respB)=float respB possui 2 digitos (máx. 99)
'OBS.: CH não pode passar de 1337 e resp*CH não pode ultrapassar 16bits (65536)
keepB= respB;
if( CH == 0 ) then resp=0: respB=0: return
resp= resp*CH
while( CH != 1 )
respB= respB+keepB: resp= resp + (respB/100)
respB= respB - ((respB/100)*100): CH= CH-1;
wend
if( (aprox == 1) and (respB > 50) ) then resp= resp+1 'faz aproximaçao p/ o inteiro +
próximo
return
' respB= (respB/2)*CH
' resp= (resp*CH) + ((respB/100)*2)
' respB= respB - ((respB/100)*100): respB= respB*2
' resp= resp + respB/100
' respB= respB - (respB/100)*100
' return
DIVIDE:
'Divide dois numeros (A por B) e guarda resultado em resp e respB.
'NECESSÁRIO DECLARAR: A, B, CH, resp, respB, temp (como word);
'invert, keepinv (como bit);
'INICIALIZAR: keep= 0: keepinv=0
RESP=0: respB= 0: invert=0
if a==0 or b==0 then return
IF( A < B ) THEN invert=1: temp= A: A= B: B= temp 'inverte numer. e denomin.
WHILE( A >= B )
A= A - B
resp= resp + 1
WEND
IF A == 0 AND invert == 0 THEN RETURN
IF( A == 0 ) THEN A= 1: B= resp: resp= 0: invert= 0
call calc_mdc
if( A <= 653 ) then respB= A*100 / B
'2ª casa depois da virgula é arredondada
if( A > 653 ) then
'se chamar novamente esta subrotina variáveis serão sobreescritas!!!!
if( err == 1 )then
if( A <= 6553 )then respB= (A*10)/B: respB= 10*respB
if( A > 6553 )then resp=A/B : respB=0 'ignora casas depois da virg.
err=0: goto continue
endif
err= err+1
keep= resp: keepinv= invert
call divide': respB= resp*10 + respB
err=0: 'resp= keep + resp + respB/100
resp= keep + resp + respB/100
if( respb == 100 ) then respb=0
invert= keepinv
endif
continue:
if( invert == 1 ) THEN 'foi invertido numerador c denominador
respB= 10000 / ((resp*100) + respB): resp= 0
if( respB == 100 ) then resp=1: respB=0
endif
RETURN
calc_mdc: 'Funcao que calcula o MDC entre dois nº
'Declarar as seguintes variáveis: cont var word: mdc=1 var word
for cont = 1 to A
if( (A//cont == 0) and (B//cont == 0) ) then mdc = cont;
next cont
A= A/mdc: B= B/mdc
RETURN
34
QUATRO_ESTAGIOS.BAS (rotina auxiliar)
'///////////////////////////////////////////////////////////////////////////////
' QUATRO_ESTAGIOS.BAS
'
' Contém a implementação do algoritmo responsável pelo controle do carregador de
' baterias, do tipo chumbo ácido, da TOROID DO BRASIL.
'///////////////////////////////////////////////////////////////////////////////
carga_lenta:
if( corrente < Itric+c0 ) then c0=0: duty= duty+1
if( corrente > Itric+c0 and duty != 1 ) then duty= duty-1
if( tensao > Voff ) then estagio=2 'altera p estágio de carga rápida
return
carga_rapida:
if( corrente < Ibulk ) then duty= duty+1
if( corrente > Ibulk and duty != 0 ) then duty= duty-1
if( tensao > (Voct-6) ) then estagio=3 'altera para estágio de sobrecarga (Voct-0,2V)
return
sobrecarga:
if( tensao > Voct and duty != 0 ) then duty= duty-1
if( (corrente < Ioct) and (i_flag != 0) ) then estagio=4
return
carga_flutuante:
if( tensao < Vfloat ) then duty= duty+1
if( tensao > Vfloat and duty != 0 ) then duty= duty-1
return
35
SUBROTINAS.BAS (rotina axiliar)
'///////////////////////////////////////////////////////////////////////////////
' SUBROTINAS.BAS
'
' Possui as subrotinas para medição de tensão e de corrente, leitura da tempera-
' tura, além da rotina de erro e da rotina que evita um excesso de corrente na
' saída do carregador de baterias, do tipo chumbo ácido, da TOROID DO BRASIL.
'///////////////////////////////////////////////////////////////////////////////
le_tensao:
intcont=0: tensao=0: HPWM 1,0,FREQ 'PWM off
DESCHARGE=1: pause 800: DESCHARGE=0 'Descarrega capacitores p/ leitura mais precisa
canal= 0: call read_ad: tensao= CH
hpwm 1, duty, freq: pause 800 'religa PWM
return
le_corrente:
corrente=0': filtro= 20 'aumenta o nº de aquisições p/ tirar a média
call read_2ad: corrente= CH
if( corrente < CH2 ) then corrente= 0
if( corrente != 0 ) then corrente= corrente - CH2 'É o delta_AD
if( corrente > Itric+3 ) then i_flag=1 'muda do estado inicial para carregando
if( (i_flag == 1) and (corrente < Itric) and (estagio != 4) ) then i_flag=0
if( i_flag == 2 and duty > 90 ) then duty=37: iold_flag=2: i_flag=0 'Bateria foi
desconectada no estagio 1
return
read_ad: 'lê AD (deve-se indicar canal) e guarda a média das conversões em CH
conta=0: oldvalue=0: CH=0
while( conta != filtro )
conta= conta+1
Adcin canal, oldvalue: pauseus 30
CH= CH + oldvalue
wend
CH= CH/filtro: return
read_2ad: 'lê dois canais AD (0 e 1) e guarda a média das conversões em CH
conta=0: oldvalue=0: oldvalueT=0: CH=0: CH2=0
while( conta != filtro )
conta= conta+1
Adcin 1, oldvalue: pauseus 30 'corrente
Adcin 0, oldvalueT: pauseus 30 'tensao
CH= CH + oldvalue 'soma das correntes
CH2= CH2 + oldvalueT 'soma das tensões
wend
CH= CH/filtro: CH2= CH2/filtro: return
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
temperatura: 'mede temperatura
'Lcdout $fe, 1: Lcdout $fe,$2, " Le temperatura ": pause 800
canal= 2: call read_ad: temper= CH 'lê NTC
if( temper < 250 ) then 'temperatura próximo a zero ou NTC ausente
aux_temper=0: pauseUs 500
canal= 2: call read_ad: temper= CH 'lê NTC novamente p/ confirmação
if( temper < 150 ) then erro_flag=1: goto erro
endif
aux_temper= ( (temper*50)/102 ) * 100
if( temper < 669 ) then temper= ( (aux_temper-8911)/532 ) - 5: goto compensa_temp
'temperaturas até 40ºC
if( temper < 820 ) then temper= ( (aux_temper-30987)/370 ) + 35: goto compensa_temp
'temperaturas entre 41ºC e 60ºC
if( temper < 910 ) then temper= ( (aux_temper-39106)/219 ) + 55: goto compensa_temp
'temperaturas entre 61ºC e 80ºC
temper= ( (aux_temper-44104)/104 ) + 75 'temperaturas acima de 80ºC
goto compensa_temp
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
compensa_temp:
A= 33*cal_Vout: B= 3365:call divide: CH=comp_t: aprox=1: call multiplica: aprox=0
if( diminuiu == 1 ) then Vfloat= Vfloat+resp: Voct= Voct+resp: limite= limite - 10*comp_t
if( diminuiu == 0 ) then Vfloat= Vfloat-resp: Voct= Voct-resp: limite= limite + 10*comp_t
diminuiu=0: return
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
delay_400m: 'aguarda 400ms
start_delay=1
while( delay != 15 ) 'aguarda 393,2ms
wend
start_delay=0: delay=0
36
return
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
ERRO:
HPWM 1,0,FREQ 'PWM off
tmr0ie=0 'Desativa interrupção
'DESCHARGE= 1 'Desconecta fonte da bateria
Lcdout $fe, 1: LCDOUT $fe,$2, "ERRO !!!": Pause 3000
if( erro_flag == 1 ) then LCDOUT $fe,$C0,"NTC desconectado": Pause 3000
if( erro_flag == 2 ) then LCDOUT $fe,$2, " Bateria": LCDOUT $fe,$C0, " Desconectada":
Pause 3000
if( erro_flag == 3 ) then LCDOUT $fe,$2, " Iout muito": LCDOUT $fe,$C0, "alta.Verifique":
Pause 3000: duty=54
LCDOUT $fe,$2, " Pressione OK " : LCDOUT $fe,$C0, " para continuar "
i_flag= iold_flag
while( OK == 1 )
wend
goto tst_inicial
37
VARIAVEIS.BAS (rotina auxiliar)
'///////////////////////////////////////////////////////////////////////////////
' VARIAVEIS.BAS
'
' Contem a declaração das variáveis utilizadas para o software do carregador de
' baterias, do tipo chumbo-ácido, da TOROID DO BRASIL.
'///////////////////////////////////////////////////////////////////////////////
' -----------------------------------------------------------------------------
'*** VARIÁVEIS ***
Ibulk var word 'corrente máx. permitida. Usada na carga rápida.
Itric var word 'corrente p/ carga lenta (tensão da bateria abaixo de Voff)
Ioct var word 'corrente de limiar. Processo de carregamento acabou
Voff var word 'tensão de descarga profunda
Vfloat var word 'tensão da bat. acima de Vfloat -> vai p/ estágio de sobrec.
Voct var word 'tensão máxima da bateria
corrente var word 'corrente do carreg. (armazena a tensao p/ calcular Vr)
tensao var word 'tensão da bateria
duty var byte: freq var word 'para controle do PWM
cap var byte 'capacidade da bateria em Ah
estagio var byte '1=c. lenta / 2= c. rápida / 3= sobrecarga / 4= float
'¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
Va var byte: Vb var byte 'armazena tensão da bateria em volts
'cálculo da corrente. Vr= queda de tensão no resistor (corrente - tensão)
Vr var word: Ia var byte: Ib var byte: Req var word
fator var byte: denom var byte
'auxiliam na conversao de binario p tensao e nas divisões
A var word: B var word: resp var word: respB var word: CH var word: keepB var byte
invert var bit: keepinv var bit: keep var byte: temp var word: err var bit
'para AD
filtro var byte: conta var byte: oldvalue var word: canal var byte
oldvalueT var word: CH2 var word
'Interrrupção e tempo
delay var byte: intcont var word: start_delay var bit 'conta qtas vezes entrou na
interrupção
'calibração
cal_Vout var word: cal_Iout var word: calib var bit: receb_val var word
i_flag var byte 'Indicação de corrente na saida (2-> para inicio 1-> tem corrente 0->
não tem corrente)
Vbat var byte 'tensão nominal da bateria. 12V ou 24V
Vrede var word 'Armazena leitura do AD p/ identificar a tensão da rede
cont var word: mdc var word 'para função MDC
aprox var bit 'multiplicação entre int e float dará um int mais próximo do real resultado
se aprox=1
aux_eprom var byte 'auxilia junção dos 8 MSB com os 8 LSB
'temperatura
temper var word: aux_temper var word: read_tempo var word: comp_t var byte
limite var byte 'novo limite de temperatura. Se temper= limite+15 Vflt e Voct diminuem
(padrao=25ºC)
diminuiu var bit 'temperatura diminuiu, entao Vflt e Voct serão aumentados
erro_flag var byte '0=sem erros, 1=sem NTC, 2=sem corrente, bateria desconectada
iold_flag var byte: dutyold var byte: c0 var byte
' INICIALIZAÇÃO DAS VARIÁVEIS
DESCHARGE=0: BIVOLT= 0 'Descarrega capacit. e seta inicialmente p/ 220V
estagio=0: dutyold=0: CH=0: keep= 0: keepinv=0: err=0: mdc=1: aprox=0: read_tempo=0
cal_Iout=1023: calib=0: receb_val=0: i_flag= 2: aux_eprom=0: erro_flag=0: CH2=0
start_delay=0: intcont=0: delay=0: comp_t=0: diminuiu=0: limite=25: iold_flag=2
c0=2
DUTY= 10: cap=40: Vbat=12
filtro= 10 'numero de leitura do AD p/ depois fazer a média... MÁX ATÉ 64
FREQ= 20000
'MUDAR!!!!!! denom= 37: fator=2 'denom é o menor nº inteiro ((r1+r2)/r1)*5 e fator é o nº
'de multiplicações necessárias p/ obtê-lo
Req= 16 'Resistor na saída (*100) - p/ calcular a corrente de saída
'Ex: Se o resistor é de 0,47ohms, Req=47
' ------------------------------------------------------------------------------
avatar
wilson carvalho
Nível 1
Nível 1

Mensagens : 6
Data de inscrição : 08/04/2014
Idade : 65
Localização : mirassol sp

Voltar ao Topo Ir em baixo

Re: CÓDIGO FONTE PIC

Mensagem por foxeletronic em Ter 8 Abr 2014 - 20:14

Vai usar em que esse projeto.
avatar
foxeletronic
Avançado
Avançado

Mensagens : 759
Data de inscrição : 24/12/2012
Idade : 52
Localização : Capitão- RS

http://www.foxeletronic.com.br

Voltar ao Topo Ir em baixo

Re: CÓDIGO FONTE PIC

Mensagem por wilson carvalho em Ter 8 Abr 2014 - 20:21

Ola em um carregador de bateria profissional como esta explicando no inicio do código fonte
avatar
wilson carvalho
Nível 1
Nível 1

Mensagens : 6
Data de inscrição : 08/04/2014
Idade : 65
Localização : mirassol sp

Voltar ao Topo Ir em baixo

Re: CÓDIGO FONTE PIC

Mensagem por foxeletronic em Ter 8 Abr 2014 - 20:53

Ok.
avatar
foxeletronic
Avançado
Avançado

Mensagens : 759
Data de inscrição : 24/12/2012
Idade : 52
Localização : Capitão- RS

http://www.foxeletronic.com.br

Voltar ao Topo Ir em baixo

Re: CÓDIGO FONTE PIC

Mensagem por CMeletronica em Qua 9 Abr 2014 - 18:55

amigo ate da pra arriscar compilar o HEX mas posta o esquema pra facilitar na montagem
avatar
CMeletronica
MODERADOR e PARCEIRO
MODERADOR e PARCEIRO

Mensagens : 3102
Data de inscrição : 30/01/2013
Idade : 37
Localização : TRÊS RIOS

Voltar ao Topo Ir em baixo

CÓDIGO FONTE PIC

Mensagem por CarlosVot em Qui 10 Abr 2014 - 10:37

Bom Dia!

Tem o link original do projeto?
avatar
CarlosVot
Avançado
Avançado

Mensagens : 284
Data de inscrição : 31/10/2012
Idade : 57
Localização : São Paulo

Voltar ao Topo Ir em baixo

Re: CÓDIGO FONTE PIC

Mensagem por wilson carvalho em Sex 11 Abr 2014 - 14:37

Boa tarde.
Não foi possivel mandar o esquema que eu só tenho o da parte circuito de controle a parte do carregador tem que projetar não consegui mandar porque esta em pdf protegido, o link também não tenho só me foi enviado o esquema do circuito de controle com o código.
Acho que vai ter que ser na raça.
Faço uma pergunta este código esta em basic.

GRATO
avatar
wilson carvalho
Nível 1
Nível 1

Mensagens : 6
Data de inscrição : 08/04/2014
Idade : 65
Localização : mirassol sp

Voltar ao Topo Ir em baixo

Re: CÓDIGO FONTE PIC

Mensagem por Anderson M em Sex 11 Abr 2014 - 15:32

wilson carvalho escreveu:Boa tarde.
Não foi possivel mandar o esquema que eu só tenho o da parte circuito de controle a parte do carregador tem que projetar não consegui mandar porque esta em pdf protegido, o link também não tenho só me foi enviado o esquema  do circuito de controle com o código.
Acho que vai ter que ser na raça.
Faço uma pergunta este código esta em basic.

                                     GRATO

Boa tarde Sr Wilson Carvalho...

O esquema do projeto seria este em questão, comparando com o código que o senhor forneceu aqui no tópico.

http://www.toroid.com.br/arquivos-downloads/Carregador_Baterias_01.pdf  

Sim o código fonte está escrito em linguagem basic....

Na minha humilde opnião, este projeto não passa de marketing da empresa Toroid do Brasil. Provalmente este código fonte foi criado por outros programadores, era mais fácil eles fornecer o arquivo HEX pronto, já que o objetivo deles é venda do transformador. Pela análise vejo que nem eles conseguem dar suporte do problema.
avatar
Anderson M
Avançado
Avançado

Mensagens : 401
Data de inscrição : 07/07/2011
Localização : São Paulo/SP

Voltar ao Topo Ir em baixo

Re: CÓDIGO FONTE PIC

Mensagem por Anderson M em Sex 11 Abr 2014 - 16:38

Sr Wilson, procure entrar em contato com os idealizadores do projeto na empresa Toroid do Brasil, quem sabe assim eles possam disponibilizar o algorítimo já compilado em arquivo HEX. Isso é, se eles foram os idealizadores do algorítimo.

Na minha humilde opinião, achei este algorítimo enorme demais, parece com àqueles criado com compilador manjado CCS que meus colegas da universidade reclamam, e com muita razão. Quem usa este compilador CCS que é bem fresco, peço que não se sintam ofendidos, apenas é um comentário particular de minha pessoa.  

Eu até poderia escrever um algorítimo menor com linguagem C e usando compilador MikroC PRO, que na minha opinião deixa o código mais leve.

Siga as informações:

Contato:

http://www.toroid.com.br/contato/

Downloads:

http://www.toroid.com.br/downloads/

Boa sorte...
avatar
Anderson M
Avançado
Avançado

Mensagens : 401
Data de inscrição : 07/07/2011
Localização : São Paulo/SP

Voltar ao Topo Ir em baixo

Re: CÓDIGO FONTE PIC

Mensagem por wilson carvalho em Ter 15 Abr 2014 - 13:23

Boa tarde a todos.
Eu entrei em contato com o pessoal deste projeto para saber sobre o arquivo HEX deste código fonte,eles me passarão estas informações abaixo

[Aquele é o código fonte, base para desenvolvimento.
A partir dele, você pode desenvolver o que necessita.
Não temos nada além daquilo, como o arquivo.bas, o coompilador, etc.]

O que me parece que eles estão dizendo que este código que esta junto com o projeto e a base para desenvolver o que eu vou precisar, mas ai entender como fazer este código tem que entender de programação de código fonte, principalmente da linguagem basic ou eu estou enganado?
Para mim vai ficar dificil porque eu não entendo nada de programação de pic em linguagem alguma

Afirmando também que este projeto foi desenvolvido por um estagiário em engenharia elétrica o nome dele é ARIELTON TRENTO , também descobri ele no facebook mas ele não da reposta.
Eles parece que montarão uma fonte desta que no link aparece a foto dela montada.


GRATO
avatar
wilson carvalho
Nível 1
Nível 1

Mensagens : 6
Data de inscrição : 08/04/2014
Idade : 65
Localização : mirassol sp

Voltar ao Topo Ir em baixo

Re: CÓDIGO FONTE PIC

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum