прерывание раз в 500-100 мкс

Ersekin
Offline
Зарегистрирован: 06.07.2022

Интересует, возможно ли это сделать. 

Прерывание по первому таймеру, если правильно понял, максимально возможно со скоростью 4100 мкс. Пояснение: при 16 МГц цикл выполняется 1/(16 ∗ 10^6) секунды или 6.25e-8 с. Это означает что 65535 отсчетов произойдут за (65535 ∗ 6.25e-8 с) и ISR будет вызываться примерно через 0,0041 с.

Предположил другой вариант, с использование micros(). Заявлено разрешение 4 мкс. 

код: 

void loop() {
timing = micros();
if(micros() - timing >= 1000){  
PORT_motor_HIGH;  
  }
timing = micros();
if(micros() - timing >= 1000){  
PORT_motor_LOW;
  }       
}
 
Других вариантов не нашёл. Прошу подсказку. 
Задача: управление шаговым двигателем Nema 17 (драйвер А4988). 
Библиотеки не интересуют. 
Ersekin
Offline
Зарегистрирован: 06.07.2022

Нужен диапазон 500-100 мкс 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ЛЕГКО !

У таймера есть режим CTC и можно настроить даже так что прерывание будет вызываться сразу после выхода из прерывания (не думаю что вам это надо - так как для выполнения основного кода не будет окна времени). При этом на автомате может и ногой дергать !!!

b707
Offline
Зарегистрирован: 26.05.2017

Ersekin, Ваши расчеты категорически ошибочны. Как в большую так и в меньшую сторону.
Во-первых, для вызова прерывания таймеру необязательно считать до максимальных 65536 тиков, можно настроить прерывание при любом меньшем значении, что позволит программировать меньший интервал. А во-вторых, у таймера есть предделитель, который может понизить частоту вплоть до 1024 раз, позволяя отмерять длинные интервалы.