Что сейчас я имею...
Даю команду в формате M1YY, где YY - скорость движения машины и бит 7 задаёт направление.
Команда P1YY, где YY скорость поворота и бит 7 задаёт направление поворота.
При получении команды M1 я записываю в буфер команд скорость YY обоим двигателям.
Если пришла команда поворота, то если бит 7=1 вычитаю скорость поворота из скорости левого двигателя и бит 7 = 0, то вычитаю для правого.
Как это выглядит в реальности ?!
Во первых, на малых скоростях очень низкая реакция из-за редкого обновления переменной скорости.
Двигатели крутятся не синхронно из-за этого машинку клонит то в лево то в право.
Сами колёса крутятся не очень стабильно иногда ускоряясь или затормаживаясь, думаю это энкодер выдаёт не правильные значения.
Добавлено спустя 17 минут 10 секунд:=DeaD= писал(а):нагромождение IF-ов к ПИД-регулятору
Предлагаю, чтоб облегчить участь мою, спрашивать к чему очередная лесенка IF-ов, а я её буду описывать, а вы советовать вариант её корректировки ?
IF-ы эти возникли для улучшения некоторых участков работы регулятора.
Например лесенка из 3 вложений IF-ов
- Код: Выделить всё • Развернуть
if( ( motstat[ i ].speedcur - motstat[ i ].speed ) < 4 || r > 0x62 ) *motstat[ i ].reg = r + 1;
else if( ( motstat[ i ].speedcur - motstat[ i ].speed ) < 15 || r > 0x60 ) *motstat[ i ].reg = r + 2;
else *motstat[ i ].reg = r + 4;
Сделал для более быстрого разгона, разделив на 3 ступеньки разницу в скорости между требуемой скоростью и текущей.
Например, если разница в скорости меньше 4( motstat[ i ].speedcur - motstat[ i ].speed ), то ШИМ изменяем только на 1(*motstat[ i ].reg = r + 1).
Или, к примеру, скидывание флага для запуска регулятора с паузой:
- Код: Выделить всё • Развернуть
if( motstat[ i ].oc < 255 )
{
motstat[ i ].oc ++;
motstat[ i ].pause = 255;
}
else
{
// motstat[ i ].oc = 230;
motstat[ i ].speedcur = 0;//текущая скорость
if( motstat[ i ].pause > 200 )
{
motstat[ i ].flagoc = 1;
motstat[ i ].pause = 0;
}
else motstat[ i ].pause++;
}
Тут переменные motstat[ i ].oc - который считает время между тиками и
motstat[ i ].pause которая выставляет паузу для сброса флага motstat[ i ].flagoc и периодического запуска регулятора, если
двигатель не работает.
Как это можно сделать без условий мне в голову не пришло...