Contando pulsos usando Arduino Uno (Português)

Estou tentando contar pulsos de um gerador de forma de onda usando um Arduino Uno. O gerador de forma de onda é definido nas seguintes configurações:

  • Tipo de forma de onda: pulso
  • Freq: 20 Hz (50ms)
  • Amplitude: 3,0 Vpp
  • Offset: 0V
  • Largura = 5ms

Até agora, recebo apenas 0s exibidos no meu monitor serial.

Aqui é o que eu tentei até agora:

1) Usando pulseIn () e pulseInLong () -> sem sucesso

2) Verifique as conexões da fiação -> Usei o multímetro para verificar e eles estão conectados corretamente.

3) Conecte um osciloscópio para ver se a forma de onda está sendo gerada -> A forma de onda está sendo gerada conforme mostrado nas imagens abaixo.

Nota: A forma de onda gerador faz parte do osciloscópio:

Gerador de forma de onda

Diagrama de conexão

Meu código é mostrado abaixo:

volatile int IRQcount; int pin = 2; int pin_irq = 0; //IRQ that matches to pin 2 int result = 0; void setup() { // put your setup code here, to run once: Serial.begin (115200); pinMode(2, INPUT); attachInterrupt(pin_irq, IRQcounter, FALLING); } void IRQcounter() { IRQcount++; } void loop() { // put your main code here, to run repeatedly: cli();//disable interrupts IRQcount = 0; sei();//enable interrupts delay(500); cli();//disable interrupts result = IRQcount; sei();//enable interrupts Serial.print(F("Counted = ")); Serial.println(result); } 

Comentários

  • Eu não ' não sei se o padrão será entrada bu t você precisa usar pinMode(pin, mode)?
  • O " baixo " parte de sua forma de onda em 0 V ou em -1,5 V?
  • Na foto do escopo ', o nível baixo do sinal é -1,5 volts , e o nível alto é de 1,5 volts. 1,5 volts é provavelmente uma tensão muito baixa para ser reconhecida como uma lógica Alta pelo Arduino.
  • Para ser gentil com as entradas do Arduino, você deve definir o gerador de sinal para 5 Vpp e alterar o deslocamento para + 2,5 volts, então o sinal muda entre 0 e + 5V (assumindo que o Arduino Vcc é 5 volts.) As entradas digitais no microcontrolador não devem ser negativas.
  • Oh, entendi, mudei o atraso para 250 ms é por isso que eu estava vendo resultado = 5, mas agora mudei de volta para 500 ms e agora vejo resultado = 10, você pode explicar como verificar se a contagem de pulso está correta?

Resposta

  1. Como Peter Bennett e outros apontaram, inicialmente você configurou 3Vpp, ou um pulso alternando + 1,5V a -1,5v . De acordo com as características elétricas do controlador do Arduino , não é garantido que 1,5 V seja lido como “1”. Deve ser pelo menos 0,6 de Vcc. irq pino não pode reconhecer transições de borda, em vez disso, ele lê um “0” o tempo todo. E, você não deve direcionar tensão negativa para os pinos de E / S também para evitar danos !!
  2. A frequência de pulso é 20 Hz ou 20 pulsos por segundo. Com 500ms de atraso, você está contando quantos pulsos ocorrem por meio segundo, então result deve ter o valor 10. Isso é o que você está obtendo exibido no monitor serial.

Resposta

De a “foto do osciloscópio, o nível baixo do sinal é -1,5 volts e o nível alto é 1,5 volts. 1,5 volts é provavelmente uma tensão muito baixa para ser reconhecida como uma lógica Alta pelo Arduino.

Além disso, as entradas digitais do Arduino podem ser danificadas pela tensão negativa. As entradas na maioria dos CIs digitais são projetadas para aceitar entradas entre o aterramento e a tensão de alimentação positiva.

Se o Arduino for operado a partir de +5 Volts, você deve definir o gerador de sinal para 5 Vpp, com um deslocamento de +2,5 volt para manter o sinal dentro do Arduino ” Limites de tensão de entrada s.

Para ser reconhecida como um Alto lógico, a tensão de entrada deve estar acima de 0,7 Vcc ou 3,5 volts – tensões mais baixas podem não ser reconhecidas como Alta, portanto, não irão disparar uma interrupção.

Comentários

  • Eu o defini para 5Vpp, porém o deslocamento de + 2,5 V causa flutuações no número de contagens e sem o deslocamento eu tenho um leitura consistente da contagem de pulsos, isso é esperado? Eu acho que sim
  • Verifique os níveis de entrada no Arduino. O nível baixo deve estar no (ou muito próximo) do aterramento, enquanto o nível alto deve estar próximo ao fornecimento positivo do Arduino ' s, que suponho ser de 5 volts.

Resposta

Você está redefinindo a contagem de IRQ todas as vezes através do loop.

Comentários

  • Acho que ' está OK. Zere o contador, habilite as interrupções, retarde e imprima o número de interrupções no final do retardo.
  • Isso ' não é um problema.
  • Quais são as unidades em delay ()? Eu não ' t programa o Audrino, mas isso é tique ou ns?
  • @ mjh2007 milissegundos, então ' s definitivamente longo o suficiente.
  • Arduino delay() está em ms.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *