Victor_Panic
@Victor_Panic
Инженер по морской электронике

WeMos XI (красный клон Ардуино) работает медленнее Arduino? Что делать?

Работаю с проектом Aruino, который управляет платой синтезатора частоты на Si5351. В проекте очень важны тайминги, в частности - длительность импульсов.

Я нашел готовый проект на GitHub и отредактировал его под свои нужды. Запустил на Arduino Nano - работало нормально. Но для окончательного устройства нужно было использовать «клон Ардуино» — WeMos XI.
64339e6744275809856071.png
Когда я запустил проект на этой плате - всё заработало в несколько раз медленнее. Импульсы стали длиннее, что уже недопустимо для конструкции.

// ***** Function to transmit 'space' (higher FSK tone) for BIT_TIME microseconds  *****
void TransmitSpace(int BIT_TIME) 
{
      long NOW = micros();
      long END = NOW + BIT_TIME;
      setFrequency(SPACE_FREQ);
      digitalWrite(FSK_PIN, LOW);
      do { NOW = micros(); } while (NOW < END);
}

// ***** Function to transmit 'mark' (lower FSK tone) for BIT_TIME microseconds  *****
void TransmitMark(int BIT_TIME) 
{
      long NOW = micros();
      long END = NOW + BIT_TIME;
      digitalWrite(FSK_PIN, HIGH);
      setFrequency(MARK_FREQ);
      do { NOW = micros(); } while (NOW < END);
}


Предполагаю: программа с помощью оператора millis() считает время с момента запуска, а в переменной BIT_TIME устанавливается как раз длительность импульса в этих самых миллисекундах. Вроде все должно работать независимо от тактовой частоты.

Однако что пошло не так? Что делать?
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
Victor_Panic
@Victor_Panic Автор вопроса
Инженер по морской электронике
Всем спасибо за участие, нашёл решение!

На этой плате использован микроконтроллер lgt8fx, у которого можно задавать тактовую частоту до 32МГц. По-умолчанию стоит 4МГц
У Ардуино - 16МГц

Библиотеки и описание работы с этим чипом - здесь (нужно добавить этот тип плат в менеджер плат в Arduino IDE, и тогда при выборе этого чипа появится вкладка меню с выбором частоты)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@kalapanga
Сам я платы на контроллерах Logic Green не использовал, но, судя по симптомам, неправильно выбрана плата в аддоне для Arduino IDE. А возможно стоит другой аддон попробовать. Про платы эти много написано. И на форуме arduino.ru они подробно разбирались и на хабре статьи были.
p.s. Приведённые функции содержат сразу несколько ошибок (но к Вашей проблеме они вряд ли имеют отношение).
1) Функция micros() возвращает значение типа unsigned long, а не long.
2) При сложении NOW + BIT_TIME Вы можете получить переполнение и задержка сработает неправильно. Либо используйте micros() и millis() как в примере BlinkWithoutDelay, либо просто используйте delayMicroseconds()/delay()
Ответ написан
Комментировать
vabka
@vabka
Токсичный шарпист
Проверь кварц. С этой стороны на плате его не видно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы