Страница 1 из 3

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

Добавлено: 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 БИТ с изменяемым периодом 

Все вопросы и предложения в эту тему.

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

Добавлено: 08.07.2016{, 04:02}
DerAlex
Выхода можно любые использовать?

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

Добавлено: 08.07.2016{, 04:34}
Слимпер
DerAlex писал(а):Выхода можно любые использовать?
 
Слимпер писал(а):Возможно использовать для следующих пинов
Arduino Uno                  9, 10
Arduino Leonardo          9, 10, 11
Arduino Mega                11, 12, 13
Есть еще одна Библиотека TimerThree она задействует Timer3 ( есть Leonardo, Mega )
Если сделать блок на этой библиотеки то можно будет задействовать ШИМ на пинах:

Arduino Leonardo     5
Arduino Mega          2, 3, 5

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

Добавлено: 08.07.2016{, 05:26}
DerAlex
Период ШИМ общий для всех каналов ?Или можно для каждого канала отдельно выставить ?

Добавлено (08.07.2016, 05:26)
---------------------------------------------
Нужный блок , прямо скажем. А то вот как пришлось извращаться. Посмотрите тему =ПАДЕНИЕ ЧАСТОТЫ ГЕНЕРАТОРА=

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

Добавлено: 08.07.2016{, 06:24}
Слимпер
DerAlex писал(а):Период ШИМ общий для всех каналов ?Или можно для каждого канала отдельно выставить ?
В описании библиотек прямо не сказано, но эксперименты показали что общий.

Но если сделать еще один блок на базе TimerThree  Timer3 ( есть Leonardo, Mega ) то можно будет сделать два независимых периода.
DerAlex писал(а):Нужный блок , прямо скажем. А то вот как пришлось извращаться. Посмотрите тему =ПАДЕНИЕ ЧАСТОТЫ ГЕНЕРАТОРА=
Кстати сейчас Период ШИМ настраивается один раз в параметрах  блока.
Надо будет вечером попробовать сделать вариант с с настройкой через вход.

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

Добавлено: 08.07.2016{, 18:56}
Слимпер
Слимпер писал(а):Кстати сейчас Период ШИМ настраивается один раз в параметрах  блока.Надо будет вечером попробовать сделать вариант с с настройкой через вход.
Сделал Вариант с заданием Периода по входу. То есть можно изменять во время работы программы.  Смотреть в первом сообщении

П.С. У кого есть возможность просьба протестировать правильность работы.

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

Добавлено: 08.07.2016{, 19:04}
CraCk
Нубский вопрос. А зачем ето нужно?

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

Добавлено: 08.07.2016{, 19:33}
Слимпер
CraCk писал(а):Нубский вопрос. А зачем ето нужно?
Если вы про измени периода шим. Ну выше уже упоминали тему ПАДЕНИЕ ЧАСТОТЫ ГЕНЕРАТОРА, в ней как раз обсуждали подобную задачу.

А вообще стандартная частота ШИМ Arduino  500ГЦ, что далеко не всегда подходит.
Сам пробовал раньше регулировать обороты Компьютерного вентилятора 12В, регулировалось но вентилятор при этом пел (издавал противные звуки), по этому отказался от этой затеи.
А вот сейчас можно будет поднять частоту скажем до 5кГц, и думаю писка не будет.

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

Добавлено: 08.07.2016{, 19:47}
DerAlex
В теме ПАДЕНИЕ ЧАСТОТЫ ГЕНЕРАТОРА обсуждалась работа генератора в приборе проверки форсунок для автомобиля.Там как раз требовался генератор с независимой перестройкой частоты и скважности.

Добавлено (08.07.2016, 19:47)
---------------------------------------------
Без блока предложенного Слимпер, пришлось городить огород.
Использовалось два блока, блок генератора ,скоростной счетчик в режиме задержки и еще внешний триггер RS.Сейчас это возможно без излишних выкрутасов.

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

Добавлено: 08.07.2016{, 21:02}
CraCk
СПС за ответы. А уменьшать можно?

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

Добавлено: 08.07.2016{, 21:13}
Слимпер
CraCk писал(а):СПС за ответы. А уменьшать можно?
Период ШИМ можно регулировать в пределах от 100мкс (может и меньше) до 8.38с
Если я не путаю с переводами, Частота получается от 10кГц до 0.12Гц

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

Добавлено: 10.07.2016{, 07:20}
DerAlex

Программа генератора с использованием блока ШИМ.

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

Добавлено: 10.07.2016{, 07:29}
DerAlex

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

Добавлено: 10.07.2016{, 09:17}
Слимпер
DerAlex писал(а):Программа генератора с использованием блока ШИМ.
А осциллографом не проверяли, ШИМ правильный получатся? А то у меня нечем проверить .

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

Добавлено: 11.07.2016{, 07:29}
DerAlex
Пока не проверял.

Добавлено (11.07.2016, 07:29)
---------------------------------------------
На слух заметно, что только в крайнем положении движка переменного резистора СКВАЖНОСТЬ наиболее сильное изменение звучания.Вечером подключу осциллограф . погляжу в чем дело.

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

Добавлено: 11.07.2016{, 14:05}
Электронщик
Слимпер писал(а):Если у кого есть осциллограф (и не лень),  проверти правильность работы и минимальной возможный период.
Слимпер, Вы гений! 
Было действительно лень, но попытался проверить этот блок и о чудо, он заработал!
Слимпер! писал(а):PWM_REG-CODE-.ubi(97Kb)
 Числа 5, 10, 25, 50, 100 и 200 подтверждаю, периоду в микросекундах соответствуют. Абсолютная погрешность менее 0,1 мкс.
Скважность равна 50% при числе 512.
Надо дальше поисследовать.
Мега 2560.

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

Добавлено: 11.07.2016{, 16:23}
Слимпер
Электронщик писал(а):Слимпер, Вы гений!
  Спасибо на добром слове, но я просто сделал блок на базе уже готовой библиотеке.

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

PWM_CONST_T3
PWM_REG_T3-CODE


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


Ссылки в первом сообщении

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

Добавлено: 11.07.2016{, 17:22}
rw6cm
Слимпер, Если не секрет, как вам удается редактировать свое первое сообщение в теме?

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

Добавлено: 11.07.2016{, 19:15}
Слимпер
rw6cm писал(а):Слимпер, Если не секрет, как вам удается редактировать свое первое сообщение в теме?
А я сам не знаю, почему здесь пока получается, а других нет, то ли еще время не вышло с момента последнего редактирования (я его уже несколько раз правил).
А вообще то, надо наверное попросить по работе сайта, предложить возможность автору темы дать возможность редактировать перовое сообщение.

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

Добавлено: 12.07.2016{, 16:11}
Электронщик
Период установил 5 мкс.
С входа PWM_1 на 11 ногу таймера вывел ШИМ= 512.
С входа PWM_2 на 12 ногу вывел ШИМ= 100.
Хотел посмотреть на положение фронтов двух сигналов относительно друг друга.
Картинку привести не могу, лень перетаскивать с осц-фа, но картина странная. Фронты импульсов не совпадают, ни какие. не понятно как таймер формирует эти импульсы.
Импульс ШИМ= 100 находится посередине импульса ШИМ= 512.
Поменял значение 512 на 1000, импульс ШИМ= 100 стоит посередине 1000-ного.
Поменял период с 5 на 100, картина не изменилась.
Задействовал дополнительно вход PWM_3 на 13 ногу и вывел ШИМ= 100.
Импульсы на 12 и 13 ногах совпадают полностью.
Поменял на входе PWM_3  ШИМ с 100 на 200, импульс ШИМ 100 расположился внутри интервала импульс ШИМ 200.
Т.о., импульсы с входов PWM_2 и PWM_3 располагаются посередине импульса с входа PWM_1.
Работает следующее правило: импульсы ШИМ располагаются симметрично относительно общей точки на оси времени, расположенной посередине длительности импульса, задаваемой  по входу PWM_1 .
Было интересно, как можно использовать Ардуину в среде FLProg для реализации импульсных многофазных приложений, пока не понятно.