Projeto Mecatrônico
/
Referenciamento
Referenciamento do eixo Z
Diff: Referenciamneto.cpp
- Revision:
- 3:8f569cc10b95
- Parent:
- 2:3eb5c816d496
--- a/Referenciamneto.cpp Fri May 21 01:03:03 2021 +0000 +++ b/Referenciamneto.cpp Fri May 21 02:01:30 2021 +0000 @@ -2,6 +2,8 @@ #include "TextLCD.h" TextLCD lcd(D8, D9, D4, D5, D6, D7); //Comunicação com LCD +BusOut motor_z(PB_1, PB_15, PB_14, PB_13); //Pinos para acionamento do motor + Serial pc (D1, D0); //Comunicação com USB AnalogIn eixo_Z(PC_2); //Joystick eixo Z AnalogIn botao_SELECT(A0); //Botão SELECT da IHM @@ -10,35 +12,33 @@ InterruptIn botao_fim_curso(PC_12); //Chave de fim de curso DigitalIn botao_indicador_fonte_externa(PC_10); //Indica se os componentes dependentes da fonte externa estão energizados -BusOut motor_z(PB_1, PB_15, PB_14, PB_13); //Pinos para acionamento do motor -Timer debounce1; -Timer debounce2; -Timer debounce3; -Timer debounce4; +Timer debounce1; //Correção para botão de posição de salva +Timer debounce2; //Correção para botão de emergência +Timer debounce3; //Correção para chave de fim de curso -float tempo_horario, tempo_anti_horario; //Segundos -int pulsos_horario, pulsos_anti_horario; -int i; -int J_Z; -float deslocamento_horario_Z = 0; -float deslocamento_anti_horario_Z = 0; -float deslocamento_Z = 0; -float deslocamento_max_Z = 0; +int pulsos_horario, pulsos_anti_horario; //Contagem dos pulsos para o motor +int i; //Variável para contar o incremento no motor +int J_Z; //Variável para ler o potenciometro do Joystick +int passo_fuso = 5; //Declara o passo do fuso +int pegaZ; //Variável que receberá o valor da posição de salva +int fonte_externa; //Variável para poder ler a existência da alimentação externa +int SELECT; //Variável para leitura do botão SELECT da IHM +int contador_SELECT = 0; //Define o contator do botão SELECT +int contador_emergencia = 0; //Define o contator do botão de emergência -float passo_motor = 22.5;//5.625/32; -int passo_fuso = 5; -int pegaZ; -int posicao_salva_estado; -int fonte_externa; -int SELECT; -int contador_SELECT = 0; -int contador_emergencia = 0; -bool valor_SELECT = false; -bool estado_referenciamento = false; -bool estado_botao_emergencia_in = false; -bool motor_referenciamento = false; +float tempo_horario, tempo_anti_horario; //Define os tempos de acionamento do motor +float deslocamento_horario_Z = 0; //Define o deslocamento linear realizado quando o motor gira no sentido horário (negativo) +float deslocamento_anti_horario_Z = 0; //Define o deslocamento linear realizado quando o motor gira no sentido anti-horário (positivo) +float deslocamento_Z = 0; //Define o deslocamento linear total +float deslocamento_max_Z = 0; //Define o deslocamento linear máximo permitido +float passo_motor = 5.625/32; //Declara o passo angular do motor +bool valor_SELECT = false; //Boleana para lógica do botão SELECT +bool estado_referenciamento = false; //Boleana para identificar a necessidade do referênciamento +bool estado_botao_emergencia_in = false; //Boleana para identificar a necessidade do referênciamentosatisfazer a lógica da rotina_emergencia_in +bool motor_referenciamento = false; //Boleana para permitir o movimento automático do motot no referenciamento +// Rotinas do programa void rotina_posicao_salva(void); void rotina_emergencia_in(void); void rotina_velocidade_eixo_Z(void); @@ -46,17 +46,19 @@ void rotina_JOG_Z (void); void rotina_botoes_IHM (void); void rotina_referenciamento (void); -void rotina_aciona_motor (void); int main() { + pc.baud(115200); //Define a velocidade da porta USB + motor_z = 0x00; //Estabelece a condição inicial do motor - pc.baud(115200); - motor_z = 0x00; + //Declara os pinos de interrupção com suas funções posicao_salva.rise(&rotina_posicao_salva); botao_emergencia_in.rise(&rotina_emergencia_in); botao_fim_curso.rise(&rotina_referenciamento); + + //Inicia o LCD wait_ms(500); lcd.locate(2,0); lcd.printf("SELECT para"); @@ -65,42 +67,44 @@ while(1) { + //Leitura de variáveis J_Z = eixo_Z.read_u16(); fonte_externa = botao_indicador_fonte_externa.read(); SELECT = botao_SELECT.read_u16(); -// pc.printf("PosicaoZ=%4f,Posicao_Salva=%d\r\n", deslocamento_Z, pegaZ); -// pc.printf("Z=%4d, PegaZ=%4d, Posicao_salva_estado=%d, Botao_emergencia_estado=%d, Tempo1=%4f, Tempo2=%4f, Pulsos=%d, Deslocamento_Z=%f, Velocidade_Z=%f\r\n", J_Z, pegaZ, posicao_salva_estado, botao_emergencia_estado, tempo_horario, tempo_anti_horario, pulsos_anti_horario, deslocamento_Z, velocidade_Z); - pc.printf("estado_referenciamento=%d, estado_botao_emergencia_in=%d, contador_emergencia=%d\r\n", estado_referenciamento, estado_botao_emergencia_in, contador_emergencia); - if(fonte_externa == 0 & estado_referenciamento == true & estado_botao_emergencia_in == true) { + if(fonte_externa == 0 & estado_referenciamento == true & estado_botao_emergencia_in == true) { //Condição para poder disponibilizar a função JOG + //LCD lcd.locate(2,0); lcd.printf("PosicaoZ:"); lcd.locate(0,1); lcd.printf("%4fmm",deslocamento_Z); -// pc.printf("Fonte=%d\r\n", fonte_externa); + + //Chama a rotina do JOG rotina_JOG_Z(); } else { + + //Chama a rotina dos botões da IHM rotina_botoes_IHM(); + if(valor_SELECT == 1) { contador_SELECT = 1; + lcd.cls(); lcd.locate(2,0); lcd.printf("Iniciando"); lcd.locate(0,1); lcd.printf("referenciamento"); - while(motor_referenciamento == false){ - for(i = 0; i < 4; i++) { - motor_z = 1 << i; - //rotina_velocidade_eixo_Z(); - //rotina_deslocamento_eixo_Z(); - wait(0.003); - //pulsos_horario+=1; + + //Permite o movimento automático do motor até atingir o fim de curso + while(motor_referenciamento == false) { + for(i = 0; i < 4; i++) { + motor_z = 1 << i; + wait(0.003); } } - pc.printf("estado_referenciamento=%d\r\n", estado_referenciamento); } } } @@ -110,23 +114,28 @@ void rotina_posicao_salva() { debounce1.start(); - if(debounce1.read_ms() >= 10) pegaZ = deslocamento_Z; + + if(debounce1.read_ms() >= 10) pegaZ = deslocamento_Z; //Salva a posição de pega else pegaZ = 0; + debounce1.reset(); } void rotina_emergencia_in() { debounce2.start(); + if(debounce2.read_ms() >= 120) { - motor_z = 0x00; - estado_referenciamento = false; + motor_z = 0x00; //Não permite que pulsos sejam enviados para o motor + estado_referenciamento = false; //Solicita um novo referenciamento estado_botao_emergencia_in =! estado_botao_emergencia_in; contador_emergencia+=1; } + debounce2.reset(); + if(contador_emergencia > 1) { lcd.cls(); wait_ms(500); @@ -134,20 +143,21 @@ lcd.printf("Emergencia ON"); lcd.locate(0,1); lcd.printf("Pressione RST"); - exit(0); + + exit(0); //Encerra o programa e obriga o usuário a resetar o sistema } } - - void rotina_velocidade_eixo_Z() { - tempo_horario = -1*J_Z*0.0000028 + 0.1875; + //Converte a leitura do Joystick para tempo de acionamento do motor + tempo_horario = -1*J_Z*0.0000028 + 0.1875; tempo_anti_horario = J_Z*0.000002785 + 0.0025; } void rotina_deslocamento_eixo_Z() { + //Calcula os deslocamentos no eixo Z deslocamento_horario_Z = (passo_fuso*pulsos_horario*passo_motor)/360; deslocamento_anti_horario_Z = (passo_fuso*pulsos_anti_horario*passo_motor)/360; deslocamento_Z = deslocamento_anti_horario_Z - deslocamento_horario_Z; @@ -161,43 +171,33 @@ void rotina_referenciamento() { + debounce3.start(); - debounce3.start(); if(debounce3.read_ms() >= 10 & contador_SELECT == 1 & estado_botao_emergencia_in == true) { + estado_referenciamento =! estado_referenciamento; motor_referenciamento =! motor_referenciamento; + deslocamento_max_Z = 100; + lcd.cls(); wait_ms(50); lcd.locate(2,0); lcd.printf("Detectado"); wait_ms(1500); lcd.cls(); + contador_SELECT = 0; } + debounce3.reset(); - - } - -void rotina_aciona_motor_horario() -{ - - - - -} - - void rotina_JOG_Z() { - - if(31000 <= J_Z & J_Z <= 35000) { + if(31000 <= J_Z & J_Z <= 35000) motor_z = 0x00; - motor_z = 0x00; - - } else { + else { if (J_Z > 31000 & deslocamento_Z > 0) { for(i = 0; i < 4; i++) { motor_z = 1 << i; @@ -205,10 +205,8 @@ rotina_deslocamento_eixo_Z(); wait(tempo_horario); pulsos_horario+=1; - } - } - else motor_z = 0x00; + } else motor_z = 0x00; if(J_Z < 35000 & deslocamento_Z < deslocamento_max_Z) { for(i = 3; i > -1; i--) { @@ -219,9 +217,6 @@ pulsos_anti_horario+=1; } - } - else motor_z = 0x00; + } else motor_z = 0x00; } - - } \ No newline at end of file