ФУОЗ по дешману
на сайте:
ноя-08
нахождение:
Москва, Ясенево
|
|
26-11-20 18:13
|
|
Ребята на базе ардуино запилили фуоз, дешево и просто |
|
на сайте:
ноя-08
нахождение:
Москва, Ясенево
|
|
26-11-20 18:13
|
|
Ребята на базе ардуино запилили фуоз, дешево и просто |
|
Не совсем. у нас есть 2 графика , при максимальной и минимальной нагрузке , и есть переменная нагрузки , в зависимости от переменной нагрузки у нас угол двигается между этих двух графиков.
понятно! спс!
Други, с исходным скетчем разобрался, надо переходить к ходовым испытаниям, а "Урал разобран". Вопросы будут после "неполучилось". :)
У меня задача бала сделать для начала зажигание на плате Ардуино Уно, а потом прикрутить к ней всё что захочется. Сделать это быстро и понятно. В сети была найдена прога 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;
}
Ох как я не люблю визуализаторы ... , мне гораздо проще читать if else и т.д. ... понятность и логика ускользает .. Про оптимизацию самого кода в таком варианте я вообще молчу...
Если уж серьезно то визуализаторы кода это громоздкое баловство, по сути и ide ардуино далеко не оптимально для программирования (просто гораздо проще для понимани) , тут лучше было б С++ а еще лучше асемблер..
Согласен! НО. на очередном "ифэлс" я потерял нить и запутался....
Я ж тамвсе подписал )) ты главное функцию определения угла от оборотов не пытайся осмыслить по ифам, в ней смысл простой делим на пополам и ищем в какой доле значение потом доль где значене опять делим на пополам и опять сравниваем и так далее , это дает самый быстрый поиск по большому колличеству долей .. есл в последовательном перечислении будет порядка 20 прыжков (if else) то при делении на пополам будет только 5 прыжков в поиске.
Ишь, какой хитрый! А я никак не мог понять: почему начало с самого большого значения.
Оптимизация кода и скорости работы программы , потому и говорю что визуализаторы это грусть
Чутка обкатал графики , перенес на Github (там проще смотреть версии и изменения)
Обновлю что ли .
Переписал программу, все расчеты ведутся в микросекундах, по сути все сложные операции теперь прописаны в define и не занимают время и место , прошивку не проверял еще.
Скеч тут
как итог программа полегчала в 2 раза.
пока думаю что надо пилить свой таймер , чтоб не пользовать micros() и не мучаться с его переполнением.
Странно, что у тебя компилятор съел такое:
34 строка: #define ANGLE_4_700 (RPM_MIC_700 / 3600 * -150)
97 строка: #define RPM_MIC_700 (TIME_FOR_RPM_COUNT / RPM_700)
Объявлять константу, ссылаясь на другую ещё не объявленную константу - это, ИМХО, моветон... Да и не каждый компилятор пропустит.
В остальном - погляжу, потестирую.
А чем переполнение счётчика микросекунд не устраивает? Оно же довольно просто обрабатывается.
Peacedeath подкрался незаметно, но слышен был издалека
Про объявления думал тоже когда писал, правда это как всегда в ночи писалось, но компилятор под дижджиспарк не ругнулся.
Переполнение микрос в итоге выливается отключением зажигания на секунду.. очень странно , поменял местами отработку простоя и переполнения , скорее всего это решит этот баг.
И потом если у нас будет постоянно обнуляемый при вмт таймер нам не надо будет возиться с большими числами , у на всегда будет что то типо одного миллиона и не более ,то есть мы будем оперировать только дифтаймом по сути ,
Залил прошивку которая чисто микросекундная, работает но как то не так , обороты набираются плохо , видимо идет сильно запаздывание, где-то ошибка и скорее всего она в определении времени задержки.
Скеч согласно замечаний поправил, не в них дело. Буду думать на досуге как время появится.
Пока пользуйтесь прошивкой стандартной Этой она обкатана.