Acionamento de carga AC

Elaborar um programa em linguagem C para o PIC18F4550 para acionamento de uma carga.

O hardware deverá conter:

  • Um botão para acionamento do microcontrolador
  • Uma saída para o acionamento de carga
  • Etapa de acionamento com acoplamento ótico
  • Indicação de “status” no LCD 16 x 2
Hardware em funcionamento com botão solto

Hardware em funcionamento com botão pressionado



   

1. Acionamento de carga AC por meio de relé



Substituir ou ligar em paralelo ao conjunto resistor/led ligado a B7, o hardware proposto  pelo circuito abaixo:




Simulador de carga


Com o objetivo de simplificar e diminuir riscos com as ligações em AC, foi montado um simulador de carga com 4 cargas em 220Vac:


  • Lâmpada - carga resistiva
  • Campainha - carga indutiva de alta impedância
  • Contatora com bobina de 220Vac - carga indutiva de baixa impedância
  • Transformador 220Vac\24Vac que aciona uma contatora com bobina de 24Vac - cara indutiva de baixa impedãncia




Conexão ao simulador de carga




  • Conectar o contato C (Comum) do relé ao conector AC-MT1 
  • Conectar o contato NA (Normalmente Aberto) do relé ao conector "MT2-Carga". 
  • Escolher a carga (sentido de numeração da direita para a esquerda


    • 1 - Lâmpada
    • 2 - Campainha
    • 3 - Contatora
    • 4 - Transformador





   

2. Acionamento de carga AC por meio de triac


Substituir ou ligar em paralelo ao conjunto resistor/led ligado a B7, o hardware proposto  pelo circuito abaixo:





Conexão ao simulador de carga



  • Conectar o contato MT1 do traic ao conector AC-MT1 
  • Conectar o contato MT2 do triac ao conector "MT2-Carga". 
  • Escolher a carga (sentido de numeração da direita para a esquerda
    • 1 - Lâmpada
    • 2 - Campainha
    • 3 - Contatora
    • 4 - Transformador



Não esqueça de incluir um circuito “snubber” (100Ω/5W em série com 100nF/600V) ligado em paralelo a carga para situação de carga com baixa impedância.









   

Acionamento de carga DC



1. Acionamento de carga por transistor Bipolar

Utilize como base o programa da atividade menu com controle de tempos.




Modificações a serem implementadas:


  • Altere o programa para termos como opções de tempo:
    • 250ms
    • 500ms
    • 750ms
    • 1s
  • Substitua o led por um buzzer de 12V. 




Mostrar no LCD:

  • No programa (buzzer acionado):
    • 1ª linha do LCD: Tempo selecionado
    • 2ª linha do LCD: Opção para entrar no menu
  • No menu (trocar o tempo, buzzer desligado):
    • 1ª linha do LCD: O tempo selecionado
    • 2ª linha do LCD: As funções dos botões


   

2. Acionamento de carga por transistor mosfet

Substitua o transistor da atividade anterior por um transistor MOSFET (IRFxxx por exemplo) 




   

sexta-feira, 9 de setembro de 2016

Montagens em hardware


Utilizar a o hardware básico com auxílio de uma protoboard para elaborar os projetos já desenvolvidos

1. Status do botão e led no LCD

Implementar em hardware um led controlado por um botão com status no LCD




  





2. Semáforo do cruzamento com informações no LCD

Implementar em hardware 3 semáforos para indicar os 3 tempos com as informações no display de LCD




  


3. Display de 7 segmentos

As chaves podem usados "push buttons" ou "fios jumpers" que simulem chaves liga-desliga.

Para o funcionamento deste projeto (Display de 7 segmentos) implementação siga as modificações listadas abaixo para o programa funcionar no hardware básico


Hardware:
Desconecte os pinos B4, B5, B6 e B7 do GND


Software:
Coloque os pinos  B4, B5, B6 e B7 como saída e "zere" o seu conteúdo.

  • Onde tinha:
    • TRISB = 0b11111111;
  • Substitua por 
    • TRISB = 0b00001111;
    • LATB = 0;




  


4. Contador binário com LCD


Mostrar no LCD os formatos decimal, hexadecimal e binário




  

5. Controle de tempo com menu


Montar o hardware para funcionamento





  

Teclados - Atividade 5


Teclado matricial com 16 teclas por conversor A/D e interrupção


Abaixo o hardware para a montagem do teclado com 16 teclas.




1. Carregue o programa da Atividade 2 do teclado (conversor A/D com Vref+ e Vref- que mostra o valor convertido).

2. Monte o hardware acima

3. Ajuste  Vref+ e Vref-. 

  • Procure a tecla com o maior valor convertido. Ajuste Vref+ de forma que o valor fique um pouco abaixo de 1023.
  • Procure a tecla com o menor valor convertido. Ajuste Vref- de forma que o valor fique um pouco acima de 0.
  • Repita o processo, pois o ajuste de Vref- pode influir no ajuste de Vref+ e vice versa.


4. Pressione cada tecla e anote os valores convertidos mínimo e máximo.

5. Criar a nova tabela de ranges (explicado na Atividade 3). 
          Planilha para cálculo dos ranges com 16 teclas

6. Utilize como base o programa da atividade 04 e faça a identificação de cada tecla por interrupção.



   
Descrição da pinagem do teclado de membrana








   




   

Teclados - Atividade 4


Identificando teclas por ranges com o teclado por A/D com interrupção.






1. Carregue o programa da Atividade 2 do teclado (conversor A/D com Vref+ e Vref- que mostra o valor convertido).

2. Monte o hardware acima

3. Ajuste  Vref+ e Vref-. 

  • Procure a tecla com o maior valor convertido. Ajuste Vref+ de forma que o valor fique um pouco abaixo de 1023.
  • Procure a tecla com o menor valor convertido. Ajuste Vref- de forma que o valor fique um pouco acima de 0.
  • Repita o processo, pois o ajuste de Vref- pode influir no ajuste de Vref+ e vice versa.


4. Pressione cada tecla e anote os valores convertidos mínimo e máximo.

5. Criar a nova tabela de ranges (explicado na Atividade 3).

5. Utilize o programa da Atividade 03 como base para criar a Atividade 4:


  • Realize as configurações gerais para interrupção (função config_int()).
  • Configure a Interrupção externa 0 (função config_int0()).
  • Mova o conteúdo do looping infinito (while(1)) para a função de interrupção. O while(1) fica “vazio” sem nenhum comando.
  • Ajuste os ranges para identificação de cada tecla de acordo com a nova tabela (item 2 acima)

6. Teste o programa no simulador. Lembre que os valores de hardware são diferentes de simulação, onde os componentes possuem características ideias. 

7. Apresente o programa com o hardware.


   




Teclados - Atividade 3



Identificando teclas por faixa de valores do A/D


Com base no programa desenvolvido em “Teclados – Atividade 2” (Inserção de tensões de referências no conversor A/D), implemente o software para identificar as teclas e mostrar no LCD.







   

Dicas de implementação


I - Dividindo a faixa de valores do conversor

1. Supondo que foi obtido os valores mínimos e máximos (exemplo hipotético) para cada tecla na Atividade 2:

  • Tecla 1: 800 - 850
  • Tecla 2: 400 - 430
  • Tecla 3: 230 - 270
  • Tecla 4: 50 - 58

2. Posicione os valores em uma reta considerando o menor e maior valores possíveis do conversor A/D (0 e 1023)



3. Calcule a distância entre o menor valor da Tecla 3 (230) e o maior valor da Tecla 4 (58)



4. Divida o espaço encontrado (172) em 2 partes iguais (86)


 5. Encontre o ponto médio entre a Tecla 4 e a Tecla 3 (144)



 6. Repita o processo para encontrar os pontos médios entre a Tecla 3 e Tecla 2, e o ponto médio entre a Tecla 2 e a Tecla 1



7. Arbitre valores entre 0 e o menor valor a Tecla 4 (15), e entre o maior valor da Tecla 1 e 1023 (1000), de forma que esses valores não atinjam o mínimo (0) e o máximo (1023)






   


II - Identificando as teclas

Com base nos valores inicias e finais de cada faixa, implemente testes (if) que testem se o valor está dentro de cada faixa e indique no LCD qual foi a tecla pressionada.
  • if (valor_convertido > 15 && valor_convertido<144) “imprime_no_lcd (“Tecla 4”);
  • if (valor_convertido > 144 && valor_convertido<335) “imprime_no_lcd(“Tecla 3”);
  • if (valor_convertido > 335 && valor_convertido<615) “imprime_no_lcd(“Tecla 2”);
  • if (valor_convertido > 615 && valor_convertido<1000) “imprime_no_lcd(“Tecla 1”);


   




Teclados - Atividade 2


Inserção de tensões de referências no conversor A/D


Utilizando o menor valor de tensão obtido em “Teclados - Atividade 1” calibre uma tensão referência negativa (-Vref) “um pouco abaixo” do menor valor de tensão obtido.

Utilizando o maior valor de tensão obtido em “Teclados - Atividade 1” calibre uma tensão referência positiva (+Vref) “um pouco acima” do maior valor de tensão obtido.




Dicas de implementação

1. Na configuração do conversor A/D, no registrador ADCON1, defina –Vref e +Vref como sinais externos

  • Bit 5: VCFG1: seleção da –Vref
    • 1: -Vref = AN2
    • 0: -Vref = VSS
  • Bit 4: VCFG2: seleção da +Vref
    • 1: +Vref = AN3
    • 0: +Vref = VDD



2. Defina os pinos AN2 e AN3 como entradas além de AN0 no registrador TRIS na função main().


   


Atividade para entregar - mostrar



Preencha a tabela abaixo baseado nos dados do obtidos no hardware físico.



Descreva o que aconteceu mudou em relação a atividade anterior (Teclados - Atividade 1)



   

Teclados - Atividade 1



Identificando valores de conversão para cada tecla (divisor de tensão)


               Utilizando o programa “Tec_atv01.c” (listado no fim deste post) monte compile um projeto no MPLAB X IDE.




1. Elabore o hardware no simulador.

2. Preencha a tabela abaixo baseado nos dados obtidos do simulador.



3. Elabore o hardware físico.


4. Preencha a tabela abaixo baseado nos dados do obtidos no hardware físico.



5. Compare os valores obtidos no simulador e no hardware físico e explique por que as diferenças.

6. Explique o que deveria ser feito no programa para:

  • Baixar o menor valor
  • Elevar o maior valor

7. Se fossem executadas as mudanças do item 6, o que aconteceria com a faixa entre os valores? Por que? 


Entregue (mostre) escrita as questões 2, 4, 5, 6 e 7.


   


/*
 * File:   Tec_atv01.c
 * Author: Pilger
 *
 * Created on 16 de Setembro de 2017, 09:26
 * Teclado - Atividade 01
 * Entendimento inicial do circuito divisor de tensão no conversor A/D
 * 
 * Utiliza a entrada AN0 como sinal de entrada e converte um sinal entre 0 e 5V
 * Apresenta o resultdo convertido (0 a 1023) na linha 1 do LCD
 *
 */

#define _XTAL_FREQ 48000000

#include <stdio.h>
#include <xc.h>
#include "C:\h\Config_PIC18F4550.h"
#include "c:\h\biblioteca_lcd_2x162_48M_XC.h"

// protótipos de funções
void config_AD(void);
int conv_AD(void);
void delay_ms(int i);

void main(void) {
    // variáveis locais
    int valor_convertido;
    unsigned char buffer[16];
    float tensao;
    // define os pinos de IO
    TRISA = 0b00000001;
    TRISB = 0x00;
    TRISC = 0x00;
    TRISD = 0x00;
    TRISE = 0x00;
    config_AD(); // configura e inicializa o conversor AD
    lcd_inicia(0x28, 0x0f, 0x06); // incializa o LCD com 4 linhas
    lcd_LD_cursor(0); // Desliga o cursor
    lcd_posicao(1, 1);
    imprime_string_lcd("Teclado A/D");

    while (1) {
        valor_convertido = conv_AD();
        // mostra no lcd o valor convertido (0-1023)
        lcd_posicao(2, 1);
        sprintf(buffer, "Conversao= %04d ", valor_convertido);
        imprime_buffer_lcd(buffer, 16);
        delay_ms(1000); // atraso de 1s
    }
}


// função de configuração do conversor A/D
void config_AD (void) {
ADCON0 = 0b00000001; /* canal AN0 selecionado <5:2> 0000
                             * Flag GO - /DONE desligado <1> 0
                             * Módulo conversor ligado <0> 1 */
ADCON1 = 0b00001110; /*  Vref- = VSS <5> 0
                             *  Vref+ = VDD <4> 0
                             * pino RA0/AN0 analógico e demais digitais <3:0> 1110 */
ADCON2 = 0b10110110; /* Resultado justificado a direita <7> 1
                             * Tempo de Aquisição de 16 TDA <5:3> 110 
                             * mínimo recomendado p/ automático = 4TDA
                             * TDA = 1,33us <2:0> 110
                             * 48MHz/64 = 750kHz = 1,33us */
}

// função que efetua uma conversão A/D e retorna um inteiro com o valor convertido
int conv_AD (void) {
int result_AD; // Variável local para armazenar o resultado da conv
ADCON0bits.GO=1; // inicia a conversão
while (ADCON0bits.GO); // Aguarda a o fim da conversão
result_AD = (((int)ADRESH)<<8)|(ADRESL);
return result_AD;
}
// função que gera atraso em mlisegundos
void delay_ms(int i){
    for ( int x = 0; x < i; x++ )     { 
    __delay_ms(1); 
    }
}