
Referenciamento do eixo Z
Revision 4:f01f91e5aefb, committed 2021-06-01
- Comitter:
- doradalberto
- Date:
- Tue Jun 01 13:12:44 2021 +0000
- Parent:
- 3:8f569cc10b95
- Commit message:
- rename;
Changed in this revision
Referenciamento.cpp | Show annotated file Show diff for this revision Revisions of this file |
Referenciamneto.cpp | Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Referenciamento.cpp Tue Jun 01 13:12:44 2021 +0000 @@ -0,0 +1,222 @@ +#include "mbed.h" +#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 +InterruptIn posicao_salva(PA_15); //Botão de salva posição Joystick +InterruptIn botao_emergencia_in(PC_4); //Botão de emergência para detectar acionamento +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 + +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 + +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 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); +void rotina_deslocamento_eixo_Z (void); +void rotina_JOG_Z (void); +void rotina_botoes_IHM (void); +void rotina_referenciamento (void); + + +int main() +{ + pc.baud(115200); //Define a velocidade da porta USB + motor_z = 0x00; //Estabelece a condição inicial do motor + + //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"); + lcd.locate(0,1); + lcd.printf("referenciamento"); + + while(1) { + + //Leitura de variáveis + J_Z = eixo_Z.read_u16(); + fonte_externa = botao_indicador_fonte_externa.read(); + SELECT = botao_SELECT.read_u16(); + + 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); + + //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"); + + //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); + } + + } + } + } + } +} + + +void rotina_posicao_salva() +{ + debounce1.start(); + + 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; //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); + lcd.locate(0,0); + lcd.printf("Emergencia ON"); + lcd.locate(0,1); + lcd.printf("Pressione RST"); + + exit(0); //Encerra o programa e obriga o usuário a resetar o sistema + } +} + +void rotina_velocidade_eixo_Z() +{ + //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; +} + +void rotina_botoes_IHM() +{ + if(SELECT > 60000 & SELECT < 65000) valor_SELECT =! valor_SELECT; + else valor_SELECT = 0; +} + +void rotina_referenciamento() +{ + 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_JOG_Z() +{ + if(31000 <= J_Z & J_Z <= 35000) motor_z = 0x00; + + else { + if (J_Z > 31000 & deslocamento_Z > 0) { + for(i = 0; i < 4; i++) { + motor_z = 1 << i; + rotina_velocidade_eixo_Z(); + rotina_deslocamento_eixo_Z(); + wait(tempo_horario); + pulsos_horario+=1; + } + } else motor_z = 0x00; + + if(J_Z < 35000 & deslocamento_Z < deslocamento_max_Z) { + for(i = 3; i > -1; i--) { + motor_z = 1 << i; + rotina_velocidade_eixo_Z(); + rotina_deslocamento_eixo_Z(); + wait(tempo_anti_horario); + pulsos_anti_horario+=1; + + } + } else motor_z = 0x00; + } +} \ No newline at end of file
--- a/Referenciamneto.cpp Fri May 21 02:01:30 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,222 +0,0 @@ -#include "mbed.h" -#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 -InterruptIn posicao_salva(PA_15); //Botão de salva posição Joystick -InterruptIn botao_emergencia_in(PC_4); //Botão de emergência para detectar acionamento -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 - -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 - -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 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); -void rotina_deslocamento_eixo_Z (void); -void rotina_JOG_Z (void); -void rotina_botoes_IHM (void); -void rotina_referenciamento (void); - - -int main() -{ - pc.baud(115200); //Define a velocidade da porta USB - motor_z = 0x00; //Estabelece a condição inicial do motor - - //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"); - lcd.locate(0,1); - lcd.printf("referenciamento"); - - while(1) { - - //Leitura de variáveis - J_Z = eixo_Z.read_u16(); - fonte_externa = botao_indicador_fonte_externa.read(); - SELECT = botao_SELECT.read_u16(); - - 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); - - //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"); - - //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); - } - - } - } - } - } -} - - -void rotina_posicao_salva() -{ - debounce1.start(); - - 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; //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); - lcd.locate(0,0); - lcd.printf("Emergencia ON"); - lcd.locate(0,1); - lcd.printf("Pressione RST"); - - exit(0); //Encerra o programa e obriga o usuário a resetar o sistema - } -} - -void rotina_velocidade_eixo_Z() -{ - //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; -} - -void rotina_botoes_IHM() -{ - if(SELECT > 60000 & SELECT < 65000) valor_SELECT =! valor_SELECT; - else valor_SELECT = 0; -} - -void rotina_referenciamento() -{ - 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_JOG_Z() -{ - if(31000 <= J_Z & J_Z <= 35000) motor_z = 0x00; - - else { - if (J_Z > 31000 & deslocamento_Z > 0) { - for(i = 0; i < 4; i++) { - motor_z = 1 << i; - rotina_velocidade_eixo_Z(); - rotina_deslocamento_eixo_Z(); - wait(tempo_horario); - pulsos_horario+=1; - } - } else motor_z = 0x00; - - if(J_Z < 35000 & deslocamento_Z < deslocamento_max_Z) { - for(i = 3; i > -1; i--) { - motor_z = 1 << i; - rotina_velocidade_eixo_Z(); - rotina_deslocamento_eixo_Z(); - wait(tempo_anti_horario); - pulsos_anti_horario+=1; - - } - } else motor_z = 0x00; - } -} \ No newline at end of file