Referenciamento do eixo Z

Dependencies:   mbed TextLCD

Referenciamento.cpp

Committer:
doradalberto
Date:
2021-06-01
Revision:
4:f01f91e5aefb
Parent:
Referenciamneto.cpp@ 3:8f569cc10b95

File content as of revision 4:f01f91e5aefb:

#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;
    }
}