Измерьте положение шестерни с помощью ардуино

ir

Итак, мой план состоит в том, чтобы иметь возможность вращать двигатель с шестерней на конце на определенное количество зубьев шестерни, а затем останавливать его. Я не могу найти техническое описание двигателя, но он очень быстрый, щеточный и работает на постоянном токе. Я думал поставить что-то вроде здесь и показывает положения коллектора, эмиттера, анода и катода.

, 👍0

Обсуждение

Я знаю, это совсем бесполезно, но я не смог найти техпаспорт, и я хотел сказать, что это происходит слишком быстро, чтобы увидеть, @Vosem Media

вы, конечно, можете попробовать этот датчик .... покрасить один из зубьев шестерни в белый цвет, @jsotola

Я уверен, что Arduino достаточно быстр, чтобы считывать частоту шестерни., @Juraj

Вы можете попробовать использовать энкодер, прикрепленный к валу двигателя, таким образом, вы можете измерить количество шагов за оборот и, таким образом, вы можете рассчитать, когда и как вы поворачиваете двигатель. Или просто поставить шаговый двигатель. А для беспокойства о том, что Arduino недостаточно быстр, вы можете использовать очень быстрые прерывания., @Coder_fox

к сожалению, для применения в страйкболе он должен быть очень компактным и располагаться под снаряжением, поэтому я подумал, что использование какого-либо ИК-датчика будет уместным., @Vosem Media


1 ответ


Лучший ответ:

2

Если мне не изменяет память, тактовая частота Arduino Uno составляет 16 МГц. Некоторые из них быстрее, некоторые намного быстрее, а некоторые медленнее.

Большинство инструкций на ассемблере занимают около 1–3 тактов. Некоторые берут больше. Предполагая, что в среднем 3 такта на инструкцию, это соответствует выполнению более 5 миллионов инструкций в секунду.

Поэтому, если ваш двигатель не приближается к сверхзвуковой скорости, Arduino должна быть в состоянии «не отставать» от датчика вашего двигателя в вашей функции loop().

Если вы выполняете несколько других действий в своем цикле, вы можете рассмотреть возможность использования прерывания для запуска некоторого кода, когда мотор «активирует» датчик. В этом случае вам вряд ли вообще придется беспокоиться о скорости процессора. При использовании прерывания вам не нужно беспокоиться об опросе состояния вашего датчика внутри функции loop().

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

Сказав все это, вам все равно придется проделать некоторую работу, чтобы получить наиболее подходящую реализацию, поскольку только вы знаете, какие еще вещи вам нужно принять во внимание в это время.

Еще одна вещь, которую следует отметить, это то, что одна инструкция высокого уровня обычно соответствует более чем одной инструкции ассемблера. Даже такой простой оператор, как int x = 1000;, будет более чем одной ассемблерной инструкцией и, таким образом, займет более 1 такта. Однако, если память не изменяет, отдельные инструкции, сгенерированные для выполнения x = 1000, займут всего один такт часов.

Другие будут варьировать количество инструкций, которые генерируются для их выполнения. Например float х = 1,0; х = х + 2,0;

скорее всего, для выполнения потребуется больше инструкций, чем для целочисленного аналога: интервал х = 1; х = х + 2

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

,

Большое спасибо, это невероятно полезно. Мне придется попытаться сжать мой код. Вы знаете, уловит ли этот датчик передачу, даже если она не окрашена в белый цвет? Спасибо, @Vosem Media

Извините, я не знаком с этим конкретным датчиком. Я предлагаю внимательно изучить лист данных на веб-странице; Запрос у производителя; И/или разместить новый вопрос здесь или на сайте [Электроника](https://electronics.stackexchange.com/)., @GMc

Ладно, сначала посмотрю даташит. Спасибо, @Vosem Media