ФУОЗ по дешману | OPPOZIT.RU | мотоциклы Урал, Днепр, BMW | оппозитный форум, ремонт и тюнинг мотоциклов
Home

ФУОЗ по дешману

оппозитчик kimba
чтоб поменять аватар - читай FAQ
нахождение: Москва, Ясенево

Ребята на базе ардуино запилили фуоз, дешево и просто
https://www.youtube.com/watch?v=XP1SUmiTKZY
Каково мнение общественности?
Думаю надо попробовать, ради эксперимента.
Ссылки на инструкцию
https://customcult.netlify.app/

Artegro's picture

Не совсем. у нас есть 2 графика , при максимальной и минимальной нагрузке , и есть переменная нагрузки , в зависимости от переменной нагрузки у нас угол двигается между этих двух графиков.

cptGreen's picture

понятно! спс!

cptGreen's picture

Други, с исходным скетчем разобрался, надо переходить к ходовым испытаниям, а "Урал разобран". Вопросы будут после "неполучилось". :)

У меня задача бала сделать для начала зажигание на плате Ардуино Уно, а потом прикрутить к ней всё что захочется. Сделать это быстро и понятно. В сети была найдена прога FLprog ( https://flprog.ru/ ), освоена и опробована. Создание прошивок на ней действительно проще, но как я говорил гибкости маловато.

Вот в так выглядит в проге прошивка:
https://ibb.co/CMr8gkx
Основной бок вокруг которого строилась УОЗ: SCT - скоростной счётчик. У него в свойствах прописывается PIN вход и PIN выход, прописывается от куда он берет задержку, как считает обороты и что выдаёт на выходах. Далее созданы два массива данных для графиков Оппозит№2 (содрал у Кэпа), Уктус-2 (то же где то нашел). Массивы подсоединены к блоку многовходного переключателя. Установлен выбор 1 - константой ( в будущем планируется так организовать выбор графика по какому либо действию. Кнопка, крутилка). Два блока умножения и один деления - это я приводил табличные и расчетные значения для вычисления УОЗ. Далее возврат расчетного УОЗ на вход счётчика для вывода сигнала с задержкой.

Вот скетч, который FLprog сам содает по вашему рисунку для прошивки Ардуины в IDE (Даже не спрашивайте, на подсознательном уровне понял чтото, но объяснить не смогу)

struct _poligonInexes
{
int minIndex;
int maxIndex;
}
;
int _Poligon_InArray_1[11] = {0, 499, 500, 1000, 1500, 2000, 2500, 3000, 4000, 5000, 6000};
int _Poligon_OutArray_1[11] = {0, 0, 1.7, 3.3, 14.625, 19.5, 24.5, 30.5, 35.1, 38.0, 40.7};
int _Poligon_InArray_2[7] = {400, 1000, 2000, 3000, 4000, 5000, 6000};
int _Poligon_OutArray_2[7] = {0, 9.1, 26.4, 25.1, 33.7, 41.8, 49.3};
unsigned long _gtv1;
int _gtv2;
int _gtv3; //обороты для расчёта
int _gtv4; //угол для расчёта
int _gtv5; //расчётная задержка
int _mux1;
int _SCT_1_DLDIV = 0;
bool _SCT_1_DLOSN = 0;
unsigned long _SCT_1_DLST = 0UL;
bool _SCT_1_DLIDM = 0;
unsigned long _SCT_1 = 0UL;
unsigned long _SCT_1IC = 0UL;
unsigned long _SCT_1P = 0UL;
void setup()
{
pinMode(3, INPUT_PULLUP);
pinMode(13, OUTPUT);
_SCT_1P=micros();
TCCR2A = 0;
TCCR2B = 0<60000000)||((micros()-_SCT_1P) <0))
{
_SCT_1 = _SCT_1IC;
_SCT_1IC=0;
_SCT_1P = micros();
}
_SCT_1_DLDIV = _gtv5;
_gtv1 = _SCT_1;
_gtv5 = (_gtv4)/(_gtv3);
if((1) == 0)
{
_mux1 = (_poligon((_gtv1), _Poligon_InArray_1, _Poligon_OutArray_1, 11));
}
if((1) == 1)
{
_mux1 = (_poligon((_gtv1), _Poligon_InArray_2, _Poligon_OutArray_2, 7));
}
_gtv2 = _mux1;
_gtv3 = (_gtv1)*(6);
}
void _SCT_1coutFunction()
{
_SCT_1IC++;
attachInterrupt(digitalPinToInterrupt (3), _SCT_1positiveCoutFunction, RISING);
}
void _SCT_1positiveCoutFunction()
{
if((!_SCT_1_DLOSN) &&(!_SCT_1_DLIDM))
{
_SCT_1_DLIDM=1;
_SCT_1_DLST = micros();
}
attachInterrupt(digitalPinToInterrupt (3), _SCT_1coutFunction, FALLING);
}
ISR (TIMER2_OVF_vect)
{
if((_SCT_1_DLIDM))
{
if(_SCT_1_DLIDM)
{
if (_SCT_1_DLOSN)
{
if((_SCT_1_DLST+60) 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;
}

Artegro's picture

Ох как я не люблю визуализаторы ... , мне гораздо проще читать if else и т.д. ... понятность и логика ускользает .. Про оптимизацию самого кода в таком варианте я вообще молчу...
Если уж серьезно то визуализаторы кода это громоздкое баловство, по сути и ide ардуино далеко не оптимально для программирования (просто гораздо проще для понимани) , тут лучше было б С++ а еще лучше асемблер..

cptGreen's picture

Согласен! НО. на очередном "ифэлс" я потерял нить и запутался....

Artegro's picture

Я ж тамвсе подписал )) ты главное функцию определения угла от оборотов не пытайся осмыслить по ифам, в ней смысл простой делим на пополам и ищем в какой доле значение потом доль где значене опять делим на пополам и опять сравниваем и так далее , это дает самый быстрый поиск по большому колличеству долей .. есл в последовательном перечислении будет порядка 20 прыжков (if else) то при делении на пополам будет только 5 прыжков в поиске.

cptGreen's picture

Ишь, какой хитрый! А я никак не мог понять: почему начало с самого большого значения.

Artegro's picture

Оптимизация кода и скорости работы программы , потому и говорю что визуализаторы это грусть

Artegro's picture

Чутка обкатал графики , перенес на Github (там проще смотреть версии и изменения)

Artegro's picture

Обновлю что ли .
Переписал программу, все расчеты ведутся в микросекундах, по сути все сложные операции теперь прописаны в define и не занимают время и место , прошивку не проверял еще.
Скеч тут
как итог программа полегчала в 2 раза.
пока думаю что надо пилить свой таймер , чтоб не пользовать micros() и не мучаться с его переполнением.

PCDeath's picture

Странно, что у тебя компилятор съел такое:

Quote:
6 строка: #define ANGLE_0_700 (RPM_MIC_700 / 3600 * 10)

34 строка: #define ANGLE_4_700 (RPM_MIC_700 / 3600 * -150)

97 строка: #define RPM_MIC_700 (TIME_FOR_RPM_COUNT / RPM_700)

Объявлять константу, ссылаясь на другую ещё не объявленную константу - это, ИМХО, моветон... Да и не каждый компилятор пропустит.

В остальном - погляжу, потестирую.
А чем переполнение счётчика микросекунд не устраивает? Оно же довольно просто обрабатывается.

Peacedeath подкрался незаметно, но слышен был издалека

Artegro's picture

Про объявления думал тоже когда писал, правда это как всегда в ночи писалось, но компилятор под дижджиспарк не ругнулся.
Переполнение микрос в итоге выливается отключением зажигания на секунду.. очень странно , поменял местами отработку простоя и переполнения , скорее всего это решит этот баг.
И потом если у нас будет постоянно обнуляемый при вмт таймер нам не надо будет возиться с большими числами , у на всегда будет что то типо одного миллиона и не более ,то есть мы будем оперировать только дифтаймом по сути ,

Artegro's picture

Залил прошивку которая чисто микросекундная, работает но как то не так , обороты набираются плохо , видимо идет сильно запаздывание, где-то ошибка и скорее всего она в определении времени задержки.
Скеч согласно замечаний поправил, не в них дело. Буду думать на досуге как время появится.

Пока пользуйтесь прошивкой стандартной Этой она обкатана.

User login