Autor Tópico: Contrôle de motores com PIC16F628A  (Lida 64141 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contrôle de motores com PIC16F628A
« Resposta #150 Online: 12 de Julho de 2010, 17:26 »
[info]bit 5-3 CHS2:CHS0: Analog Channel Select bits

000 = Channel 0 (AN0)   
001 = Channel 1 (AN1)   
010 = Channel 2 (AN2)   
011 = Channel 3 (AN3)   
100 = Channel 4 (AN4)   
101 = Channel 5 (AN5)   
110 = Channel 6 (AN6)   
111 = Channel 7 (AN7)    [/info]




Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #151 Online: 12 de Julho de 2010, 18:05 »
[info]bit 5-3 CHS2:CHS0: Analog Channel Select bits

000 = Channel 0 (AN0)   
001 = Channel 1 (AN1)   
010 = Channel 2 (AN2)   
011 = Channel 3 (AN3)   
100 = Channel 4 (AN4)   
101 = Channel 5 (AN5)   
110 = Channel 6 (AN6)   
111 = Channel 7 (AN7)    [/info]

Então eu posso fazer um laço para selecionar um por vez todos os caniais que vou utilizar e a cada passada eu já faço a conversão AD e vou mascarando de três em três bits até completar meu Byte para transmissão. Pode ser assim, não é?

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contrôle de motores com PIC16F628A
« Resposta #152 Online: 12 de Julho de 2010, 18:15 »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Contrôle de motores com PIC16F628A
« Resposta #153 Online: 12 de Julho de 2010, 20:04 »
Anderson,

[info]bit 5-3 CHS2:CHS0: Analog Channel Select bits

000 = Channel 0 (AN0)   
001 = Channel 1 (AN1)   
010 = Channel 2 (AN2)   
011 = Channel 3 (AN3)   
100 = Channel 4 (AN4)   
101 = Channel 5 (AN5)   
110 = Channel 6 (AN6)   
111 = Channel 7 (AN7)    [/info]

Então eu posso fazer um laço para selecionar um por vez todos os caniais que vou utilizar e a cada passada eu já faço a conversão AD e vou mascarando de três em três bits até completar meu Byte para transmissão. Pode ser assim, não é?

Primeiramente, deve-se dividir o problema à "La Jack" (por partes)...

Eu faria desse jeito:

(1) Ler todas as entradas (analógicas e digitais)
(2) Enviar todos os sinais via porta serial

Isso garante que o tempo entre leituras será mínimo e o estado do sistema (joystick, chaves, ...) será amostrado de maneira completa a cada varredura.

O conversor A/D do PIC16F877A possui um tipo de "chave" interna (multiplexador) que a cada comando de leitura (instrução de escrita nos bits CHS0..CHS2 de ADDCON0), seleciona qual entrada do multiplexador (ou pino do microcontrolador) será amostrada e posteriormente convertida para o formato digital. Como a figura a seguir:

[attachthumb=1]

O sinal de saída do poteciômetro é conectado ao conversor A/D, de preferência, usando a mesma base de tensão de referência, mínima e máxima, para minimizar os erros. Normalmente se usa o +5 e 0V (GND), mas sendo talvez excessivamente purista, pode existir uma pequena discrepância entre o +5V do potenciômetro e o +Vref do conversor A/D. Sendo 5/256 = 19mV ou 5/1024 = 4,9mV, que seria a tolerância de erro do sistema. Como serão usadas apenas 7 faixas para cada potenciômetro e 256 níveis no conversor A/D, essa diferença seria desprezível e sem importância se a montagem possuir adequados filtros e desacoplamentos. Bem como ter cuidado em usar pontos comuns de aterramento (0V) e de alimentação (+5V) dos potenciômetros e do conversor A/D.

Mas por enquanto vamos pular essa parte.
« Última modificação: 12 de Julho de 2010, 20:12 por minilathe »

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contrôle de motores com PIC16F628A
« Resposta #154 Online: 13 de Julho de 2010, 07:47 »

Vale a pena uma espiada:

[info]Using the Analog to Digital Converter

http://ww1.microchip.com/downloads/en/AppNotes/00546e.pdf[/info]

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Contrôle de motores com PIC16F628A
« Resposta #155 Online: 13 de Julho de 2010, 08:29 »
O que o Jorge mandou vale a pena ler, sobre a tensão de referência, principalmente:

[attachthumb=1]

Melhorei o programa e a simulação, agora lê e envia tres entradas analógicas. O terminnal mostra o envio sequenciado de AN0 (0% = 0), AN1 (50%=7F) e AN2 (100%=FF).

[attachthumb=2]

Programa assembly:


    list P=16F877A
   #include "P16F877A.INC"

   __CONFIG _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_ON
   ;__CONFIG 0x3F32

   errorlevel -302      ; turn off bank bits warning

;
; Seleção de entradas do MUX (ADDCON0)
;
#DEFINE  EAN_0 B'01000001'   ; f/8, AN0, DONE, A/D On
#DEFINE  EAN_1 B'01001001'   ; f/8, AN1, DONE, A/D On
#DEFINE  EAN_2 B'01010001'   ; f/8, AN2, DONE, A/D On
;
;   Variáveis da RAM internas
;   
   cblock H'20'
       ld_loop_ex
      ld_loop_in
    endc
;
; Inicio do Programa
;
   ORG   0h         

; Inicializaçao do PIC, do display e da porta serial
   bcf      STATUS,RP1

   bsf      STATUS,RP0 ; Habilita banco 1
   
   clrf   TRISD          ; porta do display, de saída
   
   movlw    B'00000010'    ; setup do conversor A/D
   movwf    ADCON1         ; left justify result
                     ; port A: only analogue inputs
;
; Ajusta parametros da UART (usando cristal externo de 4MHz)
; Baud Rate = 9600 bps, No Parity, 1 Stop Bit
;
    movlw    0x19             ; 0x19=9600 bps / 0x0C=19200 bps
    movwf    SPBRG
       
    movlw    b'00100100'     ; TX_Enable, assync. mode, brgh = high (2)
    movwf    TXSTA           ; enable Async Transmission, BRGH=1
   
    movlw    b'10111111'     ; RC6 saida, outros bits da PORTC sao de entrada
    movwf    TRISC

   bcf      STATUS,RP0       ; Habilita banco 0

   clrf   PORTD          ; zera saídas do display
   
;   movlw    EAN_0          ; seleciona entrada analógica
;   movwf    ADCON0          

    movlw    b'01000000'    ; Setup Port C
    movwf    PORTC         ; RC6(TX)=1 others are 0

    movlw    b'10000000'     ; habilita a UART
    movwf    RCSTA
;
; Loop principal
;
start:
   movlw    EAN_0          ; entrada analógica 0
   call   read_ad
   call   display
   call   send
   call   delay1s

   movlw    EAN_1          ; entrada analógica 1
   call   read_ad
   call   display
   call   send
   call   delay1s

   movlw    EAN_2          ; entrada analógica 2
   call   read_ad
   call   display
   call   send
   call   delay1s

   goto   start
;
; Conversor A/D, palavra ADDCON0 em W
;
read_ad:
   movwf   ADCON0
   bsf      ADCON0,GO ; Iniciar conversao
wait:
   btfsc    ADCON0,GO ; Testa se terminou conversao
   goto   wait
   movf   ADRESH,W
   return
;
; Display de LEDs
;
display:
   movwf   PORTD
   return
;
; Envia byte (contido em W) pela UART e espera terminar
;
send:
    movwf    TXREG           ; send data in W
TransWt:
    bsf    STATUS,RP0      ; banco 1
WtHere:
     btfss    TXSTA,TRMT      ; Transmissao terminou se TRUE
    goto    WtHere         ; Senao, espera
    bcf    STATUS,RP0      ; banco 0
    return
;
;-----------------------------------------------------------------------------
;
;   Delay for about 1s
;
delay1s:
    movlw   D'250'
   call   waitx400
    movlw   D'250'
   call   waitx400
    movlw   D'250'
   goto   waitx400

;
;-----------------------------------------------------------------------------
;
;   Delay for about 250 ms
;
delay250ms:
    movlw   D'250'
   goto   waitx400
;
;-----------------------------------------------------------------------------
;
;   Delay for about 400x cycles
;
;    Se w=1, temporiza 1ms @ fck = 4MHz
;
waitx400:
    movwf   ld_loop_ex
ld_loopex:
   movlw   (400-4)/4
   movwf   ld_loop_in
ld_loopin:
    decf    ld_loop_in,F
    skpz
    goto    ld_loopin
   decf    ld_loop_ex,F
    skpz
    goto    ld_loopex
   return

END

 
« Última modificação: 13 de Julho de 2010, 08:38 por minilathe »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Contrôle de motores com PIC16F628A
« Resposta #156 Online: 13 de Julho de 2010, 08:42 »
O programa não está na forma ideal, pois le e envia cada entrada em sequência, o ideal seria ler as tres entradas e depois enviá-las em sequência.

Assim:


;
; Loop principal
;
start:
                     ; Ler entradas
   movlw    EAN_0          ; entrada analógica 0
   call   read_ad
   movwf   VALOR_AN0
   movlw    EAN_1          ; entrada analógica 1
   call   read_ad
   movwf   VALOR_AN1
   movlw    EAN_2          ; entrada analógica 2
   call   read_ad
   movwf   VALOR_AN2
                     ; Envia pela serial
   movfw   VALOR_AN0
   call   send
   movfw   VALOR_AN1
   call   send
   movfw   VALOR_AN2
   call   send

   call   delay1s

   goto   start
« Última modificação: 13 de Julho de 2010, 08:48 por minilathe »

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #157 Online: 13 de Julho de 2010, 09:52 »

Vale a pena uma espiada:

Sim, posso usar no lugar do monitoramento da minha tensão, em substituição ao MC34164, não é mesmo ? Ainda não deu tempo de ler tudo, mas depois vou esmiuçar esse material. Grato

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Contrôle de motores com PIC16F628A
« Resposta #158 Online: 13 de Julho de 2010, 10:17 »

Vale a pena uma espiada:

Sim, posso usar no lugar do monitoramento da minha tensão, em substituição ao MC34164, não é mesmo ? Ainda não deu tempo de ler tudo, mas depois vou esmiuçar esse material. Grato

É possível medir a tensão da bateria através de uma entrada, mas atente que é necessária uma tensão de referência, pois o conversor A/D usa +Vref (por exemplo +5V) e -Vref (0) para determinar o valor digital convertido.

Se alimentar tudo com bateria e a tensão +Vcc, supostamente de 5V, variar, então "babau"....

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #159 Online: 13 de Julho de 2010, 10:31 »

Melhorei o programa e a simulação, agora lê e envia tres entradas analógicas. O terminnal mostra o envio sequenciado de AN0 (0% = 0), AN1 (50%=7F) e AN2 (100%=FF).

Muito bom Gil, aos poucos vou acumulando material para aperfeiçoar o projeto. Eu carreguei o software e montei o circuito igual ao seu mas o resultado da simulação não ficou igual. Tem alguma configuração necessária no ISIS que eu não esteja cumprindo ?



Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #160 Online: 13 de Julho de 2010, 10:36 »
Se alimentar tudo com bateria e a tensão +Vcc, supostamente de 5V, variar, então "babau"....

E para usar a tensão de ref. faço essa leitura através dos pinos 4 (RA2/AN2/VREF-) e 5 (RA3/AN3/VREF+) do pic

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #161 Online: 13 de Julho de 2010, 11:33 »

Melhorei o programa e a simulação, agora lê e envia tres entradas analógicas. O terminnal mostra o envio sequenciado de AN0 (0% = 0), AN1 (50%=7F) e AN2 (100%=FF).

Muito bom Gil, aos poucos vou acumulando material para aperfeiçoar o projeto. Eu carreguei o software e montei o circuito igual ao seu mas o resultado da simulação não ficou igual. Tem alguma configuração necessária no ISIS que eu não esteja cumprindo ?




Já achei o erro, o dispositivo estava com o clock errado

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Contrôle de motores com PIC16F628A
« Resposta #162 Online: 13 de Julho de 2010, 12:34 »
Anderson,

Se alimentar tudo com bateria e a tensão +Vcc, supostamente de 5V, variar, então "babau"....

E para usar a tensão de ref. faço essa leitura através dos pinos 4 (RA2/AN2/VREF-) e 5 (RA3/AN3/VREF+) do pic

Na verdade a tensão +Vref não é medida (pois é uma referência), apenas entra por este pino para uso do conversor A/D. Dê uma lida nos materiais sobre o assunto (leia o data sheet, o que o Jorge enviou, existema vários Application Notes da Microchip) e procure entender como funciona o conversor A/D.

Se o módulo de comando for a bateria, seria interessante usar um regulador de tensão de referência só para o A/D e os potenciômetros, para que usem a mesma referência de tensão. Minimizando os erros e ruído. Se ligar tudo (pots e +Vref do A/D) no +5V geral do circuito também "funciona", mas não é o ideal. Já vi projetos com conversor A/D com leituras ruidosas e onde esses aspectos são ignorados.

Como seria a ligação da fonte de referência externa:

[attachthumb=1]

A tensão -Vref pode ser o terra do PIC, mas a montagem deve bem feita, com amplas área de cobre e ligações curtas para minimizar o ruído e as eventuais diferenças de tensão entre o conversor A/D e os potenciômetros.
 
« Última modificação: 13 de Julho de 2010, 12:41 por minilathe »

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re: Contrôle de motores com PIC16F628A
« Resposta #163 Online: 13 de Julho de 2010, 14:22 »
minilathe

mestre ... me esclareça uma dúvida.
Quando se possui um equipamento que é alimentado por baterias, mas é necessário o monitoramento da tensão das baterias para que estas não sejam sugadas até o ponto de não ser recuperadas, vc acredita que é necessário ou que seja disperdício colocar uma bateria (tipo botão) apenas para referência de tensão? ou mesmo no caso de utilzar algum circuito que possuam aqueles DS1307 (RTC) e utilizar da bateria dele como referência de tensão para o microcontrolador ... isso é uma prática aceitável ou um disperdício?

abrax!

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re: Contrôle de motores com PIC16F628A
« Resposta #164 Online: 13 de Julho de 2010, 15:00 »
Blackmore,

Quando se possui um equipamento que é alimentado por baterias, mas é necessário o monitoramento da tensão das baterias para que estas não sejam sugadas até o ponto de não ser recuperadas, vc acredita que é necessário ou que seja disperdício colocar uma bateria (tipo botão) apenas para referência de tensão? ou mesmo no caso de utilzar algum circuito que possuam aqueles DS1307 (RTC) e utilizar da bateria dele como referência de tensão para o microcontrolador ... isso é uma prática aceitável ou um disperdício?

Isto depende muito dos requisitos da aplicação.

Sendo um sistema autônomo (a bateria) em que isso é necessário, ok. Geralmente essas baterias botão suprem apenas funções vitais mínimas, tais como módulos de memória voláteis ou relógios de tempo real (a hora / data do sistema). Ou então a carga necessária para salvar tudo em memória e manter a CPU em hibernação.

Geralmente, quando a bateria está "caindo", todas as informações são salvas em memória para que o sistema seja restabelecido de onde parou. Mas depende para que serve o sistema (controle de processo, equipamentos de comunicações, automação industrial, equipamento médico-hospitalar, sistemas de sinalização urbana, aplicações militares, ...).

Hoje também existem capacitores eletrolíticos especiais, de baixas perdas e alta capacitância, que funcionam como se fossem baterias de curta duração, o necessário para as funções de emergência (parada suave do sistema e sinalização durante a falha).

 

/** * */