Houve um debate em outro tópico que resultou em um software para o Arduino Mega2560 converter os sinais Step/Dir oriundos do Mach3, TurboCNC, EMC2, etc..., para phase drive.
Como resultado, podemos acionar um motor de passo através de um driver feito com transistores ou até mesmo um CI comercial como o L298 ou ULN2003.
ATENÇÃO: PROGRAMA NÃO FOI TESTADO.
Teoricamente, temos:
- Capacidade para três eixos;
- Frequencia máxima de 100kHz;
- Pulso em nível alto, com duração de no mínimo 3 uS;
Caso interesse a alguém, podemos discutir melhorias e possíveis falhas de funcionamento.
/* 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 STEP_WIDTH 4
#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 = PORTB = PORTA = 0xFF;
DDRC = 0;
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) * STEP_WIDTH)) | ((STEPS >> ((CH1_CURRENT_STEP % MAX_STEPS) * STEP_WIDTH)) & 0x0F);
PORTB = 0xF0 | (STEPS >> ((CH3_CURRENT_STEP % MAX_STEPS) * STEP_WIDTH));
while( (PINC & ((1 << PINC5) | (1 << PINC3) | (1 << PINC0))) );
}