Показано с 1 по 10 из 98

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11
    Продвинутый
    Регистрация
    20.12.2011
    Сообщений
    336
    Вес репутации
    235

    По умолчанию Re: Датчик холла 12В использование с ардуино

    Chip
    Я сегодня замерил с помощью старой программы и методом подбора выяснил, что сигнал на комбинации приборов, от которого я пляшу, имеет 24 импульса на 1 оборот колеса - видимо это после преобразования контроллера или датчик такой...или передаточное число в КПП.

    В результате получил вполне приемлемые данные, соответствующие показанию спидометра.
    Единственно бывает, что скорость отличается на 3-4 км между соседними срабатываниями таймера, например 39 и 36, на самом деле скорость ~40. Выбивание из ряда объясняю тем, что граничные импульсы попали в соседнее срабатывание таймера.
    В принципе код вполне устраивает

    Код:
    #include <MsTimer2.h>
    
    int ledPin = 13; // контакт для светодиода
    int switchPin = 30; // контакт для кнопки
    int RelayPin = 14; // Контакт для реле
    int HallPin = 3; // Контакт для датчика холла
    int SpeakerPin=8; // Контакт для динамика
    
    boolean RelayOn = false;
    unsigned long speedtime = 0; 
    int count = 0; 
    unsigned long time; 
    float lkolesa;
    float Speed;
    float  TimerInterval=500;
    
    void setup() 
    {
    Serial.begin(115200);
    
    pinMode(SpeakerPin, OUTPUT); // для динамика
    pinMode(ledPin, OUTPUT); // для светодиода
    pinMode(switchPin, INPUT); //  для кнопки
    pinMode(RelayPin, OUTPUT); // для реле
    
    pinMode(HallPin, INPUT); // датчик холла
    digitalWrite(HallPin, HIGH); //внутренняя подтяжка входа датчика холла
    
    
      attachInterrupt(1, int_on, RISING);
    MsTimer2::set(TimerInterval, flash); // таймер будет срабатывать через каждые 500ms 
    MsTimer2::start();//запустить таймер
     
    }
    
    
    void loop()
    {
    }
    
    
    void  int_on() 
    { 
    count++; //увеличить счетчик
    }  
    
    void flash() //обработка прерывания таймера
    {
    lkolesa=0.686;
    Speed=lkolesa*count*(2400/TimerInterval);
    Serial.flush(); 
    Serial.println(count);
    Serial.println(Speed); 
    count=0;
    }
    Также проверил и более старый код:

    Код:
    void  int_on() 
    
    { 
    count++; //увеличить счетчик volatile
    
    if (count >=24)
      {
    speedtime = micros()-time;  //время прихода 6-ти импульсов
    time = micros(); //обнулить
    lkolesa=0.686;
    Speed=((lkolesa*3600000*4)/speedtime);
    Serial.println(speedtime);
    Serial.println(Speed); 
     count = 0;
      }
    он выдает более точные данные, но реже, только после получения 24 импульсов...

    Над твоим новым кодом думаю... учитывая мои 24 импульса.
    Код:
    void  int_on() 
    { 
      delta=3030*(micros()-micross);// тут 1 имульс и время за которое он произошел
      micross = micros(); //обнулить
    }
    Мне кажется по одному импульсу судить нельзя, не точно получится
    У меня выше тоже самое, но за 24 импульса, возможно стоит за 4 или 6 импульсов судить о скорости
    Последний раз редактировалось kadushkin; 05.01.2012 в 18:06.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •