Referenciamento do eixo Z

Dependencies:   mbed TextLCD

Committer:
diogonac
Date:
Fri May 21 02:01:30 2021 +0000
Revision:
3:8f569cc10b95
Parent:
2:3eb5c816d496
Codigo completo entrega 5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
diogonac 0:7049aa99ce41 1 #include "mbed.h"
diogonac 0:7049aa99ce41 2 #include "TextLCD.h"
diogonac 0:7049aa99ce41 3
diogonac 1:e8be78899409 4 TextLCD lcd(D8, D9, D4, D5, D6, D7); //Comunicação com LCD
diogonac 3:8f569cc10b95 5 BusOut motor_z(PB_1, PB_15, PB_14, PB_13); //Pinos para acionamento do motor
diogonac 3:8f569cc10b95 6
diogonac 1:e8be78899409 7 Serial pc (D1, D0); //Comunicação com USB
diogonac 1:e8be78899409 8 AnalogIn eixo_Z(PC_2); //Joystick eixo Z
diogonac 1:e8be78899409 9 AnalogIn botao_SELECT(A0); //Botão SELECT da IHM
diogonac 1:e8be78899409 10 InterruptIn posicao_salva(PA_15); //Botão de salva posição Joystick
diogonac 2:3eb5c816d496 11 InterruptIn botao_emergencia_in(PC_4); //Botão de emergência para detectar acionamento
diogonac 1:e8be78899409 12 InterruptIn botao_fim_curso(PC_12); //Chave de fim de curso
diogonac 1:e8be78899409 13 DigitalIn botao_indicador_fonte_externa(PC_10); //Indica se os componentes dependentes da fonte externa estão energizados
diogonac 0:7049aa99ce41 14
diogonac 3:8f569cc10b95 15 Timer debounce1; //Correção para botão de posição de salva
diogonac 3:8f569cc10b95 16 Timer debounce2; //Correção para botão de emergência
diogonac 3:8f569cc10b95 17 Timer debounce3; //Correção para chave de fim de curso
diogonac 1:e8be78899409 18
diogonac 3:8f569cc10b95 19 int pulsos_horario, pulsos_anti_horario; //Contagem dos pulsos para o motor
diogonac 3:8f569cc10b95 20 int i; //Variável para contar o incremento no motor
diogonac 3:8f569cc10b95 21 int J_Z; //Variável para ler o potenciometro do Joystick
diogonac 3:8f569cc10b95 22 int passo_fuso = 5; //Declara o passo do fuso
diogonac 3:8f569cc10b95 23 int pegaZ; //Variável que receberá o valor da posição de salva
diogonac 3:8f569cc10b95 24 int fonte_externa; //Variável para poder ler a existência da alimentação externa
diogonac 3:8f569cc10b95 25 int SELECT; //Variável para leitura do botão SELECT da IHM
diogonac 3:8f569cc10b95 26 int contador_SELECT = 0; //Define o contator do botão SELECT
diogonac 3:8f569cc10b95 27 int contador_emergencia = 0; //Define o contator do botão de emergência
diogonac 2:3eb5c816d496 28
diogonac 3:8f569cc10b95 29 float tempo_horario, tempo_anti_horario; //Define os tempos de acionamento do motor
diogonac 3:8f569cc10b95 30 float deslocamento_horario_Z = 0; //Define o deslocamento linear realizado quando o motor gira no sentido horário (negativo)
diogonac 3:8f569cc10b95 31 float deslocamento_anti_horario_Z = 0; //Define o deslocamento linear realizado quando o motor gira no sentido anti-horário (positivo)
diogonac 3:8f569cc10b95 32 float deslocamento_Z = 0; //Define o deslocamento linear total
diogonac 3:8f569cc10b95 33 float deslocamento_max_Z = 0; //Define o deslocamento linear máximo permitido
diogonac 3:8f569cc10b95 34 float passo_motor = 5.625/32; //Declara o passo angular do motor
diogonac 2:3eb5c816d496 35
diogonac 3:8f569cc10b95 36 bool valor_SELECT = false; //Boleana para lógica do botão SELECT
diogonac 3:8f569cc10b95 37 bool estado_referenciamento = false; //Boleana para identificar a necessidade do referênciamento
diogonac 3:8f569cc10b95 38 bool estado_botao_emergencia_in = false; //Boleana para identificar a necessidade do referênciamentosatisfazer a lógica da rotina_emergencia_in
diogonac 3:8f569cc10b95 39 bool motor_referenciamento = false; //Boleana para permitir o movimento automático do motot no referenciamento
diogonac 2:3eb5c816d496 40
diogonac 3:8f569cc10b95 41 // Rotinas do programa
diogonac 0:7049aa99ce41 42 void rotina_posicao_salva(void);
diogonac 2:3eb5c816d496 43 void rotina_emergencia_in(void);
diogonac 1:e8be78899409 44 void rotina_velocidade_eixo_Z(void);
diogonac 1:e8be78899409 45 void rotina_deslocamento_eixo_Z (void);
diogonac 1:e8be78899409 46 void rotina_JOG_Z (void);
diogonac 1:e8be78899409 47 void rotina_botoes_IHM (void);
diogonac 1:e8be78899409 48 void rotina_referenciamento (void);
diogonac 0:7049aa99ce41 49
diogonac 0:7049aa99ce41 50
diogonac 0:7049aa99ce41 51 int main()
diogonac 0:7049aa99ce41 52 {
diogonac 3:8f569cc10b95 53 pc.baud(115200); //Define a velocidade da porta USB
diogonac 3:8f569cc10b95 54 motor_z = 0x00; //Estabelece a condição inicial do motor
diogonac 0:7049aa99ce41 55
diogonac 3:8f569cc10b95 56 //Declara os pinos de interrupção com suas funções
diogonac 0:7049aa99ce41 57 posicao_salva.rise(&rotina_posicao_salva);
diogonac 2:3eb5c816d496 58 botao_emergencia_in.rise(&rotina_emergencia_in);
diogonac 1:e8be78899409 59 botao_fim_curso.rise(&rotina_referenciamento);
diogonac 3:8f569cc10b95 60
diogonac 3:8f569cc10b95 61 //Inicia o LCD
diogonac 1:e8be78899409 62 wait_ms(500);
diogonac 1:e8be78899409 63 lcd.locate(2,0);
diogonac 1:e8be78899409 64 lcd.printf("SELECT para");
diogonac 1:e8be78899409 65 lcd.locate(0,1);
diogonac 1:e8be78899409 66 lcd.printf("referenciamento");
diogonac 0:7049aa99ce41 67
diogonac 0:7049aa99ce41 68 while(1) {
diogonac 0:7049aa99ce41 69
diogonac 3:8f569cc10b95 70 //Leitura de variáveis
diogonac 0:7049aa99ce41 71 J_Z = eixo_Z.read_u16();
diogonac 0:7049aa99ce41 72 fonte_externa = botao_indicador_fonte_externa.read();
diogonac 1:e8be78899409 73 SELECT = botao_SELECT.read_u16();
diogonac 0:7049aa99ce41 74
diogonac 3:8f569cc10b95 75 if(fonte_externa == 0 & estado_referenciamento == true & estado_botao_emergencia_in == true) { //Condição para poder disponibilizar a função JOG
diogonac 2:3eb5c816d496 76
diogonac 3:8f569cc10b95 77 //LCD
diogonac 1:e8be78899409 78 lcd.locate(2,0);
diogonac 1:e8be78899409 79 lcd.printf("PosicaoZ:");
diogonac 0:7049aa99ce41 80 lcd.locate(0,1);
diogonac 2:3eb5c816d496 81 lcd.printf("%4fmm",deslocamento_Z);
diogonac 3:8f569cc10b95 82
diogonac 3:8f569cc10b95 83 //Chama a rotina do JOG
diogonac 1:e8be78899409 84 rotina_JOG_Z();
diogonac 0:7049aa99ce41 85
diogonac 1:e8be78899409 86 } else {
diogonac 3:8f569cc10b95 87
diogonac 3:8f569cc10b95 88 //Chama a rotina dos botões da IHM
diogonac 1:e8be78899409 89 rotina_botoes_IHM();
diogonac 3:8f569cc10b95 90
diogonac 1:e8be78899409 91 if(valor_SELECT == 1) {
diogonac 1:e8be78899409 92 contador_SELECT = 1;
diogonac 3:8f569cc10b95 93
diogonac 1:e8be78899409 94 lcd.cls();
diogonac 1:e8be78899409 95 lcd.locate(2,0);
diogonac 1:e8be78899409 96 lcd.printf("Iniciando");
diogonac 1:e8be78899409 97 lcd.locate(0,1);
diogonac 1:e8be78899409 98 lcd.printf("referenciamento");
diogonac 3:8f569cc10b95 99
diogonac 3:8f569cc10b95 100 //Permite o movimento automático do motor até atingir o fim de curso
diogonac 3:8f569cc10b95 101 while(motor_referenciamento == false) {
diogonac 3:8f569cc10b95 102 for(i = 0; i < 4; i++) {
diogonac 3:8f569cc10b95 103 motor_z = 1 << i;
diogonac 3:8f569cc10b95 104 wait(0.003);
diogonac 2:3eb5c816d496 105 }
diogonac 2:3eb5c816d496 106
diogonac 2:3eb5c816d496 107 }
diogonac 1:e8be78899409 108 }
diogonac 0:7049aa99ce41 109 }
diogonac 0:7049aa99ce41 110 }
diogonac 0:7049aa99ce41 111 }
diogonac 0:7049aa99ce41 112
diogonac 0:7049aa99ce41 113
diogonac 0:7049aa99ce41 114 void rotina_posicao_salva()
diogonac 0:7049aa99ce41 115 {
diogonac 1:e8be78899409 116 debounce1.start();
diogonac 3:8f569cc10b95 117
diogonac 3:8f569cc10b95 118 if(debounce1.read_ms() >= 10) pegaZ = deslocamento_Z; //Salva a posição de pega
diogonac 0:7049aa99ce41 119 else pegaZ = 0;
diogonac 3:8f569cc10b95 120
diogonac 1:e8be78899409 121 debounce1.reset();
diogonac 0:7049aa99ce41 122 }
diogonac 0:7049aa99ce41 123
diogonac 2:3eb5c816d496 124 void rotina_emergencia_in()
diogonac 0:7049aa99ce41 125 {
diogonac 1:e8be78899409 126 debounce2.start();
diogonac 3:8f569cc10b95 127
diogonac 2:3eb5c816d496 128 if(debounce2.read_ms() >= 120) {
diogonac 2:3eb5c816d496 129
diogonac 3:8f569cc10b95 130 motor_z = 0x00; //Não permite que pulsos sejam enviados para o motor
diogonac 3:8f569cc10b95 131 estado_referenciamento = false; //Solicita um novo referenciamento
diogonac 2:3eb5c816d496 132 estado_botao_emergencia_in =! estado_botao_emergencia_in;
diogonac 2:3eb5c816d496 133 contador_emergencia+=1;
diogonac 1:e8be78899409 134
diogonac 1:e8be78899409 135 }
diogonac 3:8f569cc10b95 136
diogonac 1:e8be78899409 137 debounce2.reset();
diogonac 3:8f569cc10b95 138
diogonac 2:3eb5c816d496 139 if(contador_emergencia > 1) {
diogonac 2:3eb5c816d496 140 lcd.cls();
diogonac 2:3eb5c816d496 141 wait_ms(500);
diogonac 2:3eb5c816d496 142 lcd.locate(0,0);
diogonac 2:3eb5c816d496 143 lcd.printf("Emergencia ON");
diogonac 2:3eb5c816d496 144 lcd.locate(0,1);
diogonac 2:3eb5c816d496 145 lcd.printf("Pressione RST");
diogonac 3:8f569cc10b95 146
diogonac 3:8f569cc10b95 147 exit(0); //Encerra o programa e obriga o usuário a resetar o sistema
diogonac 2:3eb5c816d496 148 }
diogonac 0:7049aa99ce41 149 }
diogonac 0:7049aa99ce41 150
diogonac 1:e8be78899409 151 void rotina_velocidade_eixo_Z()
diogonac 0:7049aa99ce41 152 {
diogonac 3:8f569cc10b95 153 //Converte a leitura do Joystick para tempo de acionamento do motor
diogonac 3:8f569cc10b95 154 tempo_horario = -1*J_Z*0.0000028 + 0.1875;
diogonac 2:3eb5c816d496 155 tempo_anti_horario = J_Z*0.000002785 + 0.0025;
diogonac 0:7049aa99ce41 156 }
diogonac 0:7049aa99ce41 157
diogonac 1:e8be78899409 158 void rotina_deslocamento_eixo_Z()
diogonac 0:7049aa99ce41 159 {
diogonac 3:8f569cc10b95 160 //Calcula os deslocamentos no eixo Z
diogonac 0:7049aa99ce41 161 deslocamento_horario_Z = (passo_fuso*pulsos_horario*passo_motor)/360;
diogonac 0:7049aa99ce41 162 deslocamento_anti_horario_Z = (passo_fuso*pulsos_anti_horario*passo_motor)/360;
diogonac 2:3eb5c816d496 163 deslocamento_Z = deslocamento_anti_horario_Z - deslocamento_horario_Z;
diogonac 0:7049aa99ce41 164 }
diogonac 0:7049aa99ce41 165
diogonac 1:e8be78899409 166 void rotina_botoes_IHM()
diogonac 1:e8be78899409 167 {
diogonac 1:e8be78899409 168 if(SELECT > 60000 & SELECT < 65000) valor_SELECT =! valor_SELECT;
diogonac 1:e8be78899409 169 else valor_SELECT = 0;
diogonac 1:e8be78899409 170 }
diogonac 1:e8be78899409 171
diogonac 1:e8be78899409 172 void rotina_referenciamento()
diogonac 1:e8be78899409 173 {
diogonac 3:8f569cc10b95 174 debounce3.start();
diogonac 1:e8be78899409 175
diogonac 2:3eb5c816d496 176 if(debounce3.read_ms() >= 10 & contador_SELECT == 1 & estado_botao_emergencia_in == true) {
diogonac 3:8f569cc10b95 177
diogonac 1:e8be78899409 178 estado_referenciamento =! estado_referenciamento;
diogonac 2:3eb5c816d496 179 motor_referenciamento =! motor_referenciamento;
diogonac 3:8f569cc10b95 180
diogonac 2:3eb5c816d496 181 deslocamento_max_Z = 100;
diogonac 3:8f569cc10b95 182
diogonac 1:e8be78899409 183 lcd.cls();
diogonac 1:e8be78899409 184 wait_ms(50);
diogonac 1:e8be78899409 185 lcd.locate(2,0);
diogonac 1:e8be78899409 186 lcd.printf("Detectado");
diogonac 1:e8be78899409 187 wait_ms(1500);
diogonac 1:e8be78899409 188 lcd.cls();
diogonac 3:8f569cc10b95 189
diogonac 1:e8be78899409 190 contador_SELECT = 0;
diogonac 1:e8be78899409 191 }
diogonac 3:8f569cc10b95 192
diogonac 1:e8be78899409 193 debounce3.reset();
diogonac 1:e8be78899409 194 }
diogonac 1:e8be78899409 195
diogonac 1:e8be78899409 196 void rotina_JOG_Z()
diogonac 0:7049aa99ce41 197 {
diogonac 3:8f569cc10b95 198 if(31000 <= J_Z & J_Z <= 35000) motor_z = 0x00;
diogonac 0:7049aa99ce41 199
diogonac 3:8f569cc10b95 200 else {
diogonac 2:3eb5c816d496 201 if (J_Z > 31000 & deslocamento_Z > 0) {
diogonac 0:7049aa99ce41 202 for(i = 0; i < 4; i++) {
diogonac 0:7049aa99ce41 203 motor_z = 1 << i;
diogonac 1:e8be78899409 204 rotina_velocidade_eixo_Z();
diogonac 1:e8be78899409 205 rotina_deslocamento_eixo_Z();
diogonac 0:7049aa99ce41 206 wait(tempo_horario);
diogonac 0:7049aa99ce41 207 pulsos_horario+=1;
diogonac 0:7049aa99ce41 208 }
diogonac 3:8f569cc10b95 209 } else motor_z = 0x00;
diogonac 0:7049aa99ce41 210
diogonac 2:3eb5c816d496 211 if(J_Z < 35000 & deslocamento_Z < deslocamento_max_Z) {
diogonac 0:7049aa99ce41 212 for(i = 3; i > -1; i--) {
diogonac 0:7049aa99ce41 213 motor_z = 1 << i;
diogonac 1:e8be78899409 214 rotina_velocidade_eixo_Z();
diogonac 1:e8be78899409 215 rotina_deslocamento_eixo_Z();
diogonac 0:7049aa99ce41 216 wait(tempo_anti_horario);
diogonac 0:7049aa99ce41 217 pulsos_anti_horario+=1;
diogonac 0:7049aa99ce41 218
diogonac 0:7049aa99ce41 219 }
diogonac 3:8f569cc10b95 220 } else motor_z = 0x00;
diogonac 0:7049aa99ce41 221 }
diogonac 0:7049aa99ce41 222 }