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:
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
Resposta
- 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 !! - 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.
pinMode(pin, mode)
?