Как Arduino может считывать частоту выше 16 МГц?
Я хотел бы понять, как Arduino измеряет частоту. Также как мой вольтметр может измерять частоту. Поскольку я новичок в использовании микроконтроллера, я бы прочитал такую частоту:
void loop()
{
while(digitalRead(myPin)==HIGH)
{
// вывод высокий
}
// измеряем время в миллисекундах (это время, когда вывод был высоким)
while(digitalRead(myPin)==LOW)
{
// вывод низкий
}
// измеряем время в миллисекундах (это время, когда пин был низким)
}
С этим кодом мне понятно, как измерять частоту и рабочий цикл. Проблема с этим кодом в том, что он, вероятно, будет очень медленным и, вероятно, будет считывать частоты до 100 Гц и меньше.
Итак, мои вопросы:
Как Arduino может считывать частоты выше 100 Гц? Как это достигается?
Я погуглил частоту Arduino, и оказалось, что она составляет 16 МГц. Это означает, что арудино может считывать частоты до 16 МГц? Кабели Ethernet, в частности CAT5, имеют частоту 100 МГц. Это означает, что он отправляет 100 000 000 сигналов в одну секунду! Как Arduino может отправлять столько сигналов за одну секунду, если я куплю Ethernet-экран, такой как этот ?
@Tono Nam, 👍0
Обсуждение2 ответа
Лучший ответ:
Как Arduino может считывать частоты выше 100 Гц? Как это достигается?
Прерывания (если вы хотите сделать это в программном обеспечении) или волшебная аппаратная часть, называемая периферийным устройством сравнения ввода, которое встроено в большинство микроконтроллеров.
Я погуглил частоту arduino, и оказалось, что она составляет 16 МГц. Это означает, что Арудино может считывать частоты до 16 МГц?
Нет, это скорость, с которой работает ЦП. Максимальная частота сигнала, которую он может считывать, обычно ниже этой (для SPI это вдвое меньше, например, 8 МГц).
Кабели Ethernet, в частности CAT5, имеют частоту 100 МГц. Это означает, что он отправляет 100 000 000 сигналов в одну секунду! Как Arduino может отправлять столько сигналов за одну секунду, если я куплю Ethernet-щит, такой как этот?
Это не так. Щит делает. Arduino просто сообщает шилду, что делать, а чип на шилде делает это.
Я бы не стал использовать millis()
для измерения периода сигнала, если только
программе приходилось иметь дело с крайне низкими частотами. И крайне низким
Я имею в виду ниже 1 МГц (один миллигерц). Для частот выше
1 МГц, показанный вами псевдокод будет работать так же или даже лучше.
используя micros()
.
По мере увеличения частоты вы начнете искать более необычные варианты.
для его измерения. Например, вы можете подсчитать нарастающие фронты от
прерывать и измерять продолжительность многих (а не только одного) периодов с помощью
микро()
. Это должно работать до нескольких сотен кГц. Для более быстрого
частоты вы можете использовать аппаратный таймер, настроенный как счетчик, и
измерить время, необходимое для переполнения. Это должно быть хорошо для
почти до половины частоты процессора (8 МГц).
Что касается сигналов Ethernet, см. ответ Маженко.
- Связь между Arduino UNO с помощью Ethernet-экрана и ВЧ-аттенюатора
- Установите частоту ШИМ на 25 кГц.
- Максимальная частота цифрового сигнала в Arduino Uno?
- Постоянный выход тактовой частоты Arduino
- Чтение частоты ввода в цифровых выводах
- Генерировать 1,7 МГц с PWM в Uno?
- Можно ли сгенерировать точный тактовый импульс 15 кГц с помощью ардуино?
- Подключение Arduino ethernet shield (ip-адрес - 0.0.0.0)
вы можете использовать микросхему цифрового счетчика, чтобы уменьшить частоту до уровня, с которым может справиться Arduino. Подача прямоугольной волны на 8-битный счетчик заставит бит 8 колебаться с точностью до 1/256 частоты прямоугольной волны., @dandavis