Referenciamento do eixo Z

Dependencies:   mbed TextLCD

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Referenciamento.cpp Source File

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 }