Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Как сгладить ШИМ выход на нагрузке ?

Вс июн 26, 2022 04:26:45

с ардуино снимаю шим на освещение свотодиодами
в самом начале когда он медленно загорается оно происходит ступенчато пимерно раз в секунду
далее как становится по ярче эфект пропдает видимо из за невозможности сфокусировать глаз на ярком предмете

если я куплю большой конденсатор и поставлю паралельно нагрузке насколько это поможет сгладить ступеньки на яркости ?
и какой ёмкости покупать ?
как её выщитать ?

Re: Как сгладить ШИМ выход на нагрузке ?

Вс июн 26, 2022 08:06:10

А сколько этих ваших ступенек?
Есть нелинейность восприятия ступенек яркости. На малой яркости увеличение на одну ступень заметнее, чем на большой яркости. Нужно увеличить число ступенек на малой яркости и уменьшить на большой. То есть, если у вас есть например 5 ступенек в процентах: 20%, 40, 60, 80, 100. А нужно сделать вот так: 5, 10, 15, 20, 30, 40, 60, 80, 100.
Визуально разница между 5% и 10% гораздо заметнее, чем разница между 95% и 100% ШИМ.
Большой конденсатор ничего толкового не даст.

Re: Как сгладить ШИМ выход на нагрузке ?

Вс июн 26, 2022 08:27:04

если по вашему методу то нужно построить параболу из люменов и проицировать на неё время и выдавать конктретный шим в этой точке времени

что бы её построить на ум пока приходит взять фоторезистор и прикрпить его в плотную к светодиоду и снять показания относитеьно шима к ацп
и построить из этих точек нелинйное маштабирование

Re: Как сгладить ШИМ выход на нагрузке ?

Вс июн 26, 2022 10:00:43

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

Arduino LED Fader
https://www.electroschematics.com/arduino-led/

Re: Как сгладить ШИМ выход на нагрузке ?

Вс июн 26, 2022 15:05:26

а ШИМ там сколько бит?
если 8, то сглаживай-не сглаживай, при малых яркостях будут видны явные градации.
выход - или применять 16 бит ШИМ,
или если таймер больше ни чем не занят, переходить на регулировку яркости на низах изменением периода ШИМ 8 битного генератора (не знаю только, возможно ли это средствами ардуины)
(недостаток первого хетода - аппаратное ограничение -нужен свободный 16 бит таймер, и относительно низкая частота,
недостаток второго - сложное управление, нестабильная частота ШИМ сигнала)

Re: Как сгладить ШИМ выход на нагрузке ?

Вс июн 26, 2022 15:59:54

Стас38,
Сглаживают вообще-то напряжение пульсаций. А напряжение шим оно довольно ровное такое, поэтому конденсатор там ничего особо не даст, так что не тратьте деньги на бесполезную покупку, а ищите решение.

Re: Как сгладить ШИМ выход на нагрузке ?

Вс июн 26, 2022 17:18:15

библиотека TimerOne

Используйте примерной код (напр. FanSpeed), поменяйте строки и заработает (1024 шагов, 25 kHz).
Запускал тестово за вентиляторa.

Re: Как сгладить ШИМ выход на нагрузке ?

Вс июн 26, 2022 19:44:18

у меня 8 бит
шим на выходу я увличиваю равномерно по формуле время/шим
к примеру берём 60 сек / 255 = 235 мс
тоесть я должен получать примерно 4 шага в сек
но на деле даже если смотреть на осцылограф то там длина импульса увеличивается очень странно примерно раз в сек вместо 4 раз в сек
как будто он сначала накпливает 4 шага а потом на выход выкидывает результат

попробовал вместо постоянного времени на шаг задать 50мс на постоянку генератором и в начале шим набирается быстрее 50 мс/шаг и постепенно начинает пропускать импульсы доганяясь под конец остатками шима

плавнее стало но быстрый старт присутствует вместо медленного разгорания собственно это и ожидаемо было
в принципи пойдёт

Re: Как сгладить ШИМ выход на нагрузке ?

Вс июн 26, 2022 20:14:26

какой контроллер? какой таймер задействован? ну, и... код в студию!

Re: Как сгладить ШИМ выход на нагрузке ?

Вт июн 28, 2022 15:20:14

нано

Код:
//Подключаем библиотеку
#include <GyverPWM.h>
struct _poligonInexes
{
    int minIndex;
    int maxIndex;
}
;
int _Poligon_InArray_1[6] = {0, 300, 900, 2000, 4000, 6000};
int _Poligon_OutArray_1[6] = {0, 90, 150, 190, 230, 255};
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _count1I = 0;
int _count1_Value = 0;
bool _bounseInputD12S = 0;
bool _bounseInputD12O = 0;
unsigned long _bounseInputD12P = 0UL;
void setup()
{
    pinMode(3, OUTPUT);
    pinMode(12, INPUT_PULLUP);
    _bounseInputD12O =  digitalRead(12);
}
void loop()
{
    bool  _bounceInputTmpD12 =  (digitalRead (12));
    if (_bounseInputD12S)
    {
        if (millis() >= (_bounseInputD12P + 40))
        {
            _bounseInputD12O= _bounceInputTmpD12;
            _bounseInputD12S=0;
        }
    }
    else
    {
        if (_bounceInputTmpD12 != _bounseInputD12O)
        {
            _bounseInputD12S=1;
            _bounseInputD12P = millis();
        }
    }
    //Плата:1
    if (!(0))
    {
         if (! _gen1I)
        {
            _gen1I = 1;
            _gen1O = 1;
            _gen1P = millis();
        }
    }
     else
    {
        _gen1I = 0 ;
        _gen1O= 0;
    }
    if (_gen1I)
    {
          if (_isTimer (_gen1P , 25))
        {
             _gen1P = millis();
            _gen1O = ! _gen1O;
        }
    }
    if (!(_bounseInputD12O))
    {
         if (_trgrt1I)
        {
             _trgrt1 = 0;
        }
         else
        {
            _trgrt1 = 1;
            _trgrt1I = 1;
        }
    }
     else
    {
        _trgrt1 = 0;
        _trgrt1I = 0;
    }
    ;
    if (_gen1O)
    {
        if (! _count1I)
        {
            _count1I = 1;
            if (!(_bounseInputD12O))
            {
                if(_count1_Value < 1200)
                {
                    _count1_Value = _count1_Value + 1;
                }
            }
             else
            {
                 if(_count1_Value > 0)
                {
                    _count1_Value = _count1_Value - 1;
                }
            }
        }
    }
     else
    {
        _count1I = 0;
    }
    if ((_trgrt1))
    {
//Устанавливаем на пине  частоту  в режиме 0
        PWM_frequency(3, (2000L), 0);
    }
    //изменить заполнение на пине
    PWM_set (3, ((_poligon((_count1_Value), _Poligon_InArray_1, _Poligon_OutArray_1, 6))));
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
    unsigned long currentTime;
    currentTime = millis();
    if (currentTime>= startTime)
    {
        return (currentTime>=(startTime + period));
    }
     else
    {
        return (currentTime >=(4294967295-startTime+period));
    }
}
int _poligon(int value, int intArray[], int outArray[], int arraySize)
{
    struct  _poligonInexes indexes;
    indexes = _getPoligonIndexes(value, intArray, arraySize);
    return map(value, intArray[indexes.minIndex], intArray[indexes.maxIndex], outArray[indexes.minIndex], outArray[indexes.maxIndex]);
}
struct  _poligonInexes _getPoligonIndexes(int value, int array[], int arraySize)
{
    struct  _poligonInexes result;
    int i;
    result.minIndex = 0;
    result.maxIndex = 0;
    for (i = 0; i < arraySize; i++)
    {
        if (array [result.minIndex] > array[i])
        {
            result.minIndex = i;
        }
        if (array [result.maxIndex] < array[i])
        {
            result.maxIndex = i;
        }
    }
    for (i = 0; i < arraySize; i++)
    {
        if ((array [i] >= value) && (array [result.maxIndex] > array[i]))
        {
            result.maxIndex = i;
        }
    }
    if (result.maxIndex==0)
    {
        result.minIndex = 0;
        result.maxIndex=1;
    }
     else
    {
         result.minIndex = result.maxIndex -1;
    }
    return result;
    return result;
}

Re: Как сгладить ШИМ выход на нагрузке ?

Вт июн 28, 2022 18:41:32

Стас38, такую длинную "портянку" нужно прятать под спойлер.
а почему строку
return result;
ты повторил всего 2 раза, а не 8 раз?

Re: Как сгладить ШИМ выход на нагрузке ?

Ср июн 29, 2022 06:40:58

Параллельно светодиодам конденсаторы нельзя ставить

Re: Как сгладить ШИМ выход на нагрузке ?

Ср июн 29, 2022 09:48:35

Нужно не величину шага менять, а время когда шаг, равный 1, изменится.
Последний раз редактировалось korsaj Ср июн 29, 2022 13:45:29, всего редактировалось 1 раз.

Re: Как сгладить ШИМ выход на нагрузке ?

Ср июн 29, 2022 10:09:45

Там дело не в интервале времени, а в интервале шагов. Они неравномерно влияют на видимую яркость.
Ответить