Проблема при попытке ограничить скорость двигателя определенным числом оборотов в минуту с помощью модуля триггерного переключателя MOSFET

My Arduino motor speed controller setup

Я использую потенциометр для управления рабочим циклом ШИМ-сигнала к модулю триггерного переключателя MOSFET, таким образом контролируя скорость двигателя.

В моем коде я использовал функцию map, чтобы использовать полное разрешение моего потенциометра (0 - 1023) и таким образом создать пропорциональный ШИМ - сигнал с помощью функции analogWrite (0-255).

Тем не менее, в моей настройке я хочу ограничить скорость двигателя от выхода за пределы значения MAX_RPM, несмотря на дальнейшее увеличение аналогового значения на входе потенциометра.

Это означает, что я должен постоянно проверять значение RPM (код RPM работает нормально, поэтому я не буду включать его).

Если скорость двигателя достигает значения MAX_RPM, любой дополнительный вход потенциометра следует игнорировать. Чтобы достичь этого, я решил, что мне нужно держать значение функции analogWrite постоянным, таким образом, сохраняя постоянную скорость.

В случае, если я поворачиваю потенциометр в обратном направлении, это должно уменьшить значение ШИМ, таким образом, также уменьшая скорость.

Я написал код для достижения описанного выше процесса безрезультатно, т. Е. Увеличение входного сигнала потенциометра приводит к тому, что скорость выходит за пределы значения MAX_RPM, что нежелательно.

В этом проекте я разрабатываю своего рода ограничитель оборотов.

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

#define MAX_RPM 500
    #define MAX_RPM_PWM_MAPPED_VALUE 15
    
    //In this case, I first ran the motor while monitoring the speed and the potentiometer value
    //While doing this, I noted the potentiometer value at which the MAX_RPM is obtained
    //I then defined this potentiometer value as MAX_RPM_PWM_MAPPED_VALUE
    //With MAX_RPM_PWM_MAPPED_VALUE, I would directly limit the value written to the analogWrite function
    // 
    
    MOSFETMODULE = 4;
    potentiometer = AO;
    
    void setup()
    {
        pinMode(MOSFETMODULE, OUTPUT);
    }
    
    void loop()
    {
        val = analogRead(potentiometer);  //Read potentiometer value - represents accelerator input
        mappedValue = map(val, 0, 1023, 0, 255); //Map the 10 bit value to 8 bit equivalent
        
        if(RPM >= MAX_RPM)
        {
            analogWrite(MOSFETMODULE, MAX_RPM_PWM_MAPPED_VALUE);
        }
            else
            {
              mappedValue = constrain(mappedValue, 0, MAX_RPM_PWM_MAPPED_VALUE);
              analogWrite(MOSFETMODULE, mappedValue); //Output a PWM signal to the MOSFET trigger module
            }
    }

, 👍0

Обсуждение

Обратите внимание, что фактические обороты зависят не только от рабочего цикла ШИМ, но и от нагрузки на двигатель. Все равно что нажать на педаль газа в машине. Если вы не меняете положение педали газа, но внезапно поднимаетесь в гору, ваша скорость снизится., @Gerben

Спасибо, я полностью понимаю сценарий загрузки. На самом деле моя установка направлена на имитацию работы автомобиля - положение дроссельной заслонки и обороты двигателя. Я стремлюсь создать устройство, которое ограничивает скорость двигателя от превышения различных максимальных уровней скорости в зависимости от состояния нагрузки., @Curiousone

Попробуйте использовать " analogWrite(MOSFETMODULE, 0);", когда частота вращения превышает максимальное значение. Или, может быть, использовать "1` вместо "0". Таким образом, код будет дросселировать путь назад, если обороты когда-либо превысят его максимум. If вернется к использованию значения pot, когда обороты снова снизятся. Это может привести к некоторым странным колебаниям, но автомобили тоже издают некоторые странные звуки, когда они находятся на своих максимальных оборотах, так что +1 для реализма., @Gerben

Чтобы выяснить, почему ваш код не работает. В настоящее время он сопоставляет значение pot (0-1023) с рабочим циклом 0-15 ШИМ. Но когда RPM превышает его предел, вы устанавливаете PWM на 15, что является тем же значением, которое вы получаете, когда вы поворачиваете горшок на максимум. Вы хотите отключить ШИМ рабочий цикл, вместо того, чтобы установить его на макс. (Представьте, что вы спускаетесь с холма на машине. Вы не нажимаете на дроссель, но из-за спуска обороты превышают 500. Теперь ваш автомобиль установит дроссель на полную мощность. Ой ;-п ), @Gerben

Я согласен с обоими ответами, они полностью имеют смысл. Давайте попробуем реализовать их в моем коде. Эта проблема заставляет меня глубоко задуматься о том, как электронные дроссели работают в современных картах. Спасибо., @Curiousone


1 ответ


1

Ваша проблема в том, что вы не знаете, какое значение АЦП соответствует максимальному обороту. Если бы вы это сделали, вам не нужно было бы знать RPM.

То, что у вас здесь есть, - это "петля обратной связи", и вам нужен какой-то метод использования обнаруженных оборотов для управления скоростью двигателя.

Вам нужно полностью отсоединить потенциометр от аналоговой записи - потенциометр должен устанавливать желаемую частоту вращения, а не значение, отправляемое для установки частоты вращения.

Поэтому, если вы хотите диапазон оборотов от, скажем, 0 до 100 об / мин, вы можете сопоставить() analogRead() со значениями 0-100. Затем вы можете проверить фактические обороты в минуту и соответствующим образом настроить значение, которое вы посылаете ШИМ - если двигатель работает слишком быстро, то замедлите его. Если он слишком медленный, то ускорьте его.

Для этого используется специальный метод-ПИД. И есть библиотека, которая делает это и для вас:

  • https://playground.arduino.cc/Code/PIDLibrary/

Потенциометр обеспечивает "уставку", обнаружение оборотов в минуту обеспечивает "вход", а библиотека ПИД-сигналов дает вам "выход" для подачи в analogWrite(). Затем вам нужно предоставить специальные магические параметры "настройки", чтобы дать наилучший контроль над вашим мотором.

,

Спасибо за подробный ответ. В этой установке я стремлюсь имитировать сценарий вождения автомобиля, при котором потенциометр является педалью газа, в то время как МОП-транзистор повторяет топливную форсунку, а скорость двигателя повторяет скорость двигателя. По сути, мне нужна была установка, которая ограничивала бы скорость двигателя/двигателя от превышения определенной точки, то есть МАКСИМАЛЬНЫХ оборотов в минуту, независимо от увеличения входного сигнала, а не удержания постоянной скорости. Когда горшок перевернут/педаль отпущена, я также хочу, чтобы скорость двигателя/двигателя соответственно упала. Я просто хочу установить ограничение скорости двигателя. Вместо этого ПИД содержит постоянное значение скорости., @Curiousone

я пытаюсь разработать своего рода ограничитель оборотов **, @Curiousone

@Curiousone может быть что-то вроде if (rpm>max) analogWrite(mosfet, PID_output); else analogWrite(mosfet, analogRead(pot_pin)>>>>>2) может работать, @Sim Son