quarta-feira, 8 de setembro de 2010

Contagiros digital com o pic

          Este projeto está em uso a mais de um ano e funciona muito bem, a montagem do circuito foi dividido em 2 partes o que reduziu o tamanho final do protótipo(além de não sobrecarregar o firmware do microcontrolador): placa de display 7 segmentos e placa de leds . O circuito nada mais é do que um frequencimetro digital ( conta os pulsos do alternador, pois este está acoplado ao motor e conseqüentemente a cada giro do motor é um giro do alternador ,mas isso depende do modelo da moto), valor da freqüência(RPM) e mostrado nos display 7 segmentos e cada um dos vintes leds da sequência são acionados a cada 500 RPM, ou seja para 2000RPM temos 4 leds acesos.Um detalhe importante é o fato dos leds terem cores diferentes para cada faixa de valores, até 5000RPM é verde, entre 5000 e 8000RPM amarelo, e acima de 8000RPM cor vermelha.veja na figura abaixo a foto do protótipo já instalado na moto e em dois momentos distintos.


Figura1 - contagiros já instalado na moto.

A placa do display 7 segmentos

             Afim de facilitar a interface entre as placas e usar uma quantidade menor de pinos do microcontrolador ( pois os led vão usar 20 dos 40 pinos do microcontrolador 16F877) foi colocado o CI CD4511 que é um decodificador bcd/7segmentos. O circuito da figura 2 mostra as principais interfaces.


Figura 2 – placa do display.

           De Q1 a Q4 são os transistores responsáveis por chavear os 4 displays pois o quinto display é mantido sempre em zero, pois não é significativo(veja que em todos os modelos comerciais de conta-giros analógicos são divididos por 10) pois o motor terá no minimo algo em torno de 900RPM, os resistores de R6 a R9 tem o valor de 1K,para economizar espaço e componentes foi utilizado um led para cada display.

A placa dos leds

           Os led estão dispostos conforme a figura 3.Onde é possível ver também o componente que é usado para gerar os pulsos no pino 17 do microcontrolador(versão de teste), embora que para uma melhor precisão utilizei os dois módulos CCPs (pino 16 e 17) na versão final do projeto.




Figura 3 – Simulação dos leds.


          Na placa dos leds existe um regulador de tensão que converte de 12 para 5V (LM 7805), pois a bateria da moto está entre 12V e 13.8V , os pinos de interface que saem do pic são :

Pino 8 - A (1° bit do código BCD).
Pino 9 - B (2° bit do código BCD).
Pino 10 - C (3° bit do código BCD).
Pino 18 - D (4° bit do código BCD).
Pino 4 - 1° digito.
Pino 5 - 2° digito.
Pino 3 - 3° digito.
Pino 6 - 4° digito.

           Apesar de ter ficado com bastante ligações e complexa (cheia de fios o que prejudica a visualização) optei por colocar aqui o esquemático usado para montar a placa, veja a figura 4.os resistores de R10 a R13 são de 120R/2W .


Figura 4 – Esquemáticos da placa dos leds.

               O sinal recebido do alternador é acoplado ao microcontrolador via CI 4N25, o sinal é aplicado no borne P1 e entregue ao borne P2 e dai aos pinos 17 e 16 do PIC, conforme a figura 4.


            Figura 4 – Acoplamento do sinal.

// ****************************************************************************************************************************************************
// Conta giro digital (funcionou)
// Data: 14/11/2008
// Autores: Aguivone
// Descrição: usando lcd
// ****************************************************************************************************************************************************
#include <16F877A.h>
#ignore_warnings 203, 216
#fuses NOWDT,XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4M)
boolean flg;
int32 rpm,conta,tmp,sobe,sobe2,valor,valor2;
int flag,dig1,dig2,dig3,dig4;
#locate rx_reg = 0x1A
void digito(int valor)
{
switch(valor)
{
case 0:{output_low(PIN_E0);output_low(PIN_E1);output_low(PIN_E2);output_low(PIN_C3);}//0000
break;
case 1:{output_high(PIN_E0);output_low(PIN_E1);output_low(PIN_E2);output_low(PIN_C3);}//1000
break;
case 2:{output_low(PIN_E0);output_high(PIN_E1);output_low(PIN_E2);output_low(PIN_C3);}//0100
break;
case 3:{output_high(PIN_E0);output_high(PIN_E1);output_low(PIN_E2);output_low(PIN_C3);}//1100
break;
case 4:{output_low(PIN_E0);output_low(PIN_E1);output_high(PIN_E2);output_low(PIN_C3);}//0010
break;
case 5:{output_high(PIN_E0);output_low(PIN_E1);output_high(PIN_E2);output_low(PIN_C3);}//1010
break;
case 6:{output_low(PIN_E0);output_high(PIN_E1);output_high(PIN_E2);output_low(PIN_C3);}//0110
break;
case 7:{output_high(PIN_E0);output_high(PIN_E1);output_high(PIN_E2);output_low(PIN_C3);}//1110
break;
case 8:{output_low(PIN_E0);output_low(PIN_E1);output_low(PIN_E2);output_high(PIN_C3);}//0001
break;
case 9:{output_high(PIN_E0);output_low(PIN_E1);output_low(PIN_E2);output_high(PIN_C3);}//1001
break;
}
}
void converte(void)
{
dig1=0;
dig2=0;
dig3=0;
dig4=0;
while(rpm!=0)
{
rpm--;
while(rpm>=1000)
{
dig4++;
rpm=rpm-1000;
}
while(rpm>=100)
{
dig3++;
rpm=rpm-100;
}
while(rpm>=10)
{
dig2++;
rpm=rpm-10;
}
while(rpm>=1)
{
dig1++;
rpm=rpm-1;
}
}

}
#int_ccp1
void isr2()
{
sobe=CCP_1;
if(flag==1)
{
if(sobe2<=sobe) { valor2=sobe-sobe2; } else { conta=sobe2-sobe; valor2=65536-conta; } flag=2; } } #int_ccp2 void isr() { sobe2 = CCP_2; if(sobe2>=sobe)
{
valor =sobe2-sobe;
}
else
{
conta=sobe-sobe2;
valor =65536-conta;
}
flag=1;
}

//////////////////////////////////////////////////////////////////
void main(void)
{
#priority ccp2,ccp1
setup_ccp1(CCP_CAPTURE_FE); // Configure CCP1 to capture rise
setup_ccp2(CCP_CAPTURE_RE); // Configure CCP2 to capture subida
//setup_ccp2(CCP_CAPTURE_DIV_4);
setup_timer_1(T1_INTERNAL); // Start timer 1
enable_interrupts(INT_CCP2); // Setup interrupt on falling edge
enable_interrupts(INT_CCP1); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
set_tris_a(0); // define o port a como saída
set_tris_b(0); // define o port b como saída
set_tris_d(0); // define o port b como saída
set_tris_c(15); // define o port d como saída
set_tris_e(0); // define o port e como saída
conta=0;
enable_interrupts(global);
output_b (0);
output_d (0);
rpm=0;
dig1=0;
dig2=0;
dig3=0;
dig4=0;
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (0);
output_d (0);
for(;;)
{
if(flag==2)
{
disable_interrupts(GLOBAL);
valor=valor+valor2;
tmp=1000000/valor;
rpm=tmp*6;
flg=0;
if((rpm<=100)&&(flg==0)) { output_low(PIN_C4); output_low(PIN_C5); output_low(PIN_C6); output_low(PIN_C7); output_b (0); output_d (0); flg=1; } if((rpm>=1000)&&(flg==0))
{
output_high(PIN_C4);
output_high(PIN_C5);
output_high(PIN_C6);
output_high(PIN_C7);
output_b (255);
output_d (255);
flg=1;
}
if((rpm>=950)&&(flg==0))
{
output_high(PIN_C4);
output_high(PIN_C5);
output_high(PIN_C6);
output_high(PIN_C7);
output_b (255);
output_d (254);
flg=1;
}
if((rpm>=900)&&(flg==0))
{
output_high(PIN_C4);
output_high(PIN_C5);
output_high(PIN_C6);
output_high(PIN_C7);
output_b (255);
output_d (252);
flg=1;
}
if((rpm>=850)&&(flg==0))
{
output_low(PIN_C4);
output_high(PIN_C5);
output_high(PIN_C6);
output_high(PIN_C7);
output_b (255);
output_d (252);
flg=1;
}
if((rpm>=800)&&(flg==0))
{
output_low(PIN_C4);
output_high(PIN_C5);
output_high(PIN_C6);
output_high(PIN_C7);
output_b (255);
output_d (244);
flg=1;
}
if((rpm>=750)&&(flg==0))
{
output_low(PIN_C4);
output_high(PIN_C5);
output_high(PIN_C6);
output_high(PIN_C7);
output_b (255);
output_d (240);
flg=1;
}
if((rpm>=700)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_high(PIN_C6);
output_high(PIN_C7);
output_b (255);
output_d (240);
flg=1;
}
if((rpm>=650)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_high(PIN_C7);
output_b (255);
output_d (240);
flg=1;
}
if((rpm>=600)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (255);
output_d (240);
flg=1;
}
if((rpm>=550)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (255);
output_d (224);
flg=1;
}
if((rpm>=500)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (255);
output_d (192);
flg=1;
}
if((rpm>=450)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (255);
output_d (128);
flg=1;
}

if((rpm>=400)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (255);
output_d (0);
flg=1;
}

if((rpm>=350)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (254);
output_d (0);
flg=1;
}

if((rpm>=300)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (252);
output_d (0);
flg=1;
}
if((rpm>=250)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (248);
output_d (0);
flg=1;
}
if((rpm>=200)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (240);
output_d (0);
flg=1;
}
if((rpm>=150)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (224);
output_d (0);
flg=1;
}
if((rpm>=100)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (192);
output_d (0);
flg=1;
}
if((rpm>=50)&&(flg==0))
{
output_low(PIN_C4);
output_low(PIN_C5);
output_low(PIN_C6);
output_low(PIN_C7);
output_b (128);
output_d (0);
flg=1;
}
converte();
flag=0;
enable_interrupts(GLOBAL);
}
output_low(PIN_A5);output_low(PIN_A1);output_low(PIN_A3);output_low(PIN_A2);
digito(dig1);
output_low(PIN_A5);output_low(PIN_A1);output_low(PIN_A3);output_high(PIN_A2);
delay_ms(3);
output_low(PIN_A5);output_low(PIN_A1);output_low(PIN_A3);output_low(PIN_A2);
digito(dig2);
output_low(PIN_A5);output_low(PIN_A1);output_high(PIN_A3);output_low(PIN_A2);
delay_ms(3);
output_low(PIN_A5);output_low(PIN_A1);output_low(PIN_A3);output_low(PIN_A2);
digito(dig3);
output_low(PIN_A5);output_high(PIN_A1);output_low(PIN_A3);output_low(PIN_A2);
delay_ms(3);
output_low(PIN_A5);output_low(PIN_A1);output_low(PIN_A3);output_low(PIN_A2);
digito(dig4);
output_high(PIN_A5);output_low(PIN_A1);output_low(PIN_A3);output_low(PIN_A2);
delay_ms(3);
}

}

Video do contagiros funcionando.

23 comentários :

  1. ola amigo teria a possibilidade de vcme passar a lista de componentes para se compra para montar esse conta giros?

    obrigado
    aguardo resposta
    msn e email:
    elmarmalzyn@yahoo.com.br

    ResponderExcluir
  2. tem sim, vou enviar para seu e-mail em breve.

    ResponderExcluir
  3. amigo,
    tem interesse em fazer e vender um que seje horinzontal com aproximadamente 7 leds que ascendam progressivamente quando o motor passar de 7000rpm? (estilo os de formula 1 )
    Tenho uma xr tornado e gostaria de instalar um debaixo do velocimetro
    estou procurando comprar um pela internet. Mas não acho em lugar algum
    abraço

    ResponderExcluir
  4. para isso basta não usar os leds que vão até 7000 rpm, veja que este circuito pode marcar até 10000 rpm , mas com algumas mudanças pode chegar a 20000 rpm .qual a rotação maxima da sua XR tornado?

    ResponderExcluir
  5. o limite dela são 10500rpm. Fiquei bastante interessado num desses. Caso eu não ache em lugar algum, vou tentar fazer.

    ResponderExcluir
  6. eu estava pensando em fazer uma nova versão com leds de alto brilho,mas estou um pouco sem tempo , mas quando fizer vou postar aqui(pois quero fazer alguns melhoramentos neste projeto )

    ResponderExcluir
  7. opa gostei do seu projeto, gostaria de saber se tem como me mandar o arquivo .hex desse programa ?
    pois tentei compilar este q esta ai mas da uns erros..
    caso possa me mandar o arquivo meu email é
    willian_cristianoo@hotmail.com
    desde já agradeço

    ResponderExcluir
  8. vou te passar da versão 2011, embora eu fiz algumas modificações o programa praticamente é o mesmo .

    ResponderExcluir
  9. obrigado valeu por mandar o codigo fonte.. se nao for encomodar muito teria como mandar o esquema do projeto ? pq ali em cima nao da pra abrir muito grande dai nao da pra ve muita coisa hehehe.. se tiver ele no proteus melhor ainda..vlw e mais uma vz obrigado

    ResponderExcluir
  10. Olá amigo, achei muito interessante esse projeto.
    quero colocar na minha moto.
    Você tem como me passar o esquemático e o arquivo hex.
    Eu simulei essa programação no proteus, mas não funcionou.
    fernandors96@hotmail.com

    ResponderExcluir
  11. se vc simular somente os leds verá que funciona, mas se colocar os display o proteus não consegue simular pois sobrecarrega o pc.uma vez que vc tem o código fonte basta copiar e colar no ccs(acoplado ao mplab)e gerar o hexa, já o esquemático basta ver a figura que embora não esteja bem nítida da pra ter uma noção,então vc estudando o código fonte mata fácil como montar o circuito.

    ResponderExcluir
  12. Olá boa tarde, legal esse projeto qual compilador Vc usa?

    ResponderExcluir
  13. quando eu estava programando para pic(ultimamente uso os AVR's)eu usava o compilador CCS com um plugin pro MPlab dai eu rodava o CCS na IDE do MPlab

    ResponderExcluir
  14. Boa tarde amigo !! gostei muito do projeto e gostaria de fazer um por hobby! teria como me enviar os arquivos de montagem e codigo fonte para meu email se por gentileza ou em algum site de downloads dos arquivos

    ResponderExcluir
  15. ola amigo tenho um problema e gostaria que vc me ajudasse: estou com dois projetos pra fazer mas nao estou conseguindo sao eles: um circuito de leds tipo super maquina onde os leds se cruzam e o outro é rpm de leds, o circuito da super maquina eu fiz no ares simulei mas na placa nao deu certo, ja o outro nao concegui ainda! lembrando que estou fazendo esse circuito com um ci 555 e um ci 4017 1n 4148 e outros poderia me ajudar ou se vc tiver um esquema parecido com esse pode me passar, quero fazer um circuito simples. valew e abraços!

    ResponderExcluir
  16. boa tarde amigo, teria como você enviar para meu email o projeto?

    fabio.musicosax@gmail.com

    vou colocar no meu kart motor 4T Honda "estacionário" tem que pegar pelo pulso dado do cabo de vela, tem como?

    obrigado

    ResponderExcluir
  17. amigo, qual a intenção do 4n25? estou tentando montar um conta-giro pra mim com um 16f628a, pelo pulso da bobina , faço assim: PULSO > DIODO > BC327 > PIC. porém quando o motor entra em funcionamento o pic fica reiniciando, pode me ajudar?

    ResponderExcluir
  18. boa noite, aguivone exelente o projeto , poderia me enviar o arquivo .hex desse programa ,se eu montar somente com os leds ,o programa seria o mesmo? grato dfm1969@gmail.com

    ResponderExcluir
  19. boaa noite amigo
    vc poderia me passar o esquema eo codigo hex
    casado40euns@hotmail.com

    ResponderExcluir
  20. Se vc juntar as informações da figura da simulação com o esquemático que está aqui mais o código fonte não terá dificuldade para entender, não tenho mais os arquivos deste projeto(já faz um bom tempo).

    ResponderExcluir
  21. Pode me passar a lista de componentes utilizados?

    ResponderExcluir
    Respostas
    1. Pode me passar lista dos componentes utilizados??

      email: velascoluan@gmail.com

      Excluir
  22. Boa noite Aguivone!!
    Cara curti muito seu projeto, estou atrás de um similar, na vdd e sem os leds, so os 4 displays, e sem usar micro controladores... saberia me dizer se tem como fazer nesse método?

    ResponderExcluir

olá,digite aqui seu comentário!