arduino
- Rokky
- Наездник
- Сообщений: 423
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, наверняка не скажу, но можно проверить думаю с помощью функции attachInterrupt(interrupt, function, mode), посмотреть скок прерываний там вызывается, перекрывают ли они сильно поток выполнения..
Или использовать обратную функцию detachInterrupt(interrupt)
Или использовать обратную функцию detachInterrupt(interrupt)
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Maxxtro2
- Механик
- Сообщений: 1024
- Зарегистрирован: 10 ноя 2009, 00:46
- Темы: 30
- Имя:
- Статус: Не в сети
arduino
И снова с вопросом.
Не очень нравится выходная регулировка PWM, складывается впечатление что считывание данных приходят так быстро что на выходе 50Гц отрабатывает не совсем правильно.
Еще интересует вопрос вывода информации на экран, если входящие данные просто бросать на экран, то это становится не читабельно для наших глаз, как бы правильно их преобразовывать чтобы они выводились более привлекательней (к примеру 556 - 560, 381 - 380 и т.д.)
Не очень нравится выходная регулировка PWM, складывается впечатление что считывание данных приходят так быстро что на выходе 50Гц отрабатывает не совсем правильно.
Еще интересует вопрос вывода информации на экран, если входящие данные просто бросать на экран, то это становится не читабельно для наших глаз, как бы правильно их преобразовывать чтобы они выводились более привлекательней (к примеру 556 - 560, 381 - 380 и т.д.)
Код: Выбрать все
#include <PWM.h>
int MAP = A1;
int VNT = 9;
unsigned long frequency = 50;
int MAPval = 0;
int VNTon[10] = {0, 242, 219, 196, 173, 150, 128, 94, 61, 28};
int MAPbar[11] = {-900, 750, 800, 850, 900, 950, 1000, 1050, 1100, 1150, 1200};
void setup()
{
InitTimersSafe();
SetPinFrequencySafe(VNT, frequency);
}
void loop()
{
MAPval = analogRead(MAP);
MAPval = MAPval * 2.518891688 - 1000;
if (MAPval < MAPbar[0])
{
pwmWrite(VNT, VNTon[0]);
}
else if (MAPval < MAPbar[1])
{
pwmWrite(VNT, VNTon[1]);
}
else if (MAPval < MAPbar[2])
{
pwmWrite(VNT, VNTon[2]);
}
else if (MAPval < MAPbar[3])
{
pwmWrite(VNT, VNTon[3]);
}
else if (MAPval < MAPbar[4])
{
pwmWrite(VNT, VNTon[4]);
}
else if (MAPval < MAPbar[5])
{
pwmWrite(VNT, VNTon[5]);
}
else if (MAPval < MAPbar[6])
{
pwmWrite(VNT, VNTon[6]);
}
else if (MAPval < MAPbar[7])
{
pwmWrite(VNT, VNTon[7]);
}
else if (MAPval < MAPbar[8])
{
pwmWrite(VNT, VNTon[8]);
}
else if (MAPval < MAPbar[9])
{
pwmWrite(VNT, VNTon[9]);
}
else if (MAPval < MAPbar[10])
{
pwmWrite(VNT, VNTon[0]);
}
else
{
pwmWrite(VNT, VNTon[0]);
}
}
- Rokky
- Наездник
- Сообщений: 423
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, да скорость считывания большая, тут можно или задержку всунуть или среднее брать (последнее будет мне кажется предпочтительней)
Про вывод не совсем понял.., какие именно данные? у вас на входе только 1 число.. а в примере диапазон
Про вывод не совсем понял.., какие именно данные? у вас на входе только 1 число.. а в примере диапазон
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Maxxtro2
- Механик
- Сообщений: 1024
- Зарегистрирован: 10 ноя 2009, 00:46
- Темы: 30
- Имя:
- Статус: Не в сети
arduino
Rokky,
вход пин A1
выход пин 9
Вход читаем с датчика и скорость очень большая
Выход с частотой 50Гц и прописанной скважностью.
Думаю правильно будет среднее брать со входа и также с частотой 50Гц - вот только правда не понимаю как это среднее высчитать.
Про вывод на экран - выводить нужно данные с пина A1 преобразованные в MAPval (в коде вывода на экран нет), но т.к. данные считываются тоже быстро, они также быстро и на экране отображаются, а наши глаза это не воспринимают, вот и хочется эти данные преобразовывать для того чтобы наш глаз это воспринимал, да и еще было бы замечательно округлить их - к примеру 556 - 560, 381 - 380 и т.д.
вход пин A1
выход пин 9
Вход читаем с датчика и скорость очень большая
Выход с частотой 50Гц и прописанной скважностью.
Думаю правильно будет среднее брать со входа и также с частотой 50Гц - вот только правда не понимаю как это среднее высчитать.
Про вывод на экран - выводить нужно данные с пина A1 преобразованные в MAPval (в коде вывода на экран нет), но т.к. данные считываются тоже быстро, они также быстро и на экране отображаются, а наши глаза это не воспринимают, вот и хочется эти данные преобразовывать для того чтобы наш глаз это воспринимал, да и еще было бы замечательно округлить их - к примеру 556 - 560, 381 - 380 и т.д.
- Rokky
- Наездник
- Сообщений: 423
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
ну среднее примерно так можно:
По поводу отображения, не надо так часто, отображайте например раз в секунду ( не чаще).
Тут еще вопрос куда выводите, например, можно не выводить значения на экран если они совпадают с предыдущими, т.к они уже там. Т.е такой фильтр на повторяющиеся значения.
Округление, если не ошибаюсь вам нужно такая, вот пример:
Код: Выбрать все
double val=0.0;
int countItem = 10;
for(int i = 0; i < countItem ; i++)
{
MAPval = analogRead(MAP);
MAPval = MAPval * 2.518891688 - 1000;
double +=MAPval;
// можно мини-задержку сделать
//delay(10);
}
double /=countItem ;
По поводу отображения, не надо так часто, отображайте например раз в секунду ( не чаще).
Тут еще вопрос куда выводите, например, можно не выводить значения на экран если они совпадают с предыдущими, т.к они уже там. Т.е такой фильтр на повторяющиеся значения.
Округление, если не ошибаюсь вам нужно такая, вот пример:
Код: Выбрать все
#include <math.h>
int roundNum(int val, int des = 10)
{
double vl = (double)val / des;
auto t = floor(vl + 0.5);
t *= des;
return t;
}
int main()
{
int val = 556;
int newVal = roundNum(val);
return 0;
}
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Rokky
- Наездник
- Сообщений: 423
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
пару опечаток нашел, писал на коленке..
Код: Выбрать все
double val=0.0;
int countItem = 10;
for(int i = 0; i < countItem ; i++)
{
MAPval = analogRead(MAP);
MAPval = MAPval * 2.518891688 - 1000;
double +=MAPval;
// можно мини-задержку сделать
//delay(10);
}
val /=countItem ;
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Rokky
- Наездник
- Сообщений: 423
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, ой, вот так надо
ну и на выходе в val будет среднее значение, надеюсь вы поняли
Код: Выбрать все
val+=MAPval;
ну и на выходе в val будет среднее значение, надеюсь вы поняли
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Rokky
- Наездник
- Сообщений: 423
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, в моем примере не регулируется это. если добавить задержку, то в этом пример получится он в течении секунды считает среднее значение, а потом будет выдавать на шим что-то
т.е тут делаем 20 циклов считывание значения с задержкой в 50 мс между циклами
Код: Выбрать все
double val=0.0;
int countItem = 20;
for(int i = 0; i < countItem ; i++)
{
MAPval = analogRead(MAP);
MAPval = MAPval * 2.518891688 - 1000;
val+=MAPval;
// можно мини-задержку сделать
//delay(50);
}
val /=countItem ;
т.е тут делаем 20 циклов считывание значения с задержкой в 50 мс между циклами
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Rokky
- Наездник
- Сообщений: 423
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, попробуйте я честно не помню, с шим пару раз сталкивался тока:)
Если будет, тогда по другому немного надо будет переписать вычисление среднего, вынести его с функции loop()
Если будет, тогда по другому немного надо будет переписать вычисление среднего, вынести его с функции loop()
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Rokky
- Наездник
- Сообщений: 423
- Зарегистрирован: 15 сен 2016, 14:41
- Темы: 3
- Авто: Audi A4 B8, 1.8 TFSI
- Имя: Жека
- Откуда: Минск
- Контактная информация:
- Статус: Не в сети
arduino
Maxxtro2, нашел крутой плагин для Microsoft Visual Studio, называется Visual.Micro.Arduino.Studio, очень советую если еще кодишь для arduino
https://www.drive2.ru/r/audi/a4/453354483729040251/
- Bill Humble
- Специалист
- Сообщений: 1522
- Зарегистрирован: 09 июл 2009, 00:12
- Темы: 8
- Авто: A4Q 1.8T AMB '04
- Имя:
- Откуда: Логойск
- Контактная информация:
- Статус: Не в сети
Кто сейчас на форуме
Количество пользователей, которые сейчас просматривают этот форум: Google [Bot] и 3 гостей