Регулятор расхода жидкости

Roman
Offline
Зарегистрирован: 15.02.2013

Здравствуйте.

Собираю регулятор расхода жидкости на Arduino MEGA, а точнее на его копии SainSmart Mega2560. В качестве датчика расхода стоит расходомер на основе датчика Холла. Для подачи жидкости используется НШ (насос шестеренчатый), приводом которому служит обычная дрель. Дрель будет подключатся не к переменке 220В, а к постоянке 220В. Между силовой частью и Мегой будет опто развязка. Силовая часть с опто развязкой уже собрана. Сейчас жду приезда Меги и тем временем пишу прошивку. Нужна библиотека ПИД регулятора (на счет PID_v1 я вкурсе, но в ней, если я не ошибаюсь, обратная связь идет по аналоговому сигналу, а мне нужно по дискретному (импульсному)). Можно написать библиотеку самому, но в программировании я не слишком силен, по этому обращаюсь к Вам.

Если кто то может помочь, отзовитесь. Буду очень благодарен.

 

 

Roman
Offline
Зарегистрирован: 15.02.2013

Свою прошивку, пока нет реального контроллера, проверяю на Протеусе (7.9).

Есть один нюанс, в Протеусе, не могу работать с аналоговыми входами. Не могу понять в чем проблема. Может что то надо настроить, или он в принципе не может работать с аналоговыми входами? Также пробовал другие версии Протеуса (7,8 и 7,10) никаких изменений.

Программу пишу в arduino-1.0.2, и созданный ею hex гружу в Протеус.

Кто в курсе, подскажите что можно сделать.

renych
Offline
Зарегистрирован: 29.03.2013

Программировал датчик расхода (хола) с выводом на жкэ.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 8);
boolean lastButton = LOW;

volatile int NbTopsFan; //measuring the rising edges of the signal
float Calc;
int hallsensor = 2; //The pin location of the sensor

void rpm () //This is the function that the interupt calls
{
NbTopsFan++; //This function measures the rising and falling edge of the
}
// The setup() method runs once, when the sketch starts
void setup() //
{
pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
pinMode(9, OUTPUT);
analogWrite(9, 50);
Serial.begin(9600); //This is the setup function where the serial port is
attachInterrupt(0, rpm, RISING); //and the interrupt is attached
}
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()
{
NbTopsFan = 0; //Set NbTops to 0 ready for calculations
sei(); //Enables interrupts
delay (300); //Wait 1 second
cli(); //Disable interrupts
Calc = (NbTopsFan * 217.5 / 7.5); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour
Serial.print (Calc, DEC); //Prints the number calculated above
Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a new line
lcd.begin(8, 2);
// печать сообщения на LCD.
lcd.setCursor(0, 0);
lcd.print("Q=");
lcd.print(Calc, DEC);
lcd.setCursor(0, 1);
lcd.print("q=");
lcd.print(Calc*0.015, DEC);
}

"217.5" - подгонял путем измерения расхода.

maksim
Offline
Зарегистрирован: 12.02.2012
vlkam
Offline
Зарегистрирован: 17.02.2013

Roman пишет:
Дрель будет подключатся не к переменке 220В, а к постоянке 220В. .... Силовая часть с опто развязкой уже собрана.

И это работает ?

Roman
Offline
Зарегистрирован: 15.02.2013

vlkam пишет:

Roman пишет:
Дрель будет подключатся не к переменке 220В, а к постоянке 220В. .... Силовая часть с опто развязкой уже собрана.

И это работает ?

да, рабоет!

Roman
Offline
Зарегистрирован: 15.02.2013

renych пишет:

Программировал датчик расхода (хола) с выводом на жкэ.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 8);
boolean lastButton = LOW;

volatile int NbTopsFan; //measuring the rising edges of the signal
float Calc;
int hallsensor = 2; //The pin location of the sensor

void rpm () //This is the function that the interupt calls
{
NbTopsFan++; //This function measures the rising and falling edge of the
}
// The setup() method runs once, when the sketch starts
void setup() //
{
pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
pinMode(9, OUTPUT);
analogWrite(9, 50);
Serial.begin(9600); //This is the setup function where the serial port is
attachInterrupt(0, rpm, RISING); //and the interrupt is attached
}
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()
{
NbTopsFan = 0; //Set NbTops to 0 ready for calculations
sei(); //Enables interrupts
delay (300); //Wait 1 second
cli(); //Disable interrupts
Calc = (NbTopsFan * 217.5 / 7.5); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour
Serial.print (Calc, DEC); //Prints the number calculated above
Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a new line
lcd.begin(8, 2);
// печать сообщения на LCD.
lcd.setCursor(0, 0);
lcd.print("Q=");
lcd.print(Calc, DEC);
lcd.setCursor(0, 1);
lcd.print("q=");
lcd.print(Calc*0.015, DEC);
}

"217.5" - подгонял путем измерения расхода.

спасибо!

уже все собрано и находится на стадии тестирования!

если кого то интересует такой дивайс, пишите.

renych
Offline
Зарегистрирован: 29.03.2013

Roman  подскажи пожалуйста как правильно подключить оптопару, какие резисторы куда втыкать и как определить, что она правильно подключена, а то я уже 2 дня мучаюсь? Оптопара от принтера HP. 

renych
Offline
Зарегистрирован: 29.03.2013

У оптопары 4 контакта, а провода три. Какие 2 контакта объеденены?

Roman
Offline
Зарегистрирован: 15.02.2013

renych пишет:

Roman  подскажи пожалуйста как правильно подключить оптопару, какие резисторы куда втыкать и как определить, что она правильно подключена, а то я уже 2 дня мучаюсь? Оптопара от принтера HP. 

это частичная схема оптопары, где источник света - светодиод, а приемник - фотодиод. соединены вместе могут быть как катоды (2,4) так и аноды (1,3). в вашем случаи нужно смотреть даташит к вашей оптопаре.

подбор резисторов, также нужно делать исходя из данных оптопары в даташите.

Osseum
Offline
Зарегистрирован: 25.04.2013

Величина NbTopsFan пропорциональна расходу, поэтому с ней можно работать посредством ПИД библиотеки.

Могут быть проблемы, связанные с немгновенностью измерения расхода:

29) delay (300); //Wait 1 second