A documentação micros () observa que o valor de retorno sempre será um múltiplo de 4.
Existe alguma maneira de obter um clique de microssegundo de resolução mais alta, de preferência até o nível de 1 microssegundo?
Descer para o nível AVR é aceitável.
Respostas:
Sim, dependendo da taxa de clock básica do seu Arduino. Por exemplo, aqui estão as frequências de entrada do contador e os períodos após a pré-escala, para um contador 2 do ATMega2560 e uma taxa básica de clock de 16 MHz. O timer incorporou opções de valor "prescaler" que determinam a frequência / período, mostradas nesta tabela:
Para uma melhor resolução de temporização, use um valor chamado TCNT2. Há um contador de compilação que varia de 0 a 255 porque o timer é de 8 bits. Quando o contador atinge o valor atribuído pelo TCNT2, ele aciona uma interrupção. Essa interrupção é chamada TIMER2_OVF_vect.
com essas informações, a taxa de interrupção resultante seria: 16 MHz / (pré-calibrador * (255 - TCNT2))
Você pode fazer com que o timer funcione a 16MHz (62,5nSec), embora isso seja muito mais rápido do que você precisa; 2 MHz com uma contagem inicial de (255-2) forneceriam uma taxa de interrupção de 1 MHz. Divida isso por 2 no seu ISR:
A folha de dados para o seu MCU é o recurso básico; este artigo dará a você (e me deu!) um bom avanço.
fonte
Mark, decidi escrever um novo conjunto de funções, com base no Arduino Atmega328 Timer2, e usando interrupções de estouro, para obter precisão de 0,5us. Meu código está disponível para download e uso aqui:
http://electricrcaircraftguy.blogspot.com/2014/02/Timer2Counter-more-precise-Arduino-micros-function.html
Aqui está uma breve descrição: "Eu escrevi uma" biblioteca "para obter precisão de 0,5us em uma função de substituição" micros () ", para que eu possa obter resultados repetíveis lendo um sinal PWM ou PPM, dentro de 1us. Internet e não consegui encontrar algo comparável (ou que fosse fácil de usar, e mantivesse a capacidade do Arduino de gravar sinais PWM via Servo Libary), então acho que esta é minha primeira grande contribuição ao mundo do Arduino e do Radio Control ".
fonte
Se descer para o nível do AVR for aceitável (como você mencionou na sua pergunta), você poderá configurar um cronômetro e até obter os tiques do relógio do AVR.
Você precisa consultar a folha de dados do seu AVR, pois difere entre os diferentes ATMegas e ATTinys. Mas o procedimento é sempre o mesmo. O que você precisa fazer é:
TCCR
Dessa forma, é possível obter os ticks exatos no registro do timer, no entanto, você precisa contar os estouros manualmente. Isso é o mais preciso possível pela tecnologia.
Aqui está um exemplo de código para o AT90S2313 desatualizado, mas fornece boas dicas sobre o que fazer basicamente:
fonte
TIMSK
,TOIE0
etc (cópia configuração do temporizador do ATmega328P folha de dados). Parece que você não pode usar a macro ISR (); em vez disso, use arduino.cc/en/Reference/AttachInterrupt .