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.
- pesquisas em um evento Timer (por exemplo, 50uS)
- captura os micros () em um PinChangeInterrupt
- usa interrupções de captura de entrada para obter a hora exata
Aqui estão alguns dados de um
pulseIn
teste. Um Arduino enviou o que deveriam ser 14us pulsos, e o outro cuspiu esses dados: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.
fonte