Вопросы по библиотеке GyverTimers

bort707

★★★★★★✩
21 Сен 2020
3,168
934
Попробовал управление фазой двух каналов Таймер1 Атмега328.
Как я и думал, никаких проблем, все работает.
Картинки ниже с реального сигнала, Ардуино Нано 16 МГц на логический анализатор.

0 градусов
Screenshot from 2025-03-24 16-42-59.png

Сдвиг 45 гр
Screenshot from 2025-03-24 16-33-45.png

Сдвиг 135 гр
Screenshot from 2025-03-24 16-43-58.png


А вот более 180 - 215:
Screenshot from 2025-03-24 16-45-12.png


Код:

C++:
void setup() {
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);

  TCNT1 = 0;
  ICR1 = 179; // = 16M / (64 * 360)  = 694 Hz
  TCCR1A = _BV(COM1A0) | _BV(COM1B0);  // toogle CH_A and CH_B on match
  TCCR1B = _BV(WGM12) | _BV(WGM13); // mode 12 => CTC with TOP=ICR1
  TCCR1B |= _BV(CS11) | _BV(CS10); // 64 prescaler
  OCR1A = 0;
  OCR1B = 45;  // phase shift 45 grade
}
Частота сигнала задается прескалером и значением ICR1, в коде выше выставлено примерно 690 Гц,
Сдвиг канала B относительно А от 0 до 180 гр задается значением OCR1B = Phase; при OCR1A = 0;
Для сдвига более чем на 180 гр ставим OCR1B =0 и меняем OCR1A = 360- Phase;
 
  • Лойс +1
Реакции: poty

Ягорка

✩✩✩✩✩✩✩
21 Мар 2025
13
0
Слепил на макетке фазовращатель из логики 4011 с переменной RC-цепи. Крутит фазу куда хочу и зачем хочу. В чем и сомнений небыло. Хотя, такой способ не нравится: нужна настройка из-за разброса номиналов, диапазон регулировки зависит от частоты, место занимает на плате, которое ограничено конкретным корпусом. Да и другие всякие рационализаторские мысли крутились.

Но к сожалению, вот этот эффект перекидывания фазы на 180 проявился и при изменении частоты. Т.е., прописываю частоту, фазу +90град, прошиваю: работает как мне нужно. Меняю частоту в скетче, прошиваю: на выходе фаза -90.
Печально.
Видать, библиотека писалась в понедельник, а тестировалась в пятницу. Функция вроде бы есть, вроде бы работает, а пользоваться нельзя. Ну разве что, в проекте с фиксированной частотой и фазой. Попробую, конечно, разобраться как это делается без кривых библиотек, но энтузиазм уже подугас.:(

@bort707, а на частотах 6...15 КГц работать будет? Мне ведь и перестройка частоты нужна. Правда, не во время работы.
 

poty

★★★★★★✩
19 Фев 2020
3,448
981
@Ягорка, будет. Собственно, и я, и @Bruzzer объясняли уже, что "переворот фазы" происходит исключительно при изменении OCR1B. Происходит это потому, что в условии формирования сигнала стоит TOGGLE. Если изменение происходит несинхронно с событием счётчика, то срабатывание в одном цикле таймера может происходить 0-2 раза (должно происходить один раз для корректной обработки TOGGLE).
Чтобы нормально синхронизировать все эти дела есть несколько подходов. Самый простой - сделать паузу в таймере и изменить его состояние в зависимости от текущего состояния, затем запустить. В принципе, будет небольшой однократный сбой на несколько микросекунд, что при изменении фазы всё равно произойдёт, только в немного меньшей степени.
Возможно использовать прерывания, но тут есть определённые заморочки - код нужно писать внимательно, чтобы не пропустить нужное прерывание (не запрещать прерывания на длительное время).
 

Ягорка

✩✩✩✩✩✩✩
21 Мар 2025
13
0
Фазу в этом коде можно будет двигать в реальном времени? Типа, как я на прошлой странице с библиотекой Гайвера делал: объявить фазу переменной, считать сигнал с потенциометра, перевести его в нужный диапазон и сложить одно с другим.

И где можно почитать про эти прескалеры и прочие ICR-OSR? Чтобы попроще языком?
 

bort707

★★★★★★✩
21 Сен 2020
3,168
934
эффект перекидывания фазы на 180 проявился и при изменении частоты.
Печально.
Видать, библиотека писалась в понедельник, а тестировалась в пятницу. Функция вроде бы есть, вроде бы работает, а пользоваться нельзя.
Как уже написал @poty, если вы пытаетесь менять регистры таймера, не останавливая счетчик - то результат может быть совсем не тот, что вы ожидали. И библиотека тут совершенно не при чем, об этом даже в даташите на контроллер говорится.

Если для вас эти искажения нежелательны - сбрасывайте таймер при каждом изменении.

Фазу в этом коде можно будет двигать в реальном времени?
С учетом того, что написано в абзаце выше - можно.

где можно почитать про эти прескалеры и прочие ICR-OSR?
в даташите. На английском.
Чтобы попроще языком?
не знаю, в сети наверняка есть переводы с пояснениями, ищите.
 

Ягорка

✩✩✩✩✩✩✩
21 Мар 2025
13
0
Ну, так я прописал в скетче частоту, прошил, получил фазу канала Б +90. Прописал другую частоту, прошил, получил фазу -90. Во время работы ничего не менял. Использовался тот простой пример из моего первого поста.
 

Ягорка

✩✩✩✩✩✩✩
21 Мар 2025
13
0
Ладно, я уже понял, что простого пути к моим хотелкам нет и нужно изучать всякое низкоуровневое программирование. Я, конечно, попытаюсь на досуге, но этот проект явно откладывается на когда-нибудь потом.
Продолжу паять чисто аналоговые устройства, в них я как-то больше соображаю.
Всем спасибо за внимание.