шим

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

доброго времени, может кто подсказать как управлять шим по схеме если 5в то шим =0, если 0в то шим =255. и еще момент при напряжении на потенциометре 1в на шим должно приходить значение 100

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Как исходные данные получаете? analogRead()? Да в любом случае - смотрите в сторону встроенной функции map - она отображает один диапазон на другой. Дальше, думаю, разберётесь.

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

спасибо буду пробывать .

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ШИМ не может реагировать ступенями: проблема в Вашем коде или способе подключения.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

andriano пишет:

ШИМ не может реагировать ступенями: проблема в Вашем коде или способе подключения.

Может если ТС переводит из широкой школы в узкую. Согласен с Вами проблемма в коде. Чтобы небыло ступеней нужен ФНЧ, но тогда инерционность будет. Поясню - надо взять допустим 2 части нового значения с ацп и 3 прошлого, и их сумму разделить на 5. (както так), меняя отношение частей можно менять скорость реакции (инерции).

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

добрый день . с проблемой скачков разобрался хватило rc фильтра . теперь пытаюсь разобратся со следующей задачей, оказалось что изменить шим с (255,0) на(165,0) мне не достаточно .получилось то что нужно в начале и конце . нужно еще както установить промеж уточные значения шим , например:
если напряжение на входе 1в то на шим должно быть 2.4в ,
если на входе 2в то на шим 1.8. и так далее .
тоесть нужно составить таблицу подскажите пожалуйста куда копать

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

yrik8407, Вы сами понимаете, что Вам нужно?

В стартовом сообщении Вы пишете, что при 1в должно быть 100, а в 6-м - что 2.4.

Так что если "куда копать" - то копать в сторону составления внятной формулировки (желательно по-русски), что именно Вам нужно.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

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

http://arduino.ru/forum/apparatnye-voprosy/ochen-plavnoe-regulirovanie-s...

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

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

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

я нашел готовое решение на просторах интернета то что примерно мне надо
http://www.primera-club.ru/f/elektronika/62778-preobrazovatel-vq-tablic-...

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

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

yrik8407
yrik8407 аватар
Offline
Зарегистрирован: 08.03.2016

вот код:

[code]
const int PWM_PIN = 3;
const int AIN_PIN = 0;
long VQin[64] = {
271, 
271, 
271, 
271, 
271, 
275, 
297, 
337,
396, 
475, 
575, 
695, 
837, 
1002, 
1190, 
1402, 
1639, 
1901, 
2190, 
2506, 
2850, 
3224, 
3628, 
4063, 
4530, 
5030, 
5565, 
6135, 
6741, 
7385, 
8068, 
8790, 
9554, 
10360, 
11209, 
12104, 
13045, 
14087, 
15169, 
16308, 
17507, 
18766, 
20087, 
21473, 
22925, 
24444, 
26034, 
27695, 
29429, 
31238, 
33125, 
35090, 
37136, 
39265, 
41479, 
43779, 
46168, 
48647, 
51219, 
53885, 
56648, 
59509, 
62471, 
65535
};

long VQout[64] = {
36, 
36, 
36, 
36, 
36, 
36, 
132, 
232, 
338, 
453, 
578, 
718, 
873, 
1047, 
1241, 
1457, 
1699, 
1967, 
2265, 
2581, 
2892, 
3234, 
3611, 
4028, 
4484, 
4980, 
5513, 
6079, 
6674, 
7290, 
7919, 
8550, 
9338, 
10171, 
11057, 
11996, 
12991, 
14043, 
15153, 
16323, 
17554, 
18848, 
20205, 
21628, 
23118, 
24675, 
26301, 
27998, 
29766, 
31606, 
33520, 
35509, 
37573, 
39714, 
41933, 
44230, 
46606, 
49063, 
51601, 
54221, 
56924, 
59710, 
62580, 
65535
};

void setup()  
{ 
  TCCR2B = TCCR2B & 0b11111000 | 0x02;
} 

void loop()  
{
    const int VPWR = 5030;
    const int MAXV = 5120;
    const int MINV = 80;
    int inVoltage = map(analogRead(AIN_PIN), 0, 1023, 0, VPWR);
    int outVoltage = 0;
    long inQ = 0;
    int adrL = constrain(map(inVoltage, MINV, MAXV, 0, 63), 0, 63);
    int adrH = adrL + 1;
    int voltageValueL = map(adrL, 0, 63, MINV, MAXV);
    int voltageValueH = map(adrH, 0, 63, MINV, MAXV);
    int diff = voltageValueH - voltageValueL;
    float k = (float)(inVoltage - voltageValueL) / (float)diff;
    float valL = 0.0;
    float valH = 0.0;
    
    if (inVoltage < MINV)
    {
      inQ = VQin[0];
    }
    else if (adrL < 63)
    {
       valL = VQin[adrL];
       valH = VQin[adrH];
       inQ = valL + ((valH - valL) * k);
       
    }
    else
    {
      inQ = VQin[63];
    }
     
    for (long i = 0; i < 64; i++)
    {
        int outVolL = 0;
        int outVolH = 0;
        long QvalL, QvalH, d;

        if (VQout[i] > inQ)
        {
            if (i > 0)
            {
                outVolH = map(i, 0, 63, MINV, MAXV);
                outVolL = map(i - 1, 0, 63, MINV, MAXV);
                QvalH = VQout[i];
                QvalL = VQout[i - 1];
                d = QvalH - QvalL;
                k = (float)(inQ - QvalL) / (float)d;
                outVoltage = (outVolL + ((outVolH - outVolL) * k));
            }
            else
            {
                outVoltage = MINV;
            }
    
            break;
        }
    }
      
    analogWrite(PWM_PIN, constrain(map(outVoltage, 0, VPWR, 0, 255), 0, 255));
}
[/code]