Autor Tópico: Problemas com porta paralela e mach3  (Lida 17381 vezes)

Description:

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

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re:Problemas com porta paralela e mach3
« Resposta #30 Online: 28 de Dezembro de 2013, 15:00 »
KKKK Voce ta querendo complicar as coisas kkkk...

Voce liga a porta paralela direto no ULN2003 como no anexo que peguei no site rogercom , dai configura o turbo cnc para phase drive.

Acredito ser a melhor solução para o caso. Economiza o arduino e terá melhor desempenho.

Tome cuidado com a tensão e corrente da fonte.
« Última modificação: 28 de Dezembro de 2013, 15:12 por Cláudio Freund »

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re:Problemas com porta paralela e mach3
« Resposta #31 Online: 28 de Dezembro de 2013, 15:39 »
Faltou um exemplo:

Código: [Selecionar]
    while(1)
    {
    PORTB ^= (1 << PINB7);
    PORTB ^= (1 << PINB7);
    PORTB ^= (1 << PINB7);
    PORTB ^= (1 << PINB7);
    PORTB ^= (1 << PINB7);
    PORTB ^= (1 << PINB7);
    PORTB ^= (1 << PINB7);
    PORTB ^= (1 << PINB7);
    PORTB ^= (1 << PINB7);
    PORTB ^= (1 << PINB7);
    }

Compilando:

Código: [Selecionar]
        in r24, 0x05 ; 1 Clock
        subi r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        in r24, 0x05 ; 1 Clock
        subi r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        in r24, 0x05 ; 1 Clock
        subi r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        in r24, 0x05 ; 1 Clock
        subi r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        in r24, 0x05 ; 1 Clock
        subi r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        in r24, 0x05 ; 1 Clock
        subi r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        in r24, 0x05 ; 1 Clock
        subi r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        in r24, 0x05 ; 1 Clock
        subi r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        in r24, 0x05 ; 1 Clock
        subi r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        in r24, 0x05 ; 1 Clock
        subi r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        rjmp .-62      ; 2 Clocks

Resultado: 5 MHz

Manipulando:

Código: [Selecionar]
        in r24, 0x05 ; 1 Clock

        cbr r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        sbr r24, r25 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        cbr r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        sbr r24, r25 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        cbr r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        sbr r24, r25 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        cbr r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        sbr r24, r25 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        cbr r24, 0x80 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        sbr r24, r25 ; 1 Clock
        out 0x05, r24 ; 1 Clock
        rjmp .-42      ; 2 Clocks

Ou:

Código: [Selecionar]
        cbi 0x05, 7 ; 2 Clocks
        sbi 0x05, 7 ; 2 Clocks
        cbi 0x05, 7 ; 2 Clocks
        sbi 0x05, 7 ; 2 Clocks
        cbi 0x05, 7 ; 2 Clocks
        sbi 0x05, 7 ; 2 Clocks
        cbi 0x05, 7 ; 2 Clocks
        sbi 0x05, 7 ; 2 Clocks
        cbi 0x05, 7 ; 2 Clocks
        sbi 0x05, 7 ; 2 Clocks
        rjmp .-22      ; 2 Clocks

Resultado: 7 MHz
« Última modificação: 28 de Dezembro de 2013, 15:43 por Cláudio Freund »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • 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:Problemas com porta paralela e mach3
« Resposta #32 Online: 28 de Dezembro de 2013, 15:46 »
Ok, agora faça um Arduino gerar os sinais para o motor a partir dos sinais Step e Dir...

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re:Problemas com porta paralela e mach3
« Resposta #33 Online: 28 de Dezembro de 2013, 15:47 »
De novo? Está no primeiro post deste tópico.

Quer otimizado?

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • 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:Problemas com porta paralela e mach3
« Resposta #34 Online: 28 de Dezembro de 2013, 20:00 »
De novo? Está no primeiro post deste tópico.

Quer otimizado?

O que está no início do tópico já deu para perceber que não funciona...

Faça um que funciona, otimizado ou não, mas o motor não deve girar apenas a algumas dezenas ou centenas de RPM, o programa não deve perder pulsos gerados pelo Mach3 ou TurboCNC e não deve haver jitter no acionamento do motor em relação ao sinal gerado pelo Mach3 ou TurboCNC. Como você mesmo disse, com o "sinal para o motor balançando" a várias centenas de KHz.
« Última modificação: 28 de Dezembro de 2013, 20:03 por minilathe »

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • 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:Problemas com porta paralela e mach3
« Resposta #35 Online: 28 de Dezembro de 2013, 20:39 »
Cláudio,

Se quiser uma mãozinha, segue a rotina que o Arduino usa (em assembly) apenas para escrever 1 bit numa saída do Arduino (digitalWrite).

Código: [Selecionar]
void digitalWrite(uint8_t pin, uint8_t val)
{
 3be: ff 92        push r15
 3c0: 0f 93        push r16
 3c2: 1f 93        push r17
 3c4: f6 2e        mov r15, r22
uint8_t timer = digitalPinToTimer(pin);
 3c6: 48 2f        mov r20, r24
 3c8: 50 e0        ldi r21, 0x00 ; 0
 3ca: ca 01        movw r24, r20
 3cc: 82 54        subi r24, 0x42 ; 66
 3ce: 9e 4f        sbci r25, 0xFE ; 254
 3d0: fc 01        movw r30, r24
 3d2: 24 91        lpm r18, Z+
uint8_t bit = digitalPinToBitMask(pin);
 3d4: ca 01        movw r24, r20
 3d6: 88 58        subi r24, 0x88 ; 136
 3d8: 9e 4f        sbci r25, 0xFE ; 254
 3da: fc 01        movw r30, r24
 3dc: 14 91        lpm r17, Z+
uint8_t port = digitalPinToPort(pin);
 3de: 4e 5c        subi r20, 0xCE ; 206
 3e0: 5e 4f        sbci r21, 0xFE ; 254
 3e2: fa 01        movw r30, r20
 3e4: 04 91        lpm r16, Z+
volatile uint8_t *out;

if (port == NOT_A_PIN) return;
 3e6: 00 23        and r16, r16
 3e8: c1 f0        breq .+48      ; 0x41a <digitalWrite+0x5c>

// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
 3ea: 22 23        and r18, r18
 3ec: 11 f0        breq .+4      ; 0x3f2 <digitalWrite+0x34>
 3ee: 82 2f        mov r24, r18
 3f0: 72 df        rcall .-284    ; 0x2d6 <turnOffPWM>

out = portOutputRegister(port);
 3f2: e0 2f        mov r30, r16
 3f4: f0 e0        ldi r31, 0x00 ; 0
 3f6: ee 0f        add r30, r30
 3f8: ff 1f        adc r31, r31
 3fa: e2 50        subi r30, 0x02 ; 2
 3fc: ff 4f        sbci r31, 0xFF ; 255
 3fe: a5 91        lpm r26, Z+
 400: b4 91        lpm r27, Z+

uint8_t oldSREG = SREG;
 402: 9f b7        in r25, 0x3f ; 63
cli();
 404: f8 94        cli

if (val == LOW) {
 406: ff 20        and r15, r15
 408: 21 f4        brne .+8      ; 0x412 <digitalWrite+0x54>
*out &= ~bit;
 40a: 8c 91        ld r24, X
 40c: 10 95        com r17
 40e: 81 23        and r24, r17
 410: 02 c0        rjmp .+4      ; 0x416 <digitalWrite+0x58>
} else {
*out |= bit;
 412: 8c 91        ld r24, X
 414: 81 2b        or r24, r17
 416: 8c 93        st X, r24
}

SREG = oldSREG;
 418: 9f bf        out 0x3f, r25 ; 63
}
 41a: 1f 91        pop r17
 41c: 0f 91        pop r16
 41e: ff 90        pop r15
 420: 08 95        ret
« Última modificação: 28 de Dezembro de 2013, 21:16 por minilathe »

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re:Problemas com porta paralela e mach3
« Resposta #36 Online: 28 de Dezembro de 2013, 22:40 »
O que está no início do tópico já deu para perceber que não funciona...

Segundo o colega está funcionando sim, mas em outro software.

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re:Problemas com porta paralela e mach3
« Resposta #37 Online: 28 de Dezembro de 2013, 22:47 »
Fique a vontade para testar.

Step pulse width: 3 uS

PINB7 = STEP; Deverá ser configurado em modo invertido no mach3.
PINB6 = DIR;

PINB3~0 = OUT; Motores de passo

Código: [Selecionar]
#include <avr/io.h>

#define CURRENT_STEP GPIOR0

//const unsigned char steps[5] = { 0b10, 0b11, 0b01, 0b00, 0 }; // sequence of control signals for 2 control wires
const unsigned char steps[5] = { 0b0101, 0b0110, 0b1010, 0b1001, 0 }; // sequence of control signals for 4 control wires

int main(void)
{

PORTB = 0xFF;
DDRB  = (1 << PINB3) | (1 << PINB2) | (1 << PINB1) | (1 << PINB0);

    while(1)
    {
while( PINB & (1 << PINB7) );

if( PINB & (1 << PINB6) )
{
if(CURRENT_STEP) --CURRENT_STEP; else CURRENT_STEP = 3;
}
else
{
if(CURRENT_STEP < 3) ++CURRENT_STEP; else CURRENT_STEP = 0;
}

PORTB = 0xF0 | steps[CURRENT_STEP];

while( (PINB & (1 << PINB7)) == 0 );
    }
}

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re:Problemas com porta paralela e mach3
« Resposta #38 Online: 28 de Dezembro de 2013, 22:49 »
.lss:

Código: [Selecionar]
00000096 <main>:
  96: 8f ef        ldi r24, 0xFF ; 255
  98: 85 b9        out 0x05, r24 ; 5
  9a: 8f e0        ldi r24, 0x0F ; 15
  9c: 84 b9        out 0x04, r24 ; 4

while(1):
  9e: 93 e0        ldi r25, 0x03 ; 1 Clock
  a0: 1f 99        sbic 0x03, 7 ; 2 Clocks
  a2: fe cf        rjmp .-4      ; 2 Clocks
  a4: 1e 9b        sbis 0x03, 6 ; 2 Clocks
  a6: 08 c0        rjmp .+16      ; 2 Clocks
  a8: 8e b3        in r24, 0x1e ; 1 Clock
  aa: 88 23        and r24, r24 ; 1 Clock
  ac: 19 f0        breq .+6      ; 2 Clocks
  ae: 8e b3        in r24, 0x1e ; 1 Clock
  b0: 81 50        subi r24, 0x01 ; 1 Clock
  b2: 07 c0        rjmp .+14      ; 2 Clocks
  b4: 9e bb        out 0x1e, r25 ; 1 Clock
  b6: 08 c0        rjmp .+16      ; 2 Clocks
  b8: 8e b3        in r24, 0x1e ; 1 Clocks
  ba: 83 30        cpi r24, 0x03 ; 1 Clocks
  bc: 20 f4        brcc .+8      ; 2 Clocks
  be: 8e b3        in r24, 0x1e ; 1 Clock
  c0: 8f 5f        subi r24, 0xFF ; 1 Clock
  c2: 8e bb        out 0x1e, r24 ; 1 Clock
  c4: 01 c0        rjmp .+2      ; 2 Clocks
  c6: 1e ba        out 0x1e, r1 ; 1 Clock
  c8: ee b3        in r30, 0x1e ; 1 Clock
  ca: f0 e0        ldi r31, 0x00 ; 1 Clock
  cc: e0 50        subi r30, 0x00 ; 1 Clock
  ce: ff 4f        sbci r31, 0xFF ; 1 Clock
  d0: 80 81        ld r24, Z ; 2 Clocks
  d2: 80 6f        ori r24, 0xF0 ; 1 Clock
  d4: 85 b9        out 0x05, r24 ; 1 Clock
  d6: 1f 9b        sbis 0x03, 7 ; 2 Clocks
  d8: fe cf        rjmp .-4      ; 2 Clocks
  da: e2 cf        rjmp .-60      ; 2 Clocks

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderador
  • 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:Problemas com porta paralela e mach3
« Resposta #39 Online: 28 de Dezembro de 2013, 23:42 »
Fique a vontade para testar.

Step pulse width: 3 uS

PINB7 = STEP; Deverá ser configurado em modo invertido no mach3.
PINB6 = DIR;

PINB3~0 = OUT; Motores de passo

Código: [Selecionar]
#include <avr/io.h>

#define CURRENT_STEP GPIOR0

//const unsigned char steps[5] = { 0b10, 0b11, 0b01, 0b00, 0 }; // sequence of control signals for 2 control wires
const unsigned char steps[5] = { 0b0101, 0b0110, 0b1010, 0b1001, 0 }; // sequence of control signals for 4 control wires

int main(void)
{

PORTB = 0xFF;
DDRB  = (1 << PINB3) | (1 << PINB2) | (1 << PINB1) | (1 << PINB0);

    while(1)
    {
while( PINB & (1 << PINB7) );

if( PINB & (1 << PINB6) )
{
if(CURRENT_STEP) --CURRENT_STEP; else CURRENT_STEP = 3;
}
else
{
if(CURRENT_STEP < 3) ++CURRENT_STEP; else CURRENT_STEP = 0;
}

PORTB = 0xF0 | steps[CURRENT_STEP];

while( (PINB & (1 << PINB7)) == 0 );
    }
}

Mas eu quero testar no Arduino e não num PC...

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re:Problemas com porta paralela e mach3
« Resposta #40 Online: 29 de Dezembro de 2013, 05:42 »
Como assim PC?

"#include<avr/io.h>" não deu uma pista?

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re:Problemas com porta paralela e mach3
« Resposta #41 Online: 29 de Dezembro de 2013, 07:10 »
Gil,

Mach3 vai até 100 kHz correto?

Acionando 3 eixos, 150 kHz e largura mínima do pulso de 3 uS; Borda de subida;

Código para o Arduino Mega2560.

Código: [Selecionar]
/* Pinout
*
* PC0 (p37) = CH1.STEP
* PC1 (p36) = CH1.DIR
* PC2 (p35) = CH2.STEP
* PC3 (p34) = CH2.DIR
* PC4 (p33) = CH3.STEP
* PC5 (p32) = CH3.DIR
*
* PA0 (p22) = SM1.C0
* PA1 (p23) = SM1.C1
* PA2 (p24) = SM1.C2
* PA3 (p25) = SM1.C3
*
* PA4 (p26) = SM2.C0
* PA5 (p27) = SM2.C1
* PA6 (p28) = SM2.C2
* PA7 (p29) = SM2.C3
*
* PB0 (p53) = SM3.C0
* PB1 (p52) = SM3.C1
* PB2 (p51) = SM3.C2
* PB3 (p50) = SM3.C3
*
*/

//#define STEPS 0b00011110
#define STEPS 0b1001101001100101
#define MAX_STEPS 4

#define CH1_CURRENT_STEP GPIOR0
#define CH2_CURRENT_STEP GPIOR1
#define CH3_CURRENT_STEP GPIOR2

void setup(){
    PORTC = 0xFF;
    PORTB = 0xFF;
    PORTA = 0xFF;
    DDRB  = (1 << PINB3) | (1 << PINB2) | (1 << PINB1) | (1 << PINB0);
    DDRA  = (1 << PINA7) | (1 << PINA6) | (1 << PINA5) | (1 << PINA4) | (1 << PINA3) | (1 << PINA2) | (1 << PINA1) | (1 << PINA0);
}

void loop(){
    while( (PINC & ((1 << PINC4) | (1 << PINC2) | (1 << PINC0))) == 0);

    if(PINC & (1 << PINC0)){
if(PINC & (1 << PINC1)) ++CH1_CURRENT_STEP; else --CH1_CURRENT_STEP;
    }

    if(PINC & (1 << PINC2)){
if(PINC & (1 << PINC3)) ++CH2_CURRENT_STEP; else --CH2_CURRENT_STEP;
    }

    if(PINC & (1 << PINC4)){
if(PINC & (1 << PINC5)) ++CH3_CURRENT_STEP; else --CH3_CURRENT_STEP;
    }

    PORTA = (STEPS >> ((CH2_CURRENT_STEP % MAX_STEPS) * MAX_STEPS)) | (STEPS >> ((CH1_CURRENT_STEP % MAX_STEPS) * MAX_STEPS));
    PORTB = 0xF0 | (STEPS >> ((CH3_CURRENT_STEP % MAX_STEPS) * MAX_STEPS));

    while( (PINC & ((1 << PINC5) | (1 << PINC3) | (1 << PINC0))) );
}

Offline sijoga

  • Novato
  • *
  • Posts: 13
  • Sexo: Masculino
  • GUIA CNC
  • Cidade - UF: Mirassol-SP
  • Nome:: Joao
  • Profissão: Desenhista
Re:Problemas com porta paralela e mach3
« Resposta #42 Online: 29 de Dezembro de 2013, 07:20 »
Bom dia pessoal, obrigado pela força, consegui fazer funcionar a mesa com o phase drive e o turbo cnc, com os unl 2003 ligados direto na porta paralela, como meu objetivo era fazer essa mesa andar, entao ta tudo certo, agora sei que o arduino tb não é recomendado para fazer esse tipo de trabalho e vou partir para algo maior.
Pode trancar o topico, pois o problema foi resolvido.
Agradeço a todos pela ajuda!

Offline C N C N o w !

  • CNCMASTER
  • ******
  • Posts: 6300
  • Sexo: Masculino
Re:Problemas com porta paralela e mach3
« Resposta #43 Online: 29 de Dezembro de 2013, 07:28 »
Enquanto redigia o textículo abaixo chegou a msg do João comunicando a adoção de oura solução, de qualquer modo acho que o comentário ainda pode ser de alguma utilidade, então aí vai:

Interessante discussão, será ainda mais se mantivermos os egos murchos e preservarmos o contexto ...  ;D

Cláudio, o que o Gil fala está absolutamente correto, até pq ele, diferentemente de vc, se mantém no contexto, fala de Arduino, que vc já declarou não conhecer, consequentemente o que vc fala pode estar correto em outro contexto, não neste. Para o benefício de todos sugiro que procure familiarizar-se com o Arduino e então coloque suas sugestões.

João, desconheço suas prioridades, não está claro para mim se quer explorar o potencial do Arduino ou se o que quer no final das contas é uma máquina que funcione adequadamente ... de qualquer modo seu arranjo atual está bastante inadequado e se quiser, apesar de todos os conselhos em contrário, usar o Arduino na interface com o Mach3 ou o TurboCNC, terá que fazer algumas modificações, começando por tratar os sinais de passo e direção via interrupções, enfaizo que esta é a única maneira prática de abordar o prob, a menos que se conforme com uma carroça soluçante  ;D

Sugiro que trate de testar seu sketch manualmente a princípio, garantindo que funciona como esperado, antes de tentar comandar os motores via TurboCNC, que sugiro que use inicialmente para descobrir os limites para o desempenho. Imagino que este limite será determinado pelo hardware, muito pobre e ainda não pelas idiossincrasias arduinianas ...

Offline Cláudio F.

  • Fuso
  • **
  • Posts: 222
  • Sexo: Masculino
  • Cidade - UF: São Paulo/SP
Re:Problemas com porta paralela e mach3
« Resposta #44 Online: 29 de Dezembro de 2013, 07:41 »
Sim Jorge!

O Gil está correto em partes.

Discordo apenas quando ele afirma que o problema de velocidade está na linguagem C.

Jorge, você deve prestar mais atenção ao que lê. Disse nunca ter utilizado a IDE Arduino.

Um observação: No caso, interrupção iria atrasar o programa.

 

/** * */