Qual é a precisão do tempo de pulseIn ()?

8

Eu tenho usado a pulseIn()função para processar a codificação de dados binários baseada em PWM. Funciona bem para distinguir pulsos com comprimentos significativamente diferentes, por exemplo, 500us vs. 1500us. Isso o torna mais do que suficiente para manipular controles remotos de IR típicos.

No entanto, quero criar meu próprio sistema de infravermelho, que pode usar mais de 2 comprimentos de pulso, para que a transferência de dados possa ocorrer mais rapidamente. Idealmente, eu gostaria de usar 8 comprimentos de pulso diferentes para codificação octal (por exemplo, 200us, 400us, 600us, etc.).

Notei variações bastante significativas nos valores retornados por pulseIn()(+/- 10%). Espero que pelo menos parte seja introduzida pelos módulos transmissor e receptor de infravermelho, mas não tenho equipamento suficiente para verificar isso.

Supondo que eu possa atenuar esse erro externo, é pulseIn()provável que seja preciso o suficiente para distinguir pulsos semelhantes?

Peter Bloomfield
fonte

Respostas:

11

A função pulsein () é muito com perdas, pois é um loop rígido e retorna um número * os ciclos de relógio assumidos necessários para cada loop

...
// wait for the pulse to stop
while ((*portInputRegister(port) & bit) == stateMask) {
  if (numloops++ == maxloops)
    return 0;
  width++;
}

// convert the reading to microseconds. The loop has been determined
// to be 20 clock cycles long and have about 16 clocks between the edge
// and the start of the loop. There will be some error introduced by
// the interrupt handlers.
return clockCyclesToMicroseconds(width * 21 + 16); 

O método mais preciso para capturar o tempo de um PIN é usar o RECURSO DE CAPTURA DE ENTRADA. Veja o exemplo . Ele permite a captura de entrada em 1x da CPU para resolução máxima e cada extremidade do pino de entrada captura o valor do relógio do temporizador para leitura do serviço de interrupção gerado. Ele também permite que a interrupção do transbordamento do temporizador, para manter um grande tempo absoluto, seja capturada. Como o 1x rolará rapidamente. As capturas armazenam o tempo em uma matriz para leitura pelo loop principal.


Onde, para sinais sobre IR, a biblioteca típica a ser usada é a biblioteca shirriff / Arduino-IRremote . Onde há várias demonstrações que lerão e enviarão o IR a partir de um sinal desmodulado. Permitir que se construa um esboço de seu próprio design. Esse código originalmente cria uma interrupção do temporizador que controla o pino de entrada a uma taxa determinada por

#define USECPERTICK 50  // microseconds per clock interrupt tick

no arquivo IRremote.h. Para meus propósitos, mudei para 25 nós. Onde acho que isso ainda pode estar intermitentemente faltando fluxos de pulso.

Observe que a desmodulação é melhor realizada dentro do receptor de infravermelho, que por sua vez emite esse sinal de interesse. Onde adicionar algum plano de fundo. Usando a modulação típica de 38KHz, equivale a uma resolução mínima de 26,3uS por ciclo de pulso. A biblioteca do sherriff mostra normalmente que a maioria dos bauds ou bits está na ordem de mais de 10 pulsos. Que parecem atender aos horários desejados.

O trabalho do microtherion / Arduino-IRremote do shirriff melhora a recepção, substituindo a pesquisa de interrupção do temporizador do pino pelo uso de PinChangeInterrupts. Que eu fundei no meu próprio fork do mpflaga / Arduino-IRremote , que adiciona vários outros recursos.

Então você pode usar qualquer uma das bibliotecas acima. Ou crie seu próprio aplicativo que use um dos itens abaixo para capturar bordas.

  1. pesquisas em um evento Timer (por exemplo, 50uS)
  2. captura os micros () em um PinChangeInterrupt
  3. usa interrupções de captura de entrada para obter a hora exata
mpflaga
fonte
11
Resposta brilhante. O Arduino-IRremote é uma biblioteca de alta qualidade. Facilmente legível e com muito design bem pensado, o que significa que é muito confiável.
Cybergibbons
2

Aqui estão alguns dados de um pulseInteste. Um Arduino enviou o que deveriam ser 14us pulsos, e o outro cuspiu esses dados:

18,18,18,12,18,18,18,18,18,18,18,18,18,18,18,18,18,24,19,18,18,18,18,18,24, 18,18,18,19,18,18,12,18,18,19,18,18,18,18,18,18,18,18,18,18,18,18,18,18,19,18,19,24, 18,18,18,18,18,18,18,24,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,19,18,18,18 18,18,18,18,18,18,18,19,18,18,18,11,18

Como você pode ver, os pulsos não são precisos. O tempo seria mais preciso se as extremidades de envio e recebimento fossem gravadas em montagem ou mesmo descarregadas em seus próprios processadores.

O médico
fonte