Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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