Прерывания и сторонняя функция. Энкодер. Научите как правильно.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Приветствую всех.

Для работы с механическим энкодером использую такой код (Энкодер подключен на лапы 2 и 3.):

Все прекрасно работает. При повороте энкодера в обе стороны вижу в serial как все четко отрабатывает.

Дальше я подключаю библиотеку si5351mcu.h ( https://github.com/pavelmc/Si5351mcu ) и изменяю код вот таким образом:

Все работает, модуль на Si5351 генерирует колебания. Но до тех пор, пока я не раскомментирую строку "Si.setFreq(0, 2000000UL);".

Как только строка "Si.setFreq(0, 2000000UL);" раскомментирована реакция на вращение энкодера пропадает от слова совсем.

Содержимое функции Si.setFreq():

Все функции бибилиотеки (для ленивых :-) ):

Пол дня сегодня бьюсь и не могу сообразить. Как это все связано с прерываниями?

Прошу помощи более опытных специалистов.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для начала я бы вынес функции из прерывания в loop(). А в прерывании сделал бы только установку флагов.

Green
Offline
Зарегистрирован: 01.10.2015
Ну, вероятно, Si.setFreq(0, 2000000UL); слишком долго находится в прерывании, либо не корректно работает в прерывании. Вообще зачем она там? Нужно стремиться что бы функций в прерывания не было вообще!
 
BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Большое спасибо за ответы. Сейчас попробовал выкинуть функции из прерывания и использовать флаг - все замечательно заработало. 
Огромное спасибо ответившим! Век живи - век учись!... :-)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я знаю, что есть специализированная тема по si5351 (если же нужно - перенесите в нее, я с "наскока" не нашел её).

Но спросить хочется. Я не сильно разбираюсь в английском языке, тем более в даташитах на мкросхемы (хотя хочетя, но видно не вышел "телом" ))) ). Но как я понял, DDS микросхема si5351 НЕ может генерировать нужной формы сигнал. Треугольник, пилу, обратную пилу, синусойду. Я использовал несколько бибилиотек, получил в итоге такие результаты: Примерно с 23-24МГц более менее нормальная синусойда, до этой частоты корявый "прямоугольник".

Я правильно понимаю, что на si5351 (за её цену) только так и возможно в "чистом виде"?

Заранее благодарю за ответы по моему вопросу.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

BOOM пишет:

как я понял, DDS микросхема si5351 НЕ может генерировать нужной формы сигнал.

Да, и поэтому Si5351 называется генератор тактовых частот. А, например ad9833, которые это умеет называется генератор сигналов.

BOOM пишет:

Примерно с 23-24МГц более менее нормальная синусойда, до этой частоты корявый "прямоугольник".

Это зависит от того как подключить нагрузку, и от средства измерения. Вы нагрузили выход током, указанном в даташите? Ну и что б видеть  "прямые углы"  у меандра  осциллограф должен иметь полосу пропускания и частоту дискретизации на несколько порядков выше измеряемой частоты. 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Большое спасибо за пояснения.

У меня не дорогой осциллограф на 100МГц (DSO5102P), но, судя по тому, как стремительно (после ~70МГц) начинает снижаться амплитуда сигнала, вносят свои "коррективы" еще и щупы, тупо "не справляются". А отдельно щуп на 1ГГц не дёшев (если брать хороший). Да и мне редко такие частоты высокие нужны.