FAÇA UM VOLTÍMETRO DE 3 DÍGITOS COM PIC16F628A

Gostaria de montar um voltímetro digital para a sua fonte de alimentação? Ou controlar a tensão de algum processo, de uma forma barata? Então, você desejará saber mais…

Veja o esquema abaixo:

O circuito proposto trata-se de um voltímetro digital de 3 digitos, construido com a técnica de conversão Delta_Sigma, própria para microcontroladores que não dispõem de conversor analógico/digital internos. Os displays são multiplexados, usando a rotina do timer 0 para orquestrar esta multiplexação.

A TÉCNICA DELTA-SIGMA

Para iniciar, note nos pinos 17 e 18, a presença de uma malha resistiva/capacitiva (RC). Ela visa atuar como um integrador da tensão a ser medida. Veja que no terminal do capacitor de 0,22 microfarads , recebe a soma da tensão de entrada com a tensão fornecida pelo modulador de 1 bit (fornece somente ‘0’ ou ‘5’ volts), através do resistor de 47k ligado ao pino 17 (porta,0).
Pelo pino 18 (porta,1) é comparado a tensão presente nele com a tensão de refêrencia (2,5 volts). Se a tensão de referência for maior, aciona o pino 17 para nivel ‘1’, decrementa contador de resolução (CICLO1/CICLO) e começa a carregar o capacitor até que a tensão seja maior que a de referência. Nesta ocasião, após a comparação, se a tensão de entrada do integrador for maior que a de referência, a saída do pino 17 se torna ‘0’, descarregando o capacitor e incrementando nesta ocasião, o resultado em C1/C0 e decrementando o contador de resolução. Isto continua até terminar o número de conversões determinado pelo contador de resolução. Mais detalhes desta técnica poderá ser visto na Note Application AN700 da Microchip.

O CÓDIGO ASM

O programa começa realizando a configuração de portas e registradores. O comparador é ligado para funcionar apenas um dos dois comparadores no chip. A voltagem de referência interna também é ligada e ajustada para 2,5 volts, ligando sua saída para o pino 1 (porta,2). Depois, o programa entra no loop principal, fazendo a leitura da entrada e dando um atraso entre a próxima leitura, em um ciclo infinito. O timer 0 é ligado com prescaller e interrupção, que é usada na rotina de multiplexação dos display de 7 seguimentos de ânodo comum. O ponto é fixo, sendo ligado junto a saída ‘k1’.

UTILIDADES

A idéia veio da necessidade de construir um voltímetro para uma fonte de bancada, mas que fosse com o PIC 16F628a. Mas, nada impede de outros usos para este voltímetro. Vai da sua necessidade e criatividade!
Pode ser usado para medir de 0 a 25 volts , com segurança. Para outras tensões, deverá mudar os resistores de entrada.

CALIBRAÇÃO

Para calibrar de forma simples, apenas ligue o ponto de teste ‘PT1’ Ao Vcc (+5 volts). Ajuste o trimpot para ler exatos ‘5.0 volts’. Pronto! Caso queira mais facilidade no ajuste, coloque um trimpot ‘multivoltas’, pois o ajuste é um pouco sensivel.
Obs. Este material foi montado e testado apenas em placa de protoboard, podendo ter bugs ainda não identificados. Esta sendo fornecido o arquivo ASM, que poderá ser alterado segundo as necessidades dos hobistas.

Segue o arquivo ASM:

PIC_VOLT_628_ASM

Segue o arquivo HEX:

PIC_VOLT_628_HEX

Adicionalmente, em 31/12/2014, acrescentei esta versão em código “C”:

PIC_VOLT_C

Ainda em 16/03/2024 foi acrescentado esta pasta zipada com uma versão de voltímetro  com 3 displays de cátodo comum, com escala máxima ajustada no programa para 99.9 Volts. Note que o  esquema da ligação dos pinos é  um pouco diferente das versões anteriores.

PIC_VOLT_628_100V_ZIP

E abaixo a versão para display de 7 seguimentos do tipo ânodo comum:

PIC_VOLT_628_100V_ANODO_ZIP

Manuais:
AN700 – Conversor Delta-sigma
Pic 16F628A

Curiosidades:
Conceito equilibrado sobre o trabalho
Histórias de sobreviventes do tsunami do Japão
O rei dos relógios
O desafio da longitude para os navegadores do passado
Os melhores brinquedos
O mistério de Cahokia
Quais são alguns dos avanços no campo da energia
Por que tantos crimes violentos?
Como vai a sua Tireóide?
Matemática para todos
Beneficios da amamentação na Inteligência das criança
A glória das estrelas
Al_Jazari – ‘pai da robótica’?
O ‘pim’ – confirma relato biblico

Outros assuntos:
Como sobreviver ao primeiro ano de casamento
Quando um dos conjuges tem necessidades especiais
Como lidar com dívidas
Como resolver diferenças no casamento
Como tratar o conjuge com respeito
Como evitar ferir com palavras
Ensine seus filhos bons principios com atividades de colorir
Como posso ter ânimo para exercitar
Como posso controlar meu peso?
Entrevista com um bioquímico
Como você encontra tempo para deveres escolares?

Até o próximo artigo!!!

32 comments on “FAÇA UM VOLTÍMETRO DE 3 DÍGITOS COM PIC16F628A

  1. Olá Claudio,
    Eu estou fazendo um termostato para cerca de 1000 graus Celsius, usando um K. termopar
    E eu projetei o amplificador e obter 10 mV / ° C (compensação de temperatura ambiente), eu quero adicionar um metro, e quer usar seu design, mas com um display de 4 dígitos, para me dar 000 ° a 999 °.
    Obrigado por compartilhar o seu conhecimento.
    Saudações.

    Hola Claudio,
    Estoy haciendo un termostato para aproximadamente 1000 grados centigrados, usando un termopar K.
    Ya diseñé el amplificador y obtengo 10 mV/°C (con compensacion de temperatura ambiente), le quiero agregar un medidor, y deseo usar tu diseño pero con un display de 4 digitos, que me diera de 000° a 999°.
    Gracias por compartir sus conocimientos.
    Saludos.

    1. Olá Jandos!
      Muito interessante este seu projeto! Mas creio que você necessitará de um voltímetro bem preciso e com muitas escalas para abranger a sua medição. Você não conseguirá boa precisão com o método delta-sigma. Melhor usar talvez um outro projeto, que use conversor analógico/digital de pelo menos 10 bits (mais melhor) e com algum software para escalas automáticas, para melhorar a precisão na escala baixa de 0 a 10 graus.
      Cláudio

      1. Olá Claudio,
        Muito obrigado pela sua sugestão, eu vou lidar com o ICL7107 e ICL7106.
        Saudações.

        Hola Claudio,
        Muchas gracias por tu sugerencia, voy a tratar con el ICL7107 y el ICL7106.
        Saludos.

  2. GRANDE AMIGO, DESCULPE INCOMODAR, MAS SEI QUE VOCÊ É PROFISSIONAL EM ASSEMBLY, QUERIA QUE VERIFICASSE PARA MIM, PORQUE NÃO QUER FUNCIONAR CORRETAMENTE ESSE MULTIMETRO COM 4 LEDS, NÃO SEI COMO USAR OS 10 BITS, E COM 8 FUNCIONA, MAS ACENDE TODOS LEDS COM 2,5V TEM COMO ME AJUDAR:

    LIST P= 12F675;

    __CONFIG B’11000110010100′; H’3194′

    COUNTER EQU H’23’;
    ADC_READ EQU H’24’;
    LED1ON_COMP EQU H’25’;
    LED2ON_COMP EQU H’26’;
    LED4ON_COMP EQU H’27’;
    LED5ON_COMP EQU H’28’;
    WORK_SAVE EQU H’29’;
    STATUS_SAVE EQU H’30’;
    #DEFINE BANK0 BCF H’03’, 0X05;
    #DEFINE BANK1 BSF H’03’, 0X05;

    ORG 0x000;

    GOTO MAIN;

    ORG 0x004;
    MOVWF WORK_SAVE ;SALVA ‘W’
    SWAPF H’03’, 0X00; ;SALVA ‘STATUS’
    MOVWF STATUS_SAVE;
    INCF COUNTER;
    BCF H’0B’, 0X2;
    SWAPF STATUS_SAVE, 0X00; ;RECUPERA ‘STATUS’
    MOVWF H’03’;
    MOVFW WORK_SAVE ;RECUPERA ‘W’
    RETFIE;

    MAIN
    BANK0;
    MOVLW B’11100000′;
    MOVWF H’0B’;
    MOVLW B’00000111′; 0x07;
    MOVWF H’19’;
    BANK1;
    MOVLW B’11000101′;
    MOVWF H’81’;
    MOVLW B’00010001′;
    MOVWF H’9F’;
    MOVLW B’00001001′;
    MOVWF H’85’;
    BANK0;
    MOVLW B’10000001′;
    MOVWF H’1F’;
    MOVLW B’00000000′;
    MOVWF H’05’;
    MOVLW D’60’;
    MOVWF LED1ON_COMP;
    MOVLW D’100′;
    MOVWF LED2ON_COMP;
    MOVLW D’200′;
    MOVWF LED4ON_COMP;
    MOVLW D’255′;
    MOVWF LED5ON_COMP;

    CLRF COUNTER;

    LOOP:
    CALL DELAYL;
    CALL GETADC;
    CALL DELAY;
    CALL DELAY;
    CALL DELAY;
    CALL DELAY;
    GOTO LOOP;

    DELAY:
    CLRF COUNTER;
    BTFSS COUNTER, 0X3;
    GOTO $-1;
    CLRF COUNTER;
    RETURN;

    DELAYL:
    CLRF COUNTER;
    BTFSS COUNTER, 0X0;
    GOTO $-1;
    CLRF COUNTER;
    RETURN;

    GETADC:
    BANK0;
    BSF H’1F’, 0X1;
    BTFSC H’1F’, 0X1;
    GOTO $-1;
    BANK1;
    MOVF H’9E’, 0X00;
    MOVWF ADC_READ;
    CALL TEST_ADC;
    RETURN;

    TEST_ADC:
    FIRST_TEST:
    BANK0;
    MOVF LED1ON_COMP,0X00;
    SUBWF ADC_READ,0X00;
    BTFSC H’03’, 0X00;
    GOTO LED1ON;
    GOTO LED10FF;

    SECOND_TEST:
    BANK0;
    MOVF LED2ON_COMP,0X00;
    SUBWF ADC_READ,0X00;
    BTFSC H’03’, 0X00;
    GOTO LED2ON;
    GOTO LED20FF;

    FOURTH_TEST:
    BANK0;
    MOVF LED4ON_COMP,0X00;
    SUBWF ADC_READ,0X00;
    BTFSC H’03’, 0X00;
    GOTO LED4ON;
    GOTO LED4OFF;

    FIFTH_TEST:
    BANK0;
    MOVF LED5ON_COMP,0X00;
    SUBWF ADC_READ,0X00;
    BTFSC H’03’, 0X00;
    GOTO LED5ON;
    GOTO LED5OFF;

    END_TEST:
    RETURN;

    LED1ON:
    BANK0;
    BSF H’05’, 0X01;
    GOTO SECOND_TEST;

    LED10FF:
    BANK0;
    BCF H’05’, 0X01;
    GOTO SECOND_TEST;

    LED2ON:
    BANK0;
    BSF H’05’, 0X02;
    GOTO FOURTH_TEST;

    LED20FF:
    BANK0;
    BCF H’05’, 0X02;
    GOTO FOURTH_TEST;

    LED4ON:
    BANK0;
    BSF H’05’, 0X04;
    GOTO FIFTH_TEST;

    LED4OFF:
    BANK0;
    BCF H’05’, 0X04;
    GOTO FIFTH_TEST;

    LED5ON:
    BANK0;
    BSF H’05’, 0X05;
    GOTO END_TEST;

    LED5OFF:
    BANK0;
    BCF H’05’, 0X05;
    GOTO END_TEST;

    END;

    1. Olá Paulo!
      Infelizmente não sou especialista como você diz. Quem me dera! Mas no código acima, o valor da conversão está sendo pego apenas do registrador ADRESL (0x9E), portanto, apenas 8 bits. Na comparação o mesmo ocorre, usando apenas 8 bits. Para usar 10 bits teria que usar o registrador ADRESH (0x1E) também. Talvez você possa contornar a situação reduzindo a entrada de sinal com um trimpot de 10 k ohms, onde o curso fica na entrada do pic e um lado ao gnd, e o outro lado para a tensão a ser medida. Ajuste a tensão para sair 1/4 do valor da entrada e você terá o circuito funcionando do jeito correto, mesmo com 8 bits. O código é seu? Tem o esquema que possa compartilhar e o uso prático?
      Claudio

      1. Olá, Muito obrigado pela explicação, eu consegui fazer esse projeto funcionar mudando o alinhamento a esquerda, e pegando o ADRESH (0X1E), O CÓDIGO FUI EM QUEM DESENVOLVI, COMO TINHA DITO EU FIZ UM CURSINHO DE ASSEMBLY, AINDA TOU FAZENDO, AÍ JÁ GOSTO DE IR DESENVOLVENDO OS MEUS CÓDIGO, APESAR QUE DEVE TÁ MUITO MAL FEITO ESSE CÓDIGO NÉ? TENHO TAMBÉM O ESQUEMA NO PROTEUS, E FUNCIONOU LEGAL NO PROTEUS, SERÁ QUE NA PRATICA FUNCIONARIA? MAIS UMA PERGUNTA, SERÁ QUE SE EU USASSE UMA MARIX DE LEDS NO CASO 16 LEDS, DARIA PARA FAZER ELES FUNCIONAR USANDO 16 EM VEZ DE 4? DESDE JÁ OBRIGADO PELA RESPOSTA. ATT. PAULO

        1. Olá Paulo!
          Muito bom que tenha encontrado por você mesmo uma solução! Verá que em situações parecidas haverá muitas opções tanto no software como no hardware. Quanto a funcionar, creio que não terá problemas na prática, visto que funcionou no simulador Proteus, bem confiável. Com o uso de 16 leds, necessitará de 4 saída do pic para fazer esta matriz. Os intervalos ficarão mais apertados
          sendo necessário comparar ambos registradores do ADC (ADRESL/ADRESH). Sendo 1024 bits /16 = 64, assim, cada degrau seria 64 bits acima até chegar em 1024. Quanto a matriz, ela é meio complicada porque terá que acionar tanto a saída como o sentido da saída, para que somente um led fique aceso por vez. Mas acredito que você possa fazer se persistir.
          Claudio

    1. Olá Marcos!
      Obrigado por sua sugestão! A maior dificuldade é o elemento sensor, no caso, um resistor de baixo valor, sobre o qual será medido uma pequena tensão proporcional a corrente que circula por ele.
      Sempre necessita outros amplificadores operacionais para aumentar o ganho, e por isto tenho evitado esta montagem.
      Cláudio

  3. Boa tarde Claudio
    Tem um link aqui de um Temporizador usando o comparador do PIC16F628A mas o link tá dando um erro assim.
    Sorry, but you don’t have access to this forum
    Gostaria de saber como fazer para ver o link do Temporizador.
    obrigado.

    1. Olá Florisvaldo! Tem que se registrar para usar esta seção do blog. Mas não tem um artigo específico de temporizador nesta seção, apesar do tema sugerir.
      Cláudio

    1. Olá Florisvaldo! Este código foi originalmente escrito em ASM, porque nesta época ainda não estava familiarizado com a linguagem “C”. Quem sabe mais para frente, possa reescreve-lo em “C” tanto este como outros postados em ASM.
      Cláudio

Comments are closed.

Back To Top