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

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем yanek, 18 янв 2021.

  1. yanek

    yanek Нуб

    Гидроклапан управляет потоком жидкости. На выходе потока стоит турбина с датчиком Холла. Гидроклапан регулируется мотором по принципу степ-дир. Я предполагал действовать через внешнее прерывание, но там не работает миллис. То есть, чтобы оценить скорость вращения турбины, нужно уловить смену 1 на 0 на датчике, засечь время, дождаться новой смены 1 на 0, определить угловую скорость турбины в миллисекундах на оборот и если она больше чем установочная - крутить мотор гидроклапана на закрытие клапана, а если меньше - на открытие. Но, как я говорил, во внешнем прерывании не работает миллис. Как быть?
     
  2. b707

    b707 Гуру

    можно использовать микрос, он в прерывании работает.
    Или запустить свой собственный счетчик на таймере.
     
  3. yanek

    yanek Нуб

    Я чайник. Какой там программист. Не могу придумать как лучше организовать код. Турбина с датчиком Холла вращается достаточно медленно. От 1 до 10 оборотов в секунду. К примеру, функция внешнего прерывания будет вызвана когда сработает датчик. Если мотор гидроклапана сделает один шаг это мало. Если будет ехать пока датчик не сработает снова это много. Надеть на вал диск и наляпать магнитов по окружности? Посоветуйте. Как бы вы сделали?
     
  4. Рокки1945

    Рокки1945 Гуру

    Захват по таймеру - timer capture.
    Или использовать внешнее прерывание по входу - Falling.
    В обработчике - функции - запускается таймер (если надо более точный то таймер1 - он 16 битный - в ардуино есть библиотека/обнуляете переменную для счётчика - в его обработчике инкрементируете эту переменную - значение каждой единицы этого счётчика как настроете и будет ваше время - при следующем изменении с единицы на ноль считываете счётчик переводите во время и сравниваете с константой (а можно вообще не переводить) - если есть необходимость производите регулировку - и так до следующего
     
    Последнее редактирование модератором: 18 янв 2021
    b707 нравится это.
  5. parovoZZ

    parovoZZ Гуру

    Определяем переменную
    Код (C++):
    static volatile SoftClock_t     SoftTime_System = 0uL;
    где :
    Код (C++):
    typedef uint32_t    SoftClock_t;
    Пишем функцию:
    Код (C++):

    void SoftTime_SysTick(void)
    {
        SoftTime_System++;
    }
    и вызываем её в прерывании от любого удобного для нас таймера (у меня это RTC таймер) раз в 1 мс:

    Код (C++):
    ISR (RTC_CNT_vect)
    {  
        SoftTime_SysTick();      
     
        RTC.INTFLAGS = 0xFF;
    }
    Всё. Теперь в переменной лежит системный тик в миллисекундах. И делай с ним всё, что захочешь.
    К примеру, софтовый таймер на любой период в миллисекундах до 49 дней:
    Код (C++):
    Bool_t SoftTimer_FreeRun(SoftTimer_t* const SoftTimer, const SoftClock_t SoftTime)
    {
        Bool_t  result = FALSE;
     
        if (SOFTTIMER_ARMED == SoftTimer_Status(SoftTimer))
        {
            if (SOFTTIMER_ARMED == SoftTimer_Expired(SoftTimer))
            {
                SoftTimer_Disarm(SoftTimer);
             
                result = TRUE;
            }
        }
        else
            {
                SoftTimer_Set(SoftTimer, SoftTime);
            }
         
        return result;
    }
     
    Последнее редактирование: 18 янв 2021