Программирование
- Войдите на сайт для отправки комментариев
Доброго времени суток, господа. Хочу сразу предупредить что не силен в программирований. В общем столкнулся с такой задачей, что нужно установить обратную связь с частотником который управляет двигателем. Двигатель нагнетает воздух в трубу, а уже в трубе есть шарик. Который, естественно, поднимается вверх или опускается в зависимости от того как меняеться частота.
Так же в трубе есть отверстия и что то вроде заслонки в ввиде диафрагмы фотоапарата. Таким образом при перекрываний одних из этих штук шарик поднимается.
Задача в том чтобы заставить Ардуино снизить или повысить частоту чтобы ранне упомянутый шар стоял на месте.
Мое творение работает с ЦАПом так как аналоговые входы ПЧ реагирует только на 0-10В. И расчитывает положение шарика с помощью Ультрозвукового датчика дальности HС-SR501. Все устройства работают нормально, но возникла проблема в коде.
После того как МК получает данные с датчика он решает повысить или понизить напряжение. Реализовал я это с помощью оператора for. Выглядит это так:
for (int i=level; dis<q; i++){ K = (byte(i)); digitalWrite(2, bitRead(K, 7)); digitalWrite(3, bitRead(K, 6)); digitalWrite(4, bitRead(K, 5)); digitalWrite(5, bitRead(K, 4)); digitalWrite(6, bitRead(K, 3)); digitalWrite(7, bitRead(K, 2)); digitalWrite(8, bitRead(K, 1)); digitalWrite(9, bitRead(K, 0)); delay(500); } for (int i=level; dis>q; i--) { K = (byte(i)); digitalWrite(2, bitRead(K, 7)); digitalWrite(3, bitRead(K, 6)); digitalWrite(4, bitRead(K, 5)); digitalWrite(5, bitRead(K, 4)); digitalWrite(6, bitRead(K, 3)); digitalWrite(7, bitRead(K, 2)); digitalWrite(8, bitRead(K, 1)); digitalWrite(9, bitRead(K, 0)); delay(500); }
После того как он проверяет условие и начинает повышать или понижать его уже не остановить. В идеале хотелось бы добиться чтобы МК после повышения значения i на 1 еденицу снова мерил растояние шарика и проверял условие. Этого я добиться не смог. Прошу помощи у адекватных професионалов, которые объяснят как же мне этого добиться. Заранее спасибо!
Полный код (если кому интересно) приведен ниже.
#define trigPin 10 #define echoPin 11 #define keyPin 12 #define diodPin 13 unsigned int K=0; unsigned int Q; long dur; int dis; int q=0; void setup() { //Распиновка Serial.begin(9600); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(keyPin, INPUT); } void loop() { // Начало Работы Датчика digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); dur = pulseIn(echoPin, HIGH); dis = (dur/29.1)/2; dis = constrain(dis,0,50); int level = map(dis,0,50,0,255); //Запоминание if (keyPin, HIGH) { digitalWrite(diodPin, HIGH); delay(500); digitalWrite(diodPin, LOW); int q=level; } //Условия for (int i=level; i<q; i++){ K = (byte(i)); digitalWrite(2, bitRead(K, 7)); digitalWrite(3, bitRead(K, 6)); digitalWrite(4, bitRead(K, 5)); digitalWrite(5, bitRead(K, 4)); digitalWrite(6, bitRead(K, 3)); digitalWrite(7, bitRead(K, 2)); digitalWrite(8, bitRead(K, 1)); digitalWrite(9, bitRead(K, 0)); delay(500); } for (int i=level; i>q; i--) { K = (byte(i)); digitalWrite(2, bitRead(K, 7)); digitalWrite(3, bitRead(K, 6)); digitalWrite(4, bitRead(K, 5)); digitalWrite(5, bitRead(K, 4)); digitalWrite(6, bitRead(K, 3)); digitalWrite(7, bitRead(K, 2)); digitalWrite(8, bitRead(K, 1)); digitalWrite(9, bitRead(K, 0)); delay(500); } // Вывод данных на монитор Serial.print(dis); Serial.println("cm"); delay(500); }
if
(keyPin, HIGH) - ???!!!
После 50-й строки вообще ход мысли путаный. У Вас ЦАП - начните с схемы.
Это можете игнорировать, нужна для работы с ПЧ. Видите ли МК должен отталкиваться от какой то высоты. После того когда я задал высоту (через регулировку частоты на ПЧ) я нажимаю кнопку и данная высота равняеться q и управление переходит к МК. Далее как видно в коде q и начальная дистанция сравнивается и далее выполняется код (добавляет +1 или -1). Просто я не могу заставить МК после каждого +-1 снова проверить условие. Для меня это очень сложно обьяснить это на словах. Так как начинаеться какой то когнетивный дессонанс. Так что если сильно будет нужно постараюсь донести свою мысль в ввиде блок-схемы чуть позже.
p.s. ЦАП работает идеально, схема впорядке.