arduino

Обсуждение увлечений, которые помогают нам скоротать свободное время
Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 423
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 06 фев 2018, 23:16

Maxxtro2, наверняка не скажу, но можно проверить думаю с помощью функции attachInterrupt(interrupt, function, mode), посмотреть скок прерываний там вызывается, перекрывают ли они сильно поток выполнения..
Или использовать обратную функцию detachInterrupt(interrupt)
Изображение

https://www.drive2.ru/r/audi/a4/453354483729040251/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 15 ноя 2018, 17:15

И снова с вопросом.
Не очень нравится выходная регулировка 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

Сообщение Rokky » 15 ноя 2018, 18:26

Maxxtro2, да скорость считывания большая, тут можно или задержку всунуть или среднее брать (последнее будет мне кажется предпочтительней)

Про вывод не совсем понял.., какие именно данные? у вас на входе только 1 число.. а в примере диапазон
Изображение

https://www.drive2.ru/r/audi/a4/453354483729040251/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 15 ноя 2018, 18:46

Rokky,
вход пин A1
выход пин 9
Вход читаем с датчика и скорость очень большая
Выход с частотой 50Гц и прописанной скважностью.
Думаю правильно будет среднее брать со входа и также с частотой 50Гц - вот только правда не понимаю как это среднее высчитать.
Про вывод на экран - выводить нужно данные с пина A1 преобразованные в MAPval (в коде вывода на экран нет), но т.к. данные считываются тоже быстро, они также быстро и на экране отображаются, а наши глаза это не воспринимают, вот и хочется эти данные преобразовывать для того чтобы наш глаз это воспринимал, да и еще было бы замечательно округлить их - к примеру 556 - 560, 381 - 380 и т.д.

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 423
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 15 ноя 2018, 20:25

ну среднее примерно так можно:

Код: Выбрать все

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

Сообщение Rokky » 16 ноя 2018, 10:19

пару опечаток нашел, писал на коленке..

Код: Выбрать все

   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/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 16 ноя 2018, 11:36

Rokky, ругается на double +=MAPval;

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 423
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 16 ноя 2018, 12:51

Maxxtro2, ой, вот так надо :pardon:

Код: Выбрать все

val+=MAPval;


ну и на выходе в val будет среднее значение, надеюсь вы поняли :)
Изображение

https://www.drive2.ru/r/audi/a4/453354483729040251/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 16 ноя 2018, 12:57

Rokky, а если это среднее считать в период исходя из 50Гц (1000/50=20)? За какой период в Вашем примере берет среднее?

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 423
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 16 ноя 2018, 13:16

Maxxtro2, в моем примере не регулируется это. если добавить задержку, то в этом пример получится он в течении секунды считает среднее значение, а потом будет выдавать на шим что-то

Код: Выбрать все

 
  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/

Аватар пользователя
Maxxtro2
Механик
Механик
Сообщений: 1024
Зарегистрирован: 10 ноя 2009, 00:46
Темы: 30
Имя:
Статус: Не в сети

arduino

Сообщение Maxxtro2 » 16 ноя 2018, 13:35

Rokky,а не будет ли из-за delay останавливаться работа ШИМ

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 423
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 16 ноя 2018, 13:48

Maxxtro2, попробуйте я честно не помню, с шим пару раз сталкивался тока:)
Если будет, тогда по другому немного надо будет переписать вычисление среднего, вынести его с функции loop()
Изображение

https://www.drive2.ru/r/audi/a4/453354483729040251/

Аватар пользователя
Rokky
Наездник
Наездник
Сообщений: 423
Зарегистрирован: 15 сен 2016, 14:41
Темы: 3
Авто: Audi A4 B8, 1.8 TFSI
Имя: Жека
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Rokky » 26 окт 2019, 23:23

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
Имя:
Откуда: Логойск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Bill Humble » 06 апр 2020, 10:37

Ардуинщику на карантине отключили интернет.

Не умножай сущностей без надобности

fender
Специалист
Специалист
Сообщений: 1878
Зарегистрирован: 11 май 2010, 21:57
Темы: 1
Авто: VW 4Motion
Имя: ...
Статус: Не в сети

arduino

Сообщение fender » 07 апр 2020, 09:09

Bill Humble, :good:

Аватар пользователя
Sly
Мастер
Мастер
Сообщений: 2826
Зарегистрирован: 12 июн 2009, 19:35
Темы: 16
Авто: кероГАЗ24
Имя:
Откуда: Минск
Контактная информация:
Статус: Не в сети

arduino

Сообщение Sly » 07 апр 2020, 17:38

Во как персов в игрушках прокачивают за бабло. :crazy:
Car driver & vodka swiller


Вернуться в «На досуге...»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: Google [Bot] и 3 гостей