Круиз контроль на Hundai Solaris

BigAleksey
Offline
Зарегистрирован: 16.08.2014

Есть желание собрать и поставить круиз контроль себе на машину.

За основу был взят Arduino Nano (ATmega328),
На машине установлена электрическая педаль газа, которая представляет из себя два переменных резистора которая выдаёт полностью отжатая 0.25В/0.5В, полностью нажатая — 1.35В/2.7В (пока не проверенно).
Педаль будет считываться двумя аналоговыми входами, а вместо неё будет подключатся 2 выхода ШИМ. Скорость будет считываться с датчика скорости ( при скорости 60 км/ч выдает импусьсы с частотой ~40 Гц), обороты двигателя с датчика положения распредвала (1 импульс на 2 оборота двигателя).

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

[code]
unsigned long summa_speed_time = 0;
unsigned long summa_RPM_time = 0;

unsigned int venicle_speed = 0;                  // Скорость в Км/ч *10
unsigned int engine_RPM = 0;                     // обороты двигателя об/мин

volatile unsigned long int_speed_count = 0;
volatile unsigned long int_RPM_count = 0;
volatile unsigned long currient_interput_speed_time = 10000000;
volatile unsigned long previos_interput_speed_time = 0;
volatile unsigned long currient_interput_RPM_time = 10000000;
volatile unsigned long previos_interput_RPM_time = 0;
volatile unsigned long speed_calc_time_array[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
volatile unsigned long RPM_calc_time_array[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
volatile int sc = 0; // Speed counter
volatile int rc = 0; // Speed counter

int i = 0;


int InD_speed = 2;               // входной пин с датчика скорости
int InD_RPM = 3;                 // входной пин с датчика положения распредвала
int InA_trotle_A = 14;           // вход напряжения с педали газа плечо 1
int InA_trotle_B = 15;           // вход напряжения с педали газа плечо 2
int OutD_Led = 13;
int OutA_trotlleA = 9;           // выход ШИМ на вход 1 педали газа ЭБУ
int OutA_trotlleB = 10;          // выход ШИМ на вход 2 педали газа ЭБУ

void setup()
{
  Serial.begin(115200);
  pinMode(OutD_Led, OUTPUT);
  pinMode(InD_speed, INPUT);
  pinMode(InD_RPM, INPUT);
  attachInterrupt(0, Speed, FALLING);
  attachInterrupt(1, RPM, FALLING);
}


// ---- начало основной программы -----------------------------------------------------------------------------
void loop() 
// **** проверка на остановку прерываний для исключения "зависания" показаний при остановке **
{
  if ((micros()- currient_interput_speed_time) > 500000)
  { for (int i = 0; i <= 9; i++)
    {
    speed_calc_time_array[i] = 20000000;
    }

  }
  if ((micros()- currient_interput_RPM_time) > 500000)
  { for (int i = 0; i <= 9; i++)
    {
      RPM_calc_time_array[i] = 200000000;
    }

  };
// **** вычисление скорости и оборотов двигателя
  for (int i = 0; i <= 9; i++)
  {
    summa_speed_time = summa_speed_time + speed_calc_time_array[i];
  }
  venicle_speed = 150000000 / summa_speed_time;
  summa_speed_time = 0;

  for (int i = 0; i <= 9; i++)
  {
    summa_RPM_time = summa_RPM_time + RPM_calc_time_array[i];
  }
  engine_RPM = 1200000000 / summa_RPM_time;
  summa_RPM_time = 0;
//



  Serial.print("Speed=");
  Serial.println(venicle_speed);
  Serial.print("RPM=");
  Serial.println(engine_RPM);

  delay(100);
}
// ---- конец основной программы -----------------------------------------------------------------------------


//************************************************************************* начало секции обработки прерываний *********************************************************************
void Speed()  // Счетчик скорости
{
  if (sc >= 10) sc = 0;
  speed_calc_time_array[sc] = 0;
  currient_interput_speed_time = micros();
  speed_calc_time_array[sc] = currient_interput_speed_time - previos_interput_speed_time;
  previos_interput_speed_time = currient_interput_speed_time;
  sc = sc + 1;
}

void RPM()   // Счетчик оборотов
{
  if (rc >= 10) rc = 0;
  RPM_calc_time_array[rc] = 0;
  currient_interput_RPM_time = micros();
  RPM_calc_time_array[rc] = currient_interput_RPM_time - previos_interput_RPM_time;
  previos_interput_RPM_time = currient_interput_RPM_time;
  rc = rc + 1;
}
//************************************************************************** конец секции обработки прерываний *********************************************************************

[/code]

 

Leha
Offline
Зарегистрирован: 09.06.2014

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

BigAleksey
Offline
Зарегистрирован: 16.08.2014

Ну педали тормозов и сцепления никто не отменял :-) 

 

Пока вместо машины для тестов используется еще одна Ардуина.

Ну и по задумке в схеме будет система безопасности в виде реле переключающего педаль в случае зависания программы. (программа при работе будет дёргать ногой и а при отсутсвии импульсов реле переключит педаль в штатную схему)

zx118
Offline
Зарегистрирован: 17.08.2014

давайте у меня тоже есть желание поэксперементировать с управлением свечками (сделать эклектронное зажигание)

и форсунками, это после удачных экспериментов с зажиганием :)

для управления заказал такие штуки http://www.ebay.com/itm/271489716288?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649