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

Description:

0 Membros e 2 Visitantes 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 #225 Online: 15 de Julho de 2010, 15:21 »
.... a câmera com zoom abre um leque muito grande de opções.

He, he, he ... e la nave va ...

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #226 Online: 15 de Julho de 2010, 17:45 »
Senhores,

Fiz uma pequena parte do código para acionar  iluminação frontal e posterior. A idéia é que possa funcionar da seguinte maneira.
  • Aciono o botão pela primeira vez e ligo a iluminação frontal
  • aciono o botão novamente e desligo a iluminação frontal
  • aciono o botão novamente e ligo a iluminação trazeira
  • aciono o botão novamente e desligo a iluminação trazeira
  • aciono o botão novamente e ligo a iluminação frontal e trazeira
  • aciono o botão novamente e desligo toda a iluminação

Fiz uma parte e ficou assim: (está funcionando parcialmente. Ainda não consegui fazer a comutação das funçoes do botão funcionarem corretamente)

;
;
;
;
;Software para comando de Joystick e potenciometro
;ROV



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

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

   errorlevel -302      ; turn off bank bits warning

;
; Entradas
;
#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
#DEFINE      BOTAO   PORTA,4      ;Porta do botão
                        ;0 = pressionado
                        ;1 = liberado
      

;
; Saídas
;
#DEFINE      LED      PORTD,7      ;Porta do led 7
                        ; 0 = apagado
                        ; 1 = aceso
#DEFINE      LED2   PORTD,6      ;Porta do led 6
                        ; 0 = apagado
                        ; 1 = aceso
;
;   Variáveis
;   
   cblock H'20'
             ld_loop_ex
            ld_loop_in
         VALOR_AN0
         VALOR_AN1
         VALOR_AN2
         BT_atual
         BT_ultimo
         BT_estado
         BT_loop
         
    endc

;
; Constantes
;
BT_rst   equ      .200
;
; 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

;
; Inicializa variáveis
;
   clrf   BT_atual
   clrf   BT_estado
   movlw   BT_rst

;
; 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   b'01000000'             ; Setup Port C
    movwf   PORTC                  ; RC6(TX)=1 others are 0

    movlw   b'10000000'           ; habilita a UART
    movwf   RCSTA
;
; 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   iluminacao
   movf   LED
   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

;
;Verifica estado do botão de iluminação
;
iluminacao:
   movf   BT_atual,W         ;Coloca o valor do BT_atual em W
   movwf   BT_ultimo         ;coloca o valor de W em BT_ultimo
   btfsc   BT_estado,0         ;testa estado do botão e pula a próxima linha se for = 0
   bsf      LED               ;acende o LED = PORTD,7
   
BT_down:
   btfss   BOTAO            ;testa o estado do botão e pula a próxima linha se for = 1
   goto    BT_up
   bsf      BT_atual,0         ;
   movf   BT_loop,F
   btfss   STATUS,Z
   decf   BT_loop
   btfsc   STATUS,Z
   bsf      LED2
   return

BT_up:
   clrf   BT_atual
   btfss   BT_ultimo,0
   return
   bcf      LED2
   movf   BT_loop,F
   btfss   STATUS,Z
   call   ilumina
   movlw   BT_rst
   movwf   BT_loop
   return

ilumina:
   btfsc   BT_estado,0
   goto   ilumina2
   bsf      LED
   bsf      BT_estado,0
   return

ilumina2:
   bcf      LED
   clrf   BT_estado
   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 



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 #227 Online: 15 de Julho de 2010, 19:40 »
Anderson,

A profundidade tem a ver com o foco / zoom da câmera ou a profundidade do ROV?

Gil,

Não, essa profundidade é de locomoção do aparelho mesmo.

Explique melhor o comando de profundidade, seria um potenciômetro com escala em metros, mm ou cm? (Sei que são multiplos), mas como voce imagina que o ROV vai saber a que profundidade se encontra? E como manter a profundidade escolhida?
 
Alertando que, sendo um controle de profundidade, esta seria limitada pelo faixa atribuída (range) ao curso do potenciômetro e pela resolução deste. Por exemplo, uma faixa de 10 metros e uma resolução de 10/256 = 3,9 mm. A cada 27 graus de rotação o submarino se moveria 1 metro, é isso mesmo?? Além disso, para manter uma certa profundidade seria necessário uma malha de controle de profundidade (de pressão) e de um sensor de pressão com essa resolução (3,0 mm de água).

Não seria mais fácil simplesmente mover o ROV para cima e para baixo apenas, com mais um ou dois motores ou hidroplanos apenas, ao invés de um controle de profundidade.

Construi um modelo de submarino que possui controle de profundidade através de hidroplanos apenas e leme para a direção. É um modelo de submarino militar americano da II Guerra (uma das razões do meu interesse no assunto ;D). Ainda possui um sistema de lastro para emergir/submergir apenas.


Dei uma lida no software, o controle de profundidade é apenas o ciclo de trabalho do motor (controle PWM) de profundidade. Não é a profundidade apenas, mas a rotação do motor do eixo Z. Ok?

« Última modificação: 15 de Julho de 2010, 19:55 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 #228 Online: 15 de Julho de 2010, 20:08 »
Anderson,

Antes de escrever o programa, que tal definir algumas coisas??

Senhores,

Fiz uma pequena parte do código para acionar  iluminação frontal e posterior. A idéia é que possa funcionar da seguinte maneira.
  • Aciono o botão pela primeira vez e ligo a iluminação frontal
  • aciono o botão novamente e desligo a iluminação frontal
  • aciono o botão novamente e ligo a iluminação trazeira
  • aciono o botão novamente e desligo a iluminação trazeira
  • aciono o botão novamente e ligo a iluminação frontal e trazeira
  • aciono o botão novamente e desligo toda a iluminação

Ao invés de fazer essa ginástica toda para ligar e desligar as lâmpadas, dê uma olhada...

Sugestão: usar o mesmo tipo de acionamento para o motor de profundidade, o projeto usa 8 bits. Porque? 3 Bits não atenderiam (como nos outros motores), proposta, usando 2 bytes de comando apenas:

Byte 1:

Bits 0  1    2   3   4   5   6   7
     M1 M1 M1 M2 M2 M2 S1 S1     
 
Byte 2:

Bits 0  1    2   3  4   5  6   7
     M3 M3 M3 L1 L2 L3 Z+ Z-     

M1 - controle do motor 1 (estados RR,MR,LR,P,LF,MF,RF)
M2 - controle do motor 2 (estados RR,MR,LR,P,LF,MF,RF)
M3 - controle do motor 3 (estados RB,MB,LB,P,LC,MC,RC)
S1 - aciona servo 1

L1 - liga/desliga a iluminação frontal
L2 - liga/desliga a iluminação traseira
L3 - liga/desliga a iluminação ou alguma outra carga extra
Z+ - aproximar Zoom
Z- - afastar Zoom

Estados de cada motor DC (M1, M2):
RR = rápido à ré
MR = média velocidade à ré
LR = lento à ré
P - motor parado
LF = lento à frente
MF = média velocidade à frente
RF = rápido à frente

Estados do motor DC de produndidade (M3):
RB = rápido ao fundo
MB = média velocidade ao fundo
LB = lento ao fundo
P - motor parado
LC = lento para cima
MC = média velocidade para cima
RC = rápido para cima

Estados do servo motor (S1):
-90 Graus
0    Graus
+45  Graus
+90 Graus

Não coloquei a reposta do ROV (ainda), o que acha de fazer o ROV sair logo do papel, mais parecido com o projeto original? E apenas com comandos?
« Última modificação: 16 de Julho de 2010, 07:51 por minilathe »

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #229 Online: 15 de Julho de 2010, 22:57 »
Dei uma lida no software, o controle de profundidade é apenas o ciclo de trabalho do motor (controle PWM) de profundidade. Não é a profundidade apenas, mas a rotação do motor do eixo Z. Ok?

Gil,
Acho que talvez eu tenha me expressado mal. Não há um controle de profundidade, o rov se movimenta no eixo z sempre que o motor é acionado para cima ou para baixo. Através de um sensor de pressão são coletados dados para cálculo de profundidade, mas não são utilizados para contrôle de profundidade. O rov manten-se em flutuabilidade neutra mantendo-se parado em qualquer profundidade, necessitando apenas de pequenas correções que são conseguidas com pequenos acionamentos no motor.

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #230 Online: 15 de Julho de 2010, 23:05 »
Antes de escrever o programa, que tal definir algumas coisas??
Estão perfeitas suas colocações. É exatamente isso que será necessário.


Não coloquei a reposta do ROV (ainda), o que acha de fazer o ROV sair logo do papel, mais parecido com o projeto original? E apenas com comandos?
Eu não entendi ???  (E apenas com comandos )

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 #231 Online: 15 de Julho de 2010, 23:46 »
Anderson,

Não coloquei a reposta do ROV (ainda), o que acha de fazer o ROV sair logo do papel, mais parecido com o projeto original? E apenas com comandos?
Eu não entendi ???  (E apenas com comandos )

É só uma sugestão.... ;D

Não gosto de projetos não terminados, eu mesmo tenho alguns emperrados por aí, por falta de tempo e "excesso de centros de interesse"  ;D

Podemos fazer um sistema bidirecional, .... Quais sinais seriam enviados pelo ROV?
« Última modificação: 15 de Julho de 2010, 23:47 por minilathe »

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #232 Online: 16 de Julho de 2010, 00:05 »
Podemos fazer um sistema bidirecional, .... Quais sinais seriam enviados pelo ROV?

Sim o sistema bidirecional me parece ser melhor.

Sinais enviados ROV ==> Base
  • Pressão
  • Salinidade
  • compass
  • Salinidade
  • Umidade no interior do aparelho

Estas são básicas.

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re: Contrôle de motores com PIC16F628A
« Resposta #233 Online: 16 de Julho de 2010, 00:09 »
e os sensores para estas finalidades? já possui?

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #234 Online: 16 de Julho de 2010, 00:26 »
e os sensores para estas finalidades? já possui?
Ainda não, fisicamente. Se tiver alguma sugestão que possa baratear o projeto ?? Os sensores costumam ser caros !!!

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 #235 Online: 16 de Julho de 2010, 04:22 »
Anderson,

Podemos fazer um sistema bidirecional, .... Quais sinais seriam enviados pelo ROV?

Sim o sistema bidirecional me parece ser melhor.

Sinais enviados ROV ==> Base
  • Pressão
  • Salinidade
  • compass
  • Salinidade
  • Umidade no interior do aparelho

Estas são básicas.

Ok, seriam todas variáveis analógicas? Salinidade está repetida?

Pressão - analógica / 8 bits
Salinidade - analógica / 4 bits
Umidade no interior do aparelho - digital / 1 bit

Bússola (compass) com saída serial (TTL) - poderia ser desenvolvida uma interface depois (quando??):
http://en.zc-sensor.com/Detail_Product.php?id=96
[attachthumb=1]

Sugestão do quadro de resposta, 2 bytes como no comando, com o seguinte conteúdo:

Byte 1:

Bits              7    6    5    4    3    2    1   0
Informação:   |----------- P1 ------------|
 
Byte 2:

Bits              7    6   5   4    3   2    1   0
Informação:   |--  S1 ---|   U1  E1  E2  E3

P1 - sensor de pressão (sinal analógico de 8 bits)
S1 - sensor de salinidade (sinal analógico de 4 bits)
U1 - sensor de umidade
E1 - sensor digital 1 (extra)
E2 - sensor digital 2 (extra)
E3 - sensor digital 3 (extra)

Os sensores digitais extras podem ser: chaves de fim de curso, sensor de fundo, sonda de toque de 1 bit
Os bits S1, S2 e S3 também poderiam ser a saída da bússola com 8 níveis (000 a 111 binário): N - NW - W - SW - S - SO - O - NO
 
O sinal de salinidade seria de 4 bits ou 1 bit (água salgada / doce)? O valor de salinidade seria expresso em condutividade (concentração salina), em microsiemens x cm? Seria necessário um sensor específico, poderia ser um sensor sem contato com a água (magnético) do tipo toroidal. Daria até para fazer um sensor desses:

http://www.sensorex.com/support/education/conductivity_education.html
« Última modificação: 16 de Julho de 2010, 05:35 por minilathe »

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re: Contrôle de motores com PIC16F628A
« Resposta #236 Online: 16 de Julho de 2010, 10:28 »
Citar
Se tiver alguma sugestão que possa baratear o projeto ?? Os sensores costumam ser caros !!!
baratos não são ... mas eram bem mais dispendiosos ... se eu encontrar algo em conta lhe aviso.

abrax!
« Última modificação: 16 de Julho de 2010, 23:27 por Blackmore »

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #237 Online: 31 de Julho de 2010, 09:27 »
De volta aos trabalhos, depois de afastamento por conta de outros serviços. 

Estava analizando o projeto original e este não utiliza RS232 nem RS485, simplesmente faz a comunicação entre os dois módulos diretamente. Isso traz que tipo de inconvenientes ???

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re: Contrôle de motores com PIC16F628A
« Resposta #238 Online: 31 de Julho de 2010, 09:45 »
Isso traz que tipo de inconvenientes ???

A interface direta é mais susceptível às interferências.

Offline aguizan

  • Fuso
  • **
  • Posts: 158
  • Sexo: Masculino
  • GUIA-CNC
Re: Contrôle de motores com PIC16F628A
« Resposta #239 Online: 31 de Julho de 2010, 12:10 »
A interface direta é mais susceptível às interferências.

Se os dados a serem transmitidos fossem somente os sinais para a movimentação dos motores, a iluminação e um sinal para servo motor, você faria a transmissaõ pela interface direta ???

 

/** * */