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.
Dependencies: mbed
main.cpp
- Committer:
- hugocampos
- Date:
- 2021-02-13
- Revision:
- 5:3148a88c41a2
- Parent:
- 4:2aa867a57a02
File content as of revision 5:3148a88c41a2:
/*
*Autor: Marcelo Costanzo
*Obejtivo: Controla uma maquina de vidro
*Status: Funcionando
*Data: 2019
*/
#include "mbed.h"
#define filtro 10
// Usar a nucleo 302 ou 103
//-----------Pinos de saida (output)---------------
DigitalOut controlLED(LED2);
DigitalOut IN1A(D10);
DigitalOut IN2A(D8);
DigitalOut EN_A(D9);
//----------Pinos de entrada analogica (ADC)------
AnalogIn SHUNT(A5);
//----------Pinos de interrupção externa----------
InterruptIn UP(D7);
InterruptIn DOWN(D2);
//---------Declaração de timers-------------------
Timer timer;
//---------Declaração de comunicação serial-------
Serial pc(USBTX, USBRX);
//---------Declaração de variaveis----------------
bool flag = 0;
float CURRENT[filtro];
float media = 0;
int i = 0;
//---------Rotina para dar inicio ao processo de debounce-------------
void bounce()
{
timer.start();
}
//---------Rotina para dar fim ao processo de debounce----------------
void stop_timer()
{
timer.stop();
timer.reset();
}
//-------Rotina para setar os pinos na direção de fechar o vidro-------
void close()
{
IN1A = 0;
IN2A = 1;
EN_A = 1;
}
//-------Rotina para setar os pinos na direção de abrir o vidro--------
void open()
{
IN1A = 1;
IN2A = 0;
EN_A = 1;
}
//-------Rotina para setar os pinos para parar o vidro--------
void stop()
{
IN1A = 0;
IN2A = 0;
EN_A = 0;
}
int main()
{
//----Especificando as bordas das interrupções, e o endereço das rotinas que serão chamadas---
UP.fall(&bounce);
DOWN.fall(&bounce);
UP.rise(&stop_timer);
DOWN.rise(&stop_timer);
//------------debug para saber se o uC iniciou/travou-------------
pc.printf("\n\riniciando");
controlLED = 1;
wait(0.5);
controlLED = 0;
stop();
while(1)
{
//-----bloqueio da variavel i, para que não tenha mais de 10 iterações----
if(i > filtro - 1)
{
i = 0;
}
//----Leitura da corrente e amarzenamento do valor no buffer--------------
CURRENT[i] = SHUNT.read();
i++;
//----Integração dos valores de corrente, para fazer filtro do tipo "media movel"
for(int j=0; j<filtro; j++)
{
media += CURRENT[j];
}
//------Calculando a media-----------------------------------------------
media = media / filtro;
//------Conversão do valor para a unidade de ampere--------------------
media = media * 3.0f;
//------Multiplicador do valor por conta do shunt de 0R1--------------------
//media = media * 10;
//-----Condição que tenha apertado o botão rapidamente----------------
//clique rapido, para subir/descer o vidro por uma curta distancia
if((timer.read() > 0.1f) && (timer.read() < 0.6f))
{
if(DOWN == 0)
{
pc.printf("\n\rdown rapido");
open();
wait(0.6f);
if(DOWN == 1)//se soltou o botão, comanda a parada
{
stop();
}
}
if(UP == 0)
{
pc.printf("\n\rup rapido");
close();
wait(0.6f);
if(UP == 1)//se soltou o botão, comanda a parada
{
stop();
}
}
}
//-----Condição que tenha apertado o botão por mais de um segundo----------------
//clique lento, para subir/descer o vidro por todo o trajeto
if(timer.read() > 1.0f)
{
if(DOWN == 0)
{
pc.printf("\n\rdown lento");
open();
}
if(UP == 0)
{
pc.printf("\n\rup lento");
close();
}
}
//wait(0.1);
//pc.printf("\n\rCorrente de %f Amperes", media);
//----Rotina para parar o vidro caso a corrente suba, é a rotina que será fim-de-curso e sistema anti-esmagamento------
if(media > 1.0f)
{
wait(0.3);
if(media > 1.0f)
{
stop();
pc.printf("\n\rCORTE");
}
}
}
}