Мгновенная остановка двигателя при неисправности датчика Холла
У меня проблема с остановкой двигателя в том же месте, когда магнит проходит.. Я попытался добавить прерывание и сделать код как можно более чистым, но пока без радости. Есть какие-нибудь предложения? sw добавит позже, просто игнорируйте..
byte outPin = 12; // the number of the output pin
byte inPin = 2; // the number of the input pin
byte hallPin = 3; // hall sensor
byte sw;
byte previous;
int state = LOW; // the current state of the output pin
int reading; // the current reading from the input pin
void setup()
{
pinMode(inPin, INPUT_PULLUP);
pinMode(outPin, OUTPUT);
pinMode(hallPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(hallPin), stop, FALLING); //hall read low when magnet pass
}
void loop()
{
sw=0;
reading = digitalRead(inPin); //read(LOW when press!)
if (reading == HIGH) previous=0;
if (previous == 1 && sw == 0) state=LOW;
else if (reading == HIGH) state=LOW;
else state=HIGH;
digitalWrite(outPin, state);
}
void stop() {
if (sw == 0 && reading == LOW) {
state=LOW;
previous=1;
}
}
@Milos, 👍1
Обсуждение2 ответа
Вы можете быстрее остановить BDC, если закоротите его. Это возможно с помощью H-образного моста и соответствующих компонентов.
Было бы проще использовать L293D, который уже обеспечивает этот режим.
Если вы хотите попробовать это с помощью этого компонента, конечно, вы также можете построить h-мост самостоятельно, обратите внимание на D на компоненте. В версии D защитные диоды уже встроены. Вы можете питать два двигателя напряжением от 4,5 В до 36 В с максимальным током 600 мА.
До 2A вы можете использовать L298N.
Возможно, он сможет остановить его еще быстрее, включив его в обратном направлении на очень короткое время. Однако текущая ничья может быть очень большой., @Edgar Bonet
@Georg Спасибо за рекомендацию, рассмотрю, если ни один код не даст приемлемого результата, @Milos
Двигатель не может остановиться мгновенно, потому что у него есть инерция, плюс инерция всего, что движется двигателем.
Поэтому, если вы хотите, чтобы он остановился в заданном положении, вы должны замедлить его, прежде чем он достигнет желаемого положения, чтобы он остановился там, где вы хотите. Это невозможно сделать только с одним датчиком.
Сложным решением было бы использовать кодер положения, такой как поворотный кодер, чтобы всегда знать положение, поэтому вы могли бы использовать алгоритм управления, такой как PID на двигателе. Это обеспечивает большинство функций, так как затем вы можете установить желаемое положение остановки в программном обеспечении без необходимости перемещать датчик.
Если положение остановки никогда не перемещается, то более простым решением является использование нескольких датчиков. Так часто бывает с лифтами: есть датчик, который точно выравнивает лифт с полом, на котором он должен остановиться, но есть также несколько других, расположенных чуть раньше, на дорожке, чтобы сообщить контроллеру, что пришло время начать замедляться, затем замедлиться до ползания, а затем остановиться.
Чтобы все было просто, вы можете использовать всего два датчика: когда он пройдет мимо первого, замедлите двигатель до ползания. Когда он активирует второй датчик, так как он работает медленно, он быстро остановится и окажется там, где вы хотите.
- Не удалось получить показания для "Двигателя с энкодером"
- Как предотвратить помехи между двигателем постоянного тока и Arduino?
- Тахометр на базе Леонардо?
- Работа двигателя в течение 3 секунд непрерывно с прерыванием и без него
- Прерывание запуска двигателей
- Использование прерывания внутреннего таймера для чтения аналогового датчика
- Управление скоростью BLDC со встроенным контроллером (Hall out, PWM in)
- Проблемы с ШИМ и подключением прерываний
С какой именно проблемой вы столкнулись?, @Coder9390
ну, код работает, но у меня возникают задержки, и двигатель не останавливается мгновенно... есть ли способ еще больше улучшить код?, @Milos
Вы можете улучшить его, переключив объявление
состояние " на
изменчивое состояние bool` ..., @timemage`двигатель не останавливается мгновенно"... можете ли вы мгновенно остановить машину?, @jsotola
@timemage попробует это сделать, спасибо, @Milos
@jsotola это верно, но я имел в виду, по крайней мере, примерно на том же месте, по крайней мере..., @Milos
мгновенная остановка и остановка в выбранном месте-это две разные вещи ... подумайте о том, чтобы остановить машину у знака "Стоп"... как это делается? ... двигатель ведет себя так же, как и автомобиль, @jsotola
Я не замечал этого раньше, но то же самое с " sw " и "предыдущим" в отношении "изменчивости". Если они не учитывают проблему, вы можете обновить код, чтобы включить их, чтобы их больше не было, чтобы отвлечь внимание от реальной проблемы., @timemage
@милос, какой платой ты пользуешься?, @Coder9390
@Coder9390 Микро arduino, @Milos