Помощь в коде. (Датчик холла)
- Войдите на сайт для отправки комментариев
Чт, 13/04/2017 - 09:41
Добрый день, хочу сделать блокировку реверса двигателя, чтобы небыло лишних токов при его реверсирование, Решил применить датчик холла и магнит. Даже нашел подходящий скетч, только вот проблемма в том, что не могу дописать пару строчек, чтобы реле блокировало переключатель, пока двигатель вращаеться.
Логика следующая, если на датчик холла поступает сигнал привышающий к примеру 10 об/мин. реле размыкает свои контакты и блокирует кнопку, как обороты упали ниже 10 об/мин, контакты замыкаются и реверс разрешен.
Как говориться помогите кто чем может) Что-то всю голову сломал)))
За основу брал этот код, он рабочий в монитор выводит показания.
unsigned long lastflash;
int RPM;
void setup() {
Serial.begin(9600); //открыть порт
attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
pinMode(3, OUTPUT); //3 пин как выход
digitalWrite(3, HIGH); //подать 5 вольт на 3 пин
}
void sens() {
RPM=60/((float)(micros()-lastflash)/1000000); //расчет
lastflash=micros(); //запомнить время последнего оборота
}
void loop() {
if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
RPM=0; //считаем что RPM 0
}
Serial.println(RPM); //вывод в порт
delay(50); //задержка для стабильности
}
Как говориться помогите кто чем может) Что-то всю голову сломал)))
voviklost, Вы лучше почините голову и напишите эту несчастную строчку сами. Задача для пятикласника на уроке информатики. Даже неудобно как-то. Или Вы и есть пятикласник?
Теперь чувствую себя пятикласником))) Проблема у меня в чем возникла, я пока в железе это не собирал, пользовался эмулятором, за место датчика холла ставил источник питания с регулеровкой скважности импульсов. На некоторых моментах при работающем двигателе когда блокировка должна быть включена, она самопроизвольно отключалась, и не выключалась до перезагрузки схемы. Возможно это косяк эмулятора. но меня это насторожило.
Вот код который я написал:
unsigned long lastflash; int RPM; void setup() { Serial.begin(9600); //открыть порт attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала pinMode(3, OUTPUT); //3 пин как выход pinMode(5, OUTPUT); //5 пин как выход digitalWrite(3, HIGH); //подать 5 вольт на 3 пин } void sens() { RPM=1/((float)(micros()-lastflash)/1000000); //расчет lastflash=micros(); //запомнить время последнего оборота } void loop() { if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды RPM=0; //считаем что RPM 0 } if ((RPM) > 5){ //если обороты больше 5 об/сек digitalWrite(5, HIGH); // включаем выход 5 } else{ // в противном случае digitalWrite(5, LOW); // выключаем выход 5 } Serial.println(RPM); //вывод в порт delay(50); //задержка для стабильности }Ну, молодец! И зачем было вопросы задавать, если сами умеете?
Собрал все в железе, лагов пока не возникло, завтра установлю все стационарно и буду полноценно прорабатывать. А вопрос возник из за того, что я пол дня в эмуляторе наблюдал непонятные включения непонятно отчего происходящие. Возможно это из за того, что вместо датчика стоял генератор импульсов. Пока вопрос остаётся загадкой для меня(
Уважаемые знатоки, на данный момент код превратился вот в это:
unsigned long lastflash; int RPM; int button1 = 5; // номер входа, подключенный к кнопке int button2 = 8; // номер входа, подключенный к кнопке void setup() { Serial.begin(9600); //открыть порт attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала pinMode(12, OUTPUT); //12 пин как выход pinMode(10, OUTPUT); //10 пин как выход pinMode(9, OUTPUT); //9 пин как выход pinMode(4, OUTPUT); //4 пин как выход pinMode(11, OUTPUT); //11 пин как выход digitalWrite(12, HIGH); //подать 5 вольт на 3 пин pinMode(5, INPUT); //5 пин как вход pinMode(8, INPUT); //8 пин как вход } void sens() { RPM=1/((float)(micros()-lastflash)/1000000); //расчет lastflash=micros(); //запомнить время последнего оборота } void loop() { if ((micros()-lastflash)>2000000){ //если сигнала нет больше 2х секунд RPM=0; //считаем что RPM 0 } if ((RPM) >= 1 && (RPM) <= 100){ //если обороты больше 0 digitalWrite(9, HIGH); // включаем выход 9 } else { // в противном случае digitalWrite(9, LOW); // выключаем выход 9 } if (((RPM) > -1 && (RPM) < 1) && (digitalRead(button1) == HIGH) && (digitalRead(button2) == LOW)) { //Если обороты меньше или равны 0, если нажата первая кнопка и не нажата кнопка 2 digitalWrite(10, LOW); //Включаем реле } else if (digitalRead(button1) == LOW) { //если кнопка 1 выключена digitalWrite(10, HIGH); //выключаем реле } if (((RPM) > -1 && (RPM) < 1) && (digitalRead(button2) == HIGH) && (digitalRead(button1) == LOW)) { //Если обороты меньше или равны 0, если нажата вторая кнопка и не нажата кнопка 1 digitalWrite(11, LOW); //включаем реле } else if (digitalRead(button2) == LOW) { //если кнопка 2 выключена digitalWrite(11, HIGH); //выключаем реле } if (digitalRead(button1) == HIGH) { //Если включена первая кнопка digitalWrite(4, LOW); //Включаем блокировку } else if (digitalRead(button2) == HIGH) { //Если включена вторая кнопка digitalWrite(4, LOW); //включаем блокировку } else { //если кнопка 1 выключена digitalWrite(4, HIGH); //выключаем блокировку } Serial.println(RPM); //вывод в порт delay(50); //задержка для стабильности }Вместо кнопки используется джойтик с фиксацией, возникла проблемма следующего характера, при резком переключение джойтика возникают помехи которые я так и не смог убрать в железе, и блокировка не работает. Есть идея добавить в строчку:
if (((RPM) > -1 && (RPM) < 1) && (digitalRead(button1) == HIGH) && (digitalRead(button2) == LOW)) { //Если обороты меньше или равны 0, если нажата первая кнопка и не нажата кнопка 2 digitalWrite(10, LOW); //Включаем релеЗедержку, чтобы при отключение кнопки помехи проходили сами собой. Пробывал delay, но он останавливает скетч и происходит бред. Прошу помоши более грамотных форумчан.
возникают помехи которые я так и не смог убрать в железе,
Есть 100500 способов убрать дребезг аппаратно и ещё 100500 - программно.
Вот хорошая статья о том как это делается и аппаратно, и программно.