Страница 5 из 5

arduino

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

arduino

Добавлено: 15 ноя 2018, 17:15
Maxxtro2
И снова с вопросом.
Не очень нравится выходная регулировка 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]);
  }
}

arduino

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

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

arduino

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

arduino

Добавлено: 15 ноя 2018, 20:25
Rokky
ну среднее примерно так можно:

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

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;
}


arduino

Добавлено: 16 ноя 2018, 10:19
Rokky
пару опечаток нашел, писал на коленке..

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

   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 ;

arduino

Добавлено: 16 ноя 2018, 11:36
Maxxtro2
Rokky, ругается на double +=MAPval;

arduino

Добавлено: 16 ноя 2018, 12:51
Rokky
Maxxtro2, ой, вот так надо :pardon:

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

val+=MAPval;


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

arduino

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

arduino

Добавлено: 16 ноя 2018, 13:16
Rokky
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 мс между циклами

arduino

Добавлено: 16 ноя 2018, 13:35
Maxxtro2
Rokky,а не будет ли из-за delay останавливаться работа ШИМ

arduino

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

arduino

Добавлено: 26 окт 2019, 23:23
Rokky
Maxxtro2, нашел крутой плагин для Microsoft Visual Studio, называется Visual.Micro.Arduino.Studio, очень советую если еще кодишь для arduino

arduino

Добавлено: 06 апр 2020, 10:37
Bill Humble
Ардуинщику на карантине отключили интернет.


arduino

Добавлено: 07 апр 2020, 09:09
fender
Bill Humble, :good:

arduino

Добавлено: 07 апр 2020, 17:38
Sly
Во как персов в игрушках прокачивают за бабло. :crazy: