ШИИМ 10 БИТ пользовательский блока на Си

Пользовательские блоки ПИД регуляторов, прочих регуляторов и для работы с ШИМ выходами
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Слимпер
Майор
Сообщения: 1009
Зарегистрирован: 06.09.2015{, 16:56}
Репутация: 27
Откуда: Новосибирск

ШИИМ 10 БИТ пользовательский блока на Си

#1

Сообщение Слимпер » 07.07.2016{, 21:07}

Попалась мне на глаза интересная библиотека TimerOne, одна из функций возможность генерировать 10 Битный ШИМ с настраиваемым периодом.

Решил сделать блок:

Название :Блок ШИМ 10Бит

Разрядностью 10Бит (0-1023)
Период можно настраивать

Получилось два блока.
Описание:


PWM_CONST_(CODE)
СпойлерПоказать
Блок  ШИМ
Разрядностью 10Бит (0-1023)
Период можно настраивать
!!!!Возможны конфликты с блоками где используется Timer1 (из известных мне Rremote, Servo)

Входа
PWM_1, PWM_2, PWM_3 - задается скважность ШИМ в виде значений 0-1023

Параметры
period – Период ШИМ в микросекундах
меньше 100 лучше не ставить
Верхний предел 8388480 (8,4секунды)

pin_1, pin_2, pin_3 - номер пина соответствующего входам PWM_1, PWM_2, PWM_3
Если вход не используется, то надо выставлять 0.
Возможно использовать для следующих пинов
Arduino Uno          9, 10
Arduino Leonardo     9, 10, 11
Arduino Mega          11, 12, 13

encoder - Совместно сблоком Энкодер_С
Сделал для возможности использовать ШИМ, при примении  блока Энкодер_С, в этом режиме параметр period неиспользуется
Период ШИМ будет равен значению  period из блока Энкодер_С

! Блок Энкодер_С должен размещятся в проекте раньше Блок ШИМ
PWM_REG_(CODE)
СпойлерПоказать
Блок ШИМ
Разрядностью 10Бит (0-1023)
Период можно настраивать
!!!!Возможны конфликты с блоками где используется Timer1 (из известных мне Rremote, Servo)

Входа
PWM_1, PWM_2, PWM_3 - задается скважность ШИМ в виде значений 0-1023
period – Период ШИМ в микросекундах (если оставить пустым будет период 2000мкс)
Меньше 100 лучше не ставить (хотя это надо тестировать)
Верхний предел 8388480 (8,4секунды)

Параметры
pin_1, pin_2, pin_3 - номер пина соответствующего входам PWM_1, PWM_2, PWM_3
Если вход не используется, то надо выставлять 0.
Возможно использовать для следующих пинов
Arduino Uno              9, 10
Arduino Leonardo     9, 10, 11
Arduino Mega          11, 12, 13
Возможно использовать для следующих пинов
Arduino Uno                  9, 10
ArduinoLeonardo          9, 10, 11
ArduinoMega                11, 12, 13


!!!!Возможны конфликты с блоками где используется Timer1 (из известных мне Rremote, Servo)

Еще два блока полный аналог предыдущих, только используется Timer3 (есть только в ArduinoLeonardo ArduinoMega)

PWM_CONST_T3
PWM_REG_T3-CODE


Возможно использовать для следующих пинов
Arduino Leonardo     5
Arduino Mega            2, 3, 5


Если у кого есть осциллограф (и не лень),  проверти правильность работы и минимальной возможный период.

Обновление

Добавил второй вариант с заданием Периода через вход блока, т.е можно регулировать Период ШИМ по ходу выполнения программы.

Актуальные версии блоков находятся ШИМ 10 БИТ с изменяемым периодом 

Все вопросы и предложения в эту тему.
Последний раз редактировалось Слимпер 12.07.2016{, 04:38}, всего редактировалось 1 раз.

VNL64T
Рядовой
Сообщения: 37
Зарегистрирован: 22.01.2024{, 05:37}
Репутация: 3
Имя: Алекс

ШИИМ 10 БИТ пользовательский блока на Си

#41

Сообщение VNL64T » 28.01.2024{, 23:46}

В целом плохая идея, особенно AVR. При росте проекта начнутся прболемы.
Переходите на другие платформы.
На RP2040 на втором ядре совсем хорошо такие задумки получаются. Недавно для одной локальной задачи генерил необходимую последовательность с частотой 300кгц. ШИМ наверное с частотой 150-200кГц получится.
Полностью согласен... :smile37:
Но.. аппаратный шим тем и хорош что работает минуя основной код, т.е. если код основной программы не будет залезать в установки шим на каждом цикле он должен справится без проблем, и примеров тому масса.. например моргать диодом а параллельно выполнять основной код с другими задачами.. по сути получается что шим использует только прерывания таймера не касаясь основной программы..
Из этого следует что он может, а вот незнание предмета т.е. языка есть преграда..

Может заодно подскажите программу на простом внятнографическом чтобы Raspberry Pi программировать?
Спасибо..

ecoins
Полковник
Сообщения: 2921
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 453
Откуда: Шатура
Имя: Энвер

ШИИМ 10 БИТ пользовательский блока на Си

#42

Сообщение ecoins » 29.01.2024{, 04:18}

VNL64T писал(а):
28.01.2024{, 23:46}
Может заодно подскажите программу на простом внятнографическом чтобы Raspberry Pi программировать?
Спасибо..
Все тесты в теме "Экосреда ecoins" можно грузить в любой контроллер - ограничение только по памяти.

VNL64T
Рядовой
Сообщения: 37
Зарегистрирован: 22.01.2024{, 05:37}
Репутация: 3
Имя: Алекс

ШИИМ 10 БИТ пользовательский блока на Си

#43

Сообщение VNL64T » 29.01.2024{, 07:54}

ecoins писал(а):
29.01.2024{, 04:18}
Все тесты в теме "Экосреда ecoins" можно грузить в любой контроллер - ограничение только по памяти.
:smile37:

Если долго мучится? что-нибудь получится!
Шагами в любую сторону, градация и заполнения почти любые.. (тестировал на 50% заполнения..)
ATmega328p, 1 MHz просто для эксперимента (фронты чуть заваливает)

Для тех кто пойдет по моим стопам..
Редактирование блока- Параметры пользователя константа Pin_1 = изменяем значение по умолчанию на нужный (нам) ШИМ вывод (или убираем вовсе значение по умолчанию (там у автора ошибочная привязка к 9 пину..)
Далее в окне кода DeclareSelection изменяем строку на unsigned int P=0; (при заполнении 0 будет 0 )
все сохраняем..

Далее прежде чем сменить Период обязательно нужно блокировать Заполнение..
Т.е. на момент смены Периода Заполнение должно быть НОЛЬ!!! (Иначе не даст сменить Период)
После смены Периода с задержкой 5мс. возвращаем и Заполнение то что было или иное..


Всем спасибо.. особенно автору Блока!!! :yahoo:
Вижу что не сложный но в скобках весь попутался :fie:
Вложения
1MHz-1.bmp
1MHz-1.bmp (1.71 МБ) 104 просмотра
1MHz.bmp
1MHz.bmp (1.54 МБ) 110 просмотров
5Hz.bmp
5Hz.bmp (1.54 МБ) 110 просмотров
10Hz.bmp
10Hz.bmp (1.54 МБ) 110 просмотров
20Hz.bmp
20Hz.bmp (1.54 МБ) 110 просмотров
30Hz.bmp
30Hz.bmp (1.54 МБ) 110 просмотров
50Hz.bmp
50Hz.bmp (1.54 МБ) 110 просмотров
60Hz.bmp
60Hz.bmp (1.54 МБ) 110 просмотров

Ответить

Вернуться в «ПИД регуляторы (PID), блоки для ШИМ»