Страница 2 из 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 БИТ пользовательский блока на Си

Добавлено: 06.10.2017{, 09:20}
SVS55
Слимпер, Не могли бы Вы немного добавить входов выходов в  :Блок ШИМ 10Бит, PWM REG T1, а точнее вход для включения и выключения ШИМ и выход интеджер

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

Добавлено: 06.10.2017{, 13:39}
Слимпер
SVS55 писал(а):Слимпер, Не могли бы Вы немного добавить входов выходов в  :Блок ШИМ 10Бит, PWM REG T1, а точнее вход для включения и выключения ШИМ и выход интеджер
А зачем входы выключения, подайте вход  PWM_1 0 и не будет импульсов.
Про выход не понял.

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

Добавлено: 06.10.2017{, 15:06}
SVS55
av, Я вчера пробовал с ним разобраться частота доходила до 4 кГц

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

Добавлено: 06.10.2017{, 15:24}
SVS55
av, В нагрузке ШИМ ничего пока нет кроме осцила. при значении в периоде 50 выдает 20кГц

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

Добавлено: 06.10.2017{, 15:47}
SVS55
период 40 - частота - 25кГц  скважность 50% 512
период 30 - частота - 33кГц
период 20 - частота - 50кГц
период 10 - частота - 100кГц
период  5  - частота - 200кГц
период  1  - частота -  1мГц

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

Добавлено: 06.10.2017{, 16:02}
SVS55
Сейчас повесил нагрузку НСМ -? пищалку пищит естественно при изменении периода. осцилки смотрю Hantek DSO5202P

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

Добавлено: 06.10.2017{, 16:13}
SVS55
av, Автор рекомендует ниже 100 период не опускать  (хотя это надо тестировать)

Добавлено (06.10.2017, 16:13)
---------------------------------------------
av писал(а):Слимпер   с какой максимальной частотой ШИМ может работать данный блок ?
я проверил частоту.

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

Добавлено: 06.10.2017{, 16:26}
Слимпер
av писал(а):Уважаемый Слимпер  могли бы вы ткнуть носом в указанный блок "Энкодер_С". Поиск по сайту результатов не дал. Заранее благодарен.
Когда то выкладывал. Вот  еще раз ссылка

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

Добавлено: 12.02.2018{, 20:45}
ElectroMechaniC
Перезалейте блок с настраиваемым периодом пожалуйста! Страница для скачивания не доступна

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

Добавлено: 22.02.2018{, 01:54}
prmres

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

Добавлено: 22.02.2018{, 08:28}
Ivan_Kornege
Актуальные версии блоков находятся ШИМ 10 БИТ с изменяемым периодом
Ссылка Рабочая. Модераторы поправили. (модератор :wizard: )

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

Добавлено: 23.07.2020{, 15:20}
Di123
в описании сказано что если выход неиспользуется допустим на нано я взял пвм1 - 9 а на остальные два поставил 0
то 10 вывод мне нельзя уже использовать ?
или для простейших целей можно допустим выключатель поставить на него ?

Отправлено спустя 5 минут 35 секунд:
и не понятно
два шима одновременно можно использовать ?

допустим на нано 9 и 10

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

Добавлено: 27.08.2020{, 14:10}
Di123
можете написать блок шим на втором таймере ?
3 и 11
интересует исключительно возможность выставлять самому частоту в данном случае 1 гц

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

Добавлено: 19.11.2020{, 07:42}
Di123
ваш блок а именно PWM_CONST_T1 не настраивается в версии 7,1,1 тоесть он ничего не сохраняет из периода
помогает только если в версии 6,3,1 выставить в вашем блоке нужные настройки и скопировать блок в версию 7,1,1 тогда настройки он перетаскивает с собой

как вариант лечение проблемы

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

Добавлено: 19.11.2020{, 08:25}
RedSky
Di123 писал(а):
19.11.2020{, 07:42}
не настраивается в версии 7,1,1
Когда меняете значение нужно Enter нажать, не нужно в 6й версии менять. А вот отредактировать может не получится - редактор не даёт функцию вставить.

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

Добавлено: 19.11.2020{, 08:39}
Di123
действительно
а я галочку подтвердить нажимал
видимо косяк 7 версии раз галочка не работает

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

Добавлено: 22.07.2022{, 23:05}
Sergey1982
Блок ШИМ 10Бит. Подскажите доступным языком пожалуйста для новичков как этот блок работает и как настроить на нем выход .

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

Добавлено: 24.01.2024{, 00:11}
VNL64T
Привет. к сожалению никак не работает..
Компилируется загружается в МК и тишина..(пробовал по разному)
Выходы не задействуются, к сожалению..
PWM1 Насмерть привязан к 9му пину..(по умолчанию.. не сложно исправить)

Код: Выделить всё

#include "flprogUtilites.h"
#include <TimerOne.h>
unsigned long period_75068646_1;
int PWM_1_75068646_1;
int PWM_2_75068646_1;
int PWM_3_75068646_1;
boolean flag_75068646_1= false;
unsigned int P_75068646_1=2000;
int S1_75068646_1=0;
int S2_75068646_1=0;
int S3_75068646_1=0;
void setup()
{
    Timer1.initialize(); // инициализировать timer1
    Timer1.setPeriod(P_75068646_1);
    if(9!=0)
    {
          	Timer1.pwm(9 , 0); // задать шим сигнал на выводе pin, коэффициент заполнения 0%
    }
    if(0!=0)
    {
          	Timer1.pwm(0 , 0); // задать шим сигнал на выводе pin, коэффициент заполнения 0%
    }
    if(0!=0)
    {
          	Timer1.pwm(0 , 0); // задать шим сигнал на выводе pin, коэффициент заполнения 0%
    }
}
void loop()
{
    //Плата:1
    period_75068646_1 = 0;
    PWM_1_75068646_1 = 0;
    PWM_2_75068646_1 = 0;
    PWM_3_75068646_1 = 0;
    if ((period_75068646_1!=P_75068646_1)&&(period_75068646_1>0))
    {
        	Timer1.setPeriod(period_75068646_1);
        	flag_75068646_1 = true;
    }
    if(9!=0)
    {
        	if(PWM_1_75068646_1!= S1_75068646_1||flag_75068646_1==true)
        {
            Timer1.setPwmDuty(9 ,  PWM_1_75068646_1);
        }
    }
    if(0!=0)
    {
        	if(PWM_2_75068646_1!= S2_75068646_1 ||flag_75068646_1==true)
        {
            Timer1.setPwmDuty(0 ,  PWM_2_75068646_1);
        }
    }
    if(0!=0)
    {
        	if(PWM_3_75068646_1!= S3_75068646_1 ||flag_75068646_1==true)
        {
            Timer1.setPwmDuty(0 ,  PWM_3_75068646_1);
        }
    }
    S1_75068646_1= PWM_1_75068646_1;
    S2_75068646_1= PWM_2_75068646_1;
    S3_75068646_1= PWM_3_75068646_1;
    if (period_75068646_1>0)
    {
        P_75068646_1=period_75068646_1;
    }
}
Отправлено спустя 10 минут 17 секунд:
Слимпер, Добрый вечер..

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

Добавлено: 28.01.2024{, 14:07}
VNL64T
Запустил.,на 328p. работает..
Что интересно как самостоятельный блок т.е. без управления из программы а с прописанными константами, на выходе довольно точно соблюдается период и заполнение, при попытке управления из схемы вся точность улетучивается..

Отправлено спустя 2 минуты 49 секунд:
А и сильно мешает что при указании период 0 по умолчанию 2000.., решается сбросом в 0 заполнения но лишний блок на схеме если требуется работа с фиксированной константой заполнения..

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

Добавлено: 28.01.2024{, 21:09}
ecoins
VNL64T писал(а):
28.01.2024{, 14:10}
Запустил.,на 328p. работает..
Что интересно как самостоятельный блок т.е. без управления из программы а с прописанными константами, на выходе довольно точно соблюдается период и заполнение, при попытке управления из схемы вся точность улетучивается..

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