Referenciamento do eixo Z
Embed:
(wiki syntax)
Show/hide line numbers
Referenciamento.cpp
00001 #include "mbed.h" 00002 #include "TextLCD.h" 00003 00004 TextLCD lcd(D8, D9, D4, D5, D6, D7); //Comunicação com LCD 00005 BusOut motor_z(PB_1, PB_15, PB_14, PB_13); //Pinos para acionamento do motor 00006 00007 Serial pc (D1, D0); //Comunicação com USB 00008 AnalogIn eixo_Z(PC_2); //Joystick eixo Z 00009 AnalogIn botao_SELECT(A0); //Botão SELECT da IHM 00010 InterruptIn posicao_salva(PA_15); //Botão de salva posição Joystick 00011 InterruptIn botao_emergencia_in(PC_4); //Botão de emergência para detectar acionamento 00012 InterruptIn botao_fim_curso(PC_12); //Chave de fim de curso 00013 DigitalIn botao_indicador_fonte_externa(PC_10); //Indica se os componentes dependentes da fonte externa estão energizados 00014 00015 Timer debounce1; //Correção para botão de posição de salva 00016 Timer debounce2; //Correção para botão de emergência 00017 Timer debounce3; //Correção para chave de fim de curso 00018 00019 int pulsos_horario, pulsos_anti_horario; //Contagem dos pulsos para o motor 00020 int i; //Variável para contar o incremento no motor 00021 int J_Z; //Variável para ler o potenciometro do Joystick 00022 int passo_fuso = 5; //Declara o passo do fuso 00023 int pegaZ; //Variável que receberá o valor da posição de salva 00024 int fonte_externa; //Variável para poder ler a existência da alimentação externa 00025 int SELECT; //Variável para leitura do botão SELECT da IHM 00026 int contador_SELECT = 0; //Define o contator do botão SELECT 00027 int contador_emergencia = 0; //Define o contator do botão de emergência 00028 00029 float tempo_horario, tempo_anti_horario; //Define os tempos de acionamento do motor 00030 float deslocamento_horario_Z = 0; //Define o deslocamento linear realizado quando o motor gira no sentido horário (negativo) 00031 float deslocamento_anti_horario_Z = 0; //Define o deslocamento linear realizado quando o motor gira no sentido anti-horário (positivo) 00032 float deslocamento_Z = 0; //Define o deslocamento linear total 00033 float deslocamento_max_Z = 0; //Define o deslocamento linear máximo permitido 00034 float passo_motor = 5.625/32; //Declara o passo angular do motor 00035 00036 bool valor_SELECT = false; //Boleana para lógica do botão SELECT 00037 bool estado_referenciamento = false; //Boleana para identificar a necessidade do referênciamento 00038 bool estado_botao_emergencia_in = false; //Boleana para identificar a necessidade do referênciamentosatisfazer a lógica da rotina_emergencia_in 00039 bool motor_referenciamento = false; //Boleana para permitir o movimento automático do motot no referenciamento 00040 00041 // Rotinas do programa 00042 void rotina_posicao_salva(void); 00043 void rotina_emergencia_in(void); 00044 void rotina_velocidade_eixo_Z(void); 00045 void rotina_deslocamento_eixo_Z (void); 00046 void rotina_JOG_Z (void); 00047 void rotina_botoes_IHM (void); 00048 void rotina_referenciamento (void); 00049 00050 00051 int main() 00052 { 00053 pc.baud(115200); //Define a velocidade da porta USB 00054 motor_z = 0x00; //Estabelece a condição inicial do motor 00055 00056 //Declara os pinos de interrupção com suas funções 00057 posicao_salva.rise(&rotina_posicao_salva); 00058 botao_emergencia_in.rise(&rotina_emergencia_in); 00059 botao_fim_curso.rise(&rotina_referenciamento); 00060 00061 //Inicia o LCD 00062 wait_ms(500); 00063 lcd.locate(2,0); 00064 lcd.printf("SELECT para"); 00065 lcd.locate(0,1); 00066 lcd.printf("referenciamento"); 00067 00068 while(1) { 00069 00070 //Leitura de variáveis 00071 J_Z = eixo_Z.read_u16(); 00072 fonte_externa = botao_indicador_fonte_externa.read(); 00073 SELECT = botao_SELECT.read_u16(); 00074 00075 if(fonte_externa == 0 & estado_referenciamento == true & estado_botao_emergencia_in == true) { //Condição para poder disponibilizar a função JOG 00076 00077 //LCD 00078 lcd.locate(2,0); 00079 lcd.printf("PosicaoZ:"); 00080 lcd.locate(0,1); 00081 lcd.printf("%4fmm",deslocamento_Z); 00082 00083 //Chama a rotina do JOG 00084 rotina_JOG_Z(); 00085 00086 } else { 00087 00088 //Chama a rotina dos botões da IHM 00089 rotina_botoes_IHM(); 00090 00091 if(valor_SELECT == 1) { 00092 contador_SELECT = 1; 00093 00094 lcd.cls(); 00095 lcd.locate(2,0); 00096 lcd.printf("Iniciando"); 00097 lcd.locate(0,1); 00098 lcd.printf("referenciamento"); 00099 00100 //Permite o movimento automático do motor até atingir o fim de curso 00101 while(motor_referenciamento == false) { 00102 for(i = 0; i < 4; i++) { 00103 motor_z = 1 << i; 00104 wait(0.003); 00105 } 00106 00107 } 00108 } 00109 } 00110 } 00111 } 00112 00113 00114 void rotina_posicao_salva() 00115 { 00116 debounce1.start(); 00117 00118 if(debounce1.read_ms() >= 10) pegaZ = deslocamento_Z; //Salva a posição de pega 00119 else pegaZ = 0; 00120 00121 debounce1.reset(); 00122 } 00123 00124 void rotina_emergencia_in() 00125 { 00126 debounce2.start(); 00127 00128 if(debounce2.read_ms() >= 120) { 00129 00130 motor_z = 0x00; //Não permite que pulsos sejam enviados para o motor 00131 estado_referenciamento = false; //Solicita um novo referenciamento 00132 estado_botao_emergencia_in =! estado_botao_emergencia_in; 00133 contador_emergencia+=1; 00134 00135 } 00136 00137 debounce2.reset(); 00138 00139 if(contador_emergencia > 1) { 00140 lcd.cls(); 00141 wait_ms(500); 00142 lcd.locate(0,0); 00143 lcd.printf("Emergencia ON"); 00144 lcd.locate(0,1); 00145 lcd.printf("Pressione RST"); 00146 00147 exit(0); //Encerra o programa e obriga o usuário a resetar o sistema 00148 } 00149 } 00150 00151 void rotina_velocidade_eixo_Z() 00152 { 00153 //Converte a leitura do Joystick para tempo de acionamento do motor 00154 tempo_horario = -1*J_Z*0.0000028 + 0.1875; 00155 tempo_anti_horario = J_Z*0.000002785 + 0.0025; 00156 } 00157 00158 void rotina_deslocamento_eixo_Z() 00159 { 00160 //Calcula os deslocamentos no eixo Z 00161 deslocamento_horario_Z = (passo_fuso*pulsos_horario*passo_motor)/360; 00162 deslocamento_anti_horario_Z = (passo_fuso*pulsos_anti_horario*passo_motor)/360; 00163 deslocamento_Z = deslocamento_anti_horario_Z - deslocamento_horario_Z; 00164 } 00165 00166 void rotina_botoes_IHM() 00167 { 00168 if(SELECT > 60000 & SELECT < 65000) valor_SELECT =! valor_SELECT; 00169 else valor_SELECT = 0; 00170 } 00171 00172 void rotina_referenciamento() 00173 { 00174 debounce3.start(); 00175 00176 if(debounce3.read_ms() >= 10 & contador_SELECT == 1 & estado_botao_emergencia_in == true) { 00177 00178 estado_referenciamento =! estado_referenciamento; 00179 motor_referenciamento =! motor_referenciamento; 00180 00181 deslocamento_max_Z = 100; 00182 00183 lcd.cls(); 00184 wait_ms(50); 00185 lcd.locate(2,0); 00186 lcd.printf("Detectado"); 00187 wait_ms(1500); 00188 lcd.cls(); 00189 00190 contador_SELECT = 0; 00191 } 00192 00193 debounce3.reset(); 00194 } 00195 00196 void rotina_JOG_Z() 00197 { 00198 if(31000 <= J_Z & J_Z <= 35000) motor_z = 0x00; 00199 00200 else { 00201 if (J_Z > 31000 & deslocamento_Z > 0) { 00202 for(i = 0; i < 4; i++) { 00203 motor_z = 1 << i; 00204 rotina_velocidade_eixo_Z(); 00205 rotina_deslocamento_eixo_Z(); 00206 wait(tempo_horario); 00207 pulsos_horario+=1; 00208 } 00209 } else motor_z = 0x00; 00210 00211 if(J_Z < 35000 & deslocamento_Z < deslocamento_max_Z) { 00212 for(i = 3; i > -1; i--) { 00213 motor_z = 1 << i; 00214 rotina_velocidade_eixo_Z(); 00215 rotina_deslocamento_eixo_Z(); 00216 wait(tempo_anti_horario); 00217 pulsos_anti_horario+=1; 00218 00219 } 00220 } else motor_z = 0x00; 00221 } 00222 }
Generated on Sat Jul 16 2022 20:22:02 by
1.7.2