Помогите пожалуйста решить задачу для диплома

SemenU

✩✩✩✩✩✩✩
14 Сен 2022
5
0
Здравствуйте, на вашем сайте у вас есть тема прерывания по таймеру для ардуино 2560, и есть видео на ютуб в котором как раз ссылка на сайт, так в видео сказано что с помощью таймеров можно реализовать, смещение ШИМ по фазе между каналами, так вот как раз мне это и нужно.
Подключив библиотеку с таймерами, и настроив шим на двух таймерах, у меня получилось как то сдвинуть сигналы, но при этом изменяется частота, и не понятен закон изменения.Я не достаточно понимаю как это все работает, и как правильно реализовать сдвиг. Буду очень благодарен любому отклику.
1663166218823.png1663166078396.png
 

poty

★★★★★★✩
19 Фев 2020
1,999
607
analogWrite и меняет скважность импульсов, что задали, то и получили.
 

SemenU

✩✩✩✩✩✩✩
14 Сен 2022
5
0
@poty, в данном случае это не важно, хотя скважность выставлена одинаковы и если убрать Timer3.phaseShift(CHANNEL_A, 120); и Timer4.enableISR(); то график получается нормальный, вопрос в том как правильно смещать ШИМ по фазе один относительно другого1663170390487.png
 

rkit

★★✩✩✩✩✩
5 Фев 2021
251
71
Между двумя каналами одного таймера - никак. Они сидят на одном таймере, с одним регистром сравнения на канал.
 

poty

★★★★★★✩
19 Фев 2020
1,999
607
@SemenU, в примерах есть генерация трехфазного сигнала, она не зря сделана именно так. @rkit уже подсказал направление: для переменного сдвига нужно использовать несколько таймеров.
Менять фазу так просто не получится. Нет, в библиотеке команды, конечно, имеются, только если это нужно делать в динамике, то появятся переходные артефакты. Универсально - использовать регистры напрямую. Возможно, для задачи не важно, что будет период неопределенности, но задачу Вы не обозначили.
 

SemenU

✩✩✩✩✩✩✩
14 Сен 2022
5
0
@poty, я и делаю между двумя таймерами,это я понял(просто написал не корректно, имея ввиду каналы на графике) задача сделать сдвиг по фазе между ШИМ генерируемый разными таймерами, при чем сдвиг надо сделать предсказуемый и без изменений параметров сигнала ШИМ, нужно это для управления направления диаграммы направленности ФАР.

@poty, вот хотелось бы узнать какие регистры следует подключить и какой режим выбрать
 

rkit

★★✩✩✩✩✩
5 Фев 2021
251
71
Стартуй два таймера сихнронно и подкручивай период одного для сдвига.
 

rkit

★★✩✩✩✩✩
5 Фев 2021
251
71
Даташит читай. Ничего не сделаешь без понимания аппаратного уровня.
 

Геннадий П

★★★★★✩✩
14 Апр 2021
1,023
333
42
Если частота не нужна высокая, то программно по таймеру с прерыванием это делается довольно легко.
 

poty

★★★★★★✩
19 Фев 2020
1,999
607

@Геннадий П, да ну зачем здесь прерывания?

@SemenU, есть статья здесь, у Гайвера, есть куча материалов в Интернете как настраивать таймеры для получения того или иного эффекта. Команды как таковой нет, если мы имеем необходимость именно ШИМ и корректировку фазы. В целом это сильно зависит от процессора.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
1,766
718
56
Марий-Эл
Здесь нужно представлять, для чего это вообще нужно.
Если управлять трёхфазным двигателем, это одно.
Если только получить сдвинутые сигналы на определённую фазу, это другое.
 

poty

★★★★★★✩
19 Фев 2020
1,999
607
Сколько таймеров, столько сигналов можно реализовать. У 2560 - 6 таймеров, вполне можно развернуться. Возможно, на STM есть библиотека для работы с таймерами, поэтому там проще с ними управляться, но на Atmel вполне себе неплохие возможности и таймеры также работают независимо от процессора.
 

poty

★★★★★★✩
19 Фев 2020
1,999
607
Для двух каналов + ШИМ нужно два двухканальных таймера. Для двух каналов без ШИМ, в зависимости от требований, можно обойтись и одним. (для Атмега)
Мне кажется, что ТС путает ШИМ с простыми импульсами.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
1,766
718
56
Марий-Эл
Ему нужен сдвиг фаз.
Каналы не умеют делать сдвиг фаз. У атмеги.
Если я не путаю.
TMS какие то умеют.
Я делал задающий генератор для 3х фазного двигателя. Там всё интересно. И ШИМ обязательно нужен.

Только зря мы распинаемся тут. Автор слился.
 

poty

★★★★★★✩
19 Фев 2020
1,999
607
Сдвиг фаз на меандре с 50% заполнением в Атмеге делается просто, на одном таймере: Fast PWM Mode, toggle оба пина OC, разница пороговых регистров OCRnA и B будет определять сдвиг фаз.
Гораздо интереснее задача с заданной длительностью импульсов (тот самый ШИМ). Да, в Атмега нельзя применить два пороговых регистра к одному пину, но можно использовать два выходных пина и формировать выходной сигнал с помощью логических операций. Первый выход будет отвечать за фронты, второй - за срезы импульсов. Если вдруг нельзя чего-то добавлять схематически, то можно воспользоваться способом @Геннадий П, один канал будут выставлять фронт, другой - генерировать прерывание, в котором будет устанавливаться срез. Думаю, прокатит даже на 18кГц, если чего-то серьёзного выполнять больше не планируется.