Bom dia,

estou precisando criar uma aplicação mas não sei se dá para fazer isso no arduino. Seria o seguinte, quando uma entrada digital receber um pulso dispara um contador de tempo, quando uma outra entrada digital receber um outro pulso para o contador de tempo e armazena o valor em uma variável. O problema é que o pulso é muito rápido, cerca de 1,5 ms e o intervalo de tempo entre o pulso de star e o pulso de stop também é uma questão de milisegundos. Será que eu consigo fazer isso, se sim, alguém poderia me indicar qual função e sintaxe uso pra isso. Agradeço desde já.

Exibições: 543

Responder esta

Respostas a este tópico

Bom dia,

Veja este exemplo, talvez se contar os intervalos com um tempo menor que milis resolve.

https://www.arduino.cc/en/Reference/Micros

Abs.

-Usando os caminhos tradicionais vc poderia fazer uma função assim:

noInterrupts();

 // desliga interrupções para evitar que elas provoquem erros de leitura

while (...);  // Espera o pino que dispara entrar no estado de disparo;

tempoa=micros();

while (...); // Espera o pino que indica o fim

tempo=micros();

interrupts();

Vc tem seu resultado em tempo-tempoa indicado em microsegundos.

Nao testei, mas acho que pode ser um caminho.

Refs:

https://www.arduino.cc/en/Reference/Micros

https://www.arduino.cc/en/Reference/Interrupts

-Sendo mais caprichoso vc poderia fazer isso por interrupções, disparando um timer e depois lendo o valor (gastaria 2 interrupcões e 1 timer).

-Sendo meio porco mas científico poderia fazer um loop que incrementa uma variável. A quantidade de vezes que vc conseguiu incrementar a variável indica o tempo. para saber como converter o número depois vc pode simplesmente usar o método empírico, medindo com um osciloscópio e chegando a melhor equação por regra de 3 ou ainda observar o resultado em assembler da compilação e contar quandos clocks são necessários para cada ciclo.

Acho que eu estava respondendo ao mesmo tempo que o Eduardo, mas ele foi muito mais generoso na resposta, se seguir esse caminho vai ter a solução.

Abs.

Bom dia Alan.

O que se encaixa no seu projeto é uma interrupção externa.

No anexo está o exemplo!

Agora é só montar o seu programa com este exemplo.

Anexos

Ok, pessoal obrigado pela ajuda vou testar as ideias e mais pra frente posto aqui o resultado, desde já muito obrigado.

Só para complementar, talvez surja uma ideia melhor vou explicar a que se aplicaria o que perguntei. Eu preciso medir o fator de potência indutivo em um circuito, minha ideia é usar um marcador de 0 volts, quando a onda de tensão passar por 0 dispara o contador, quando a onda de corrente passar por 0 para o contador, aí calculo matematicamente o valor do FP.

oi ALS, bom dia,

você pode usar um sinal em uma entrada de interrupt  e  iniciar a contagem,

 e o outro sinal em outra entrada de interrupt e parar a contagem.

Este tempo de 1,5 ms é bem grande se considerarmos o clock do arduino  UNO de 16MHz.

Os pinos que permitem usar o interrupt externo no caso do UNO são Digital 2 e Digital 3.

Rui

Obrigado Rui, nunca tinha ouvido falar neste método vou pesquisar aqui.

Neste caso vc precisará pesquisar sobre circuitos gradadores, ou seja, CA para CA para montar um driver eletrônico.

Exemplo:

CA 127 Vca e 60Hz de entrada;

CA 5 Vp com set point de 2.5Vcc e 60Hz de saída.

Olá amigo,

Veja se te ajuda este código...

poderá alterar o millis() para micros() se precisar de maior precisão.

/*
  Desenvolvido por Carlos Freitas 
  Cronometro
*/
  int pStart = 5; 
  int pStop = 6;

  boolean cStart = false;
  unsigned long cronStart = 0 , cronStop = 0;

  long registro = 0;

void setup(){
  Serial.begin(9600);
  Serial.println("Inicializando...");
  pinMode(pStart,INPUT_PULLUP);
  pinMode(pStop ,INPUT_PULLUP);
}

void loop(){

    if(cStart){
      if(Pulsador(pStop)){
        cronStop = millis(); // Alterar para micros() para maior precisão
        cStart = false;
        Registro();  // Salva e imprime o valor na Serial 
      }
   } else{
     if(Pulsador(pStart)){

       cronStart = millis(); // Alterar para micros() para maior precisão
       cStart = true;
     }
  }
}

boolean Pulsador(int pos){
      return (digitalRead(pos) == LOW)? true : false;
}

void Registro(){
   registro = cronStop - cronStart;
   Serial.print("Tempo : ");
   Serial.println(registro);
}

Muito obrigado amigo, essa semana estou enrolado com outro trabalho mas vou analisar esse código sim, me ajudou muito.

Olá Alan !

estou desenvolvendo um projeto bem parecido com o seu, irei medir o angulo de defasagem entre tensão e corrente quando aplicado um certo tipo de carga.

gostaria de saber se obteve algum resultado positivo quanto a programação!

vlw..

Bom dia,

A ideia deste tópico não levei a frente não, mas consegui desenvolver o equipamento que queria, dá uma olhada no tópico http://labdegaragem.com/forum/topics/controlador-de-fp-com-arduino-...

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2017   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço