Имитация сигналов квадратурного кодера двигателя с помощью Arduino UNO
Я должен написать raspberry pi и код arduino для чтения оборотов двигателя с кодировщиком, прикрепленным к нему. Однако у меня странные цифры, и я не уверен в спецификациях двигателя и кодера. Поэтому я подумал, что было бы разумно использовать второй arduino для имитации двигателя с кодировщиком.
Имитатор должен будет произвести 2 сигнала, представляющих два сигнала от кодера. Я хочу иметь возможность устанавливать частоту и фазовый сдвиг этих сигналов в программном обеспечении, чтобы имитировать изменения скорости и направления вращения двигателя. Форвард будет иметь один сигнал на 90 градусов впереди, а затем реверс будет иметь тот же сигнал на 90 градусов позади. Так что разность фаз плюс-минус 90 градусов.
Я хотел бы, чтобы в конечном итоге симулятор мог имитировать двигательные действия, такие как колебания между прямым и обратным движением по 5 секунд каждое или вперед в течение 5 секунд, а затем полностью остановиться.
Я нашел этот код от bigjosh, который более или менее то, что я хочу сделать. Однако этот код по умолчанию не допускает смещения на -90 град. Я знаю, что там есть комментарий, чтобы изменить его, но я недостаточно осведомлен, чтобы понять, что именно происходит. Я бы хотел, чтобы кто-нибудь помог мне с этим.
@krusion, 👍2
Обсуждение1 ответ
Ух ты, это оказалось намного сложнее, чем я ожидал. Это очень трудно сделать чисто на таймере AVR. Но я смог придумать эту рабочую функцию, которая, как мне кажется, и есть то, что вы ищете...
// freq_hz - это частота в герцах от 122 до 4 000 000
// shift_deg-это фазовый сдвиг между выходом A и выходом B в градусах (значения от -180 до +180 нормализуются)
// Обратите внимание, что на частотах выше 44 кГц вы потеряете точность фазового сдвига. На частоте 4 МГц все округляется до 0 или +/-90 градусов.
// Обратите внимание, что вся синхронизация происходит с шагом 1/16 МГц, поэтому частоты, которые не попадают на целочисленные мультипулы этого числа, будут примерно одинаковыми.
// Используйте функцию startWaveforms() непосредственно для более точного управления.
void startQuadrature( unsigned long freq_hz , int shift_deg );
Он может давать сбои при запуске, выключении, изменении скорости и направления... но то же самое может сделать и моторный энкодер, так что я думаю, что это нормально. Можно было бы создать версию без глюков, но больше работы.
Репо Github здесь... https://github.com/bigjosh/Quadrature
Итак, чтобы смоделировать двигатель, идущий вперед с частотой импульсов 50 кГц, вы бы использовали что-то вроде...
Стартовая квадратура( 50000 , +90);
...и та же самая частота пульса, идущая в обратном направлении, будет...
Стартовая квадратура( 50000 , -90);
Обратите внимание, что если вы подключите выходной вывод Arduino UNO к входному контакту Raspberry Pi, то это, скорее всего, повредит Pi. Это происходит потому, что UNO выводит 5 вольт для сигнала "1", но Pi может выдержать максимум 3,3 В на любом выводе. Вы можете погуглить "5V 3.3 V level shifting" для решения этой проблемы.
Ух ты! Большое вам спасибо! Я не могу поверить, что ты действительно так выкладывался! Очень признателен, честно говоря. У меня есть пара вопросов: 1. Вы используете программу для имитации arduino и осциллографа или используете реальное оборудование и делаете снимки? 2. На самом деле я получаю много сбоев, которые делают это крайне нестабильным. До такой степени, что у меня это совсем не получается. Я не уверен, что это ошибка с моей стороны (получение arduino) или оборудование не может работать намного лучше. Еще раз спасибо! Для переключения уровня напряжения я собирался использовать резисторы, пока не куплю подходящий модуль, @krusion
@krusion, если вы нашли это полезным, вы должны проголосовать за это., @timemage
бигджош - Отличная работа! Я просто сделал репо и попробовал его на запасном Uno здесь - работает как заклинание, как только я выяснил все свои глупости ;-), @user3765883
@user3765883, это указывает на то, что имеет смысл "принять" его в качестве ответа., @timemage
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Вопрос о различных способах подключения платы драйвера двигателя L298N к Arduino и двигателям и их питания.
- Обратное вращение шагового двигателя
- Неиспользуемые контакты в Arduino L293D motor shield?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как заставить сервопривод вращаться на угол больше 180°
- Остановка/запуск двигателя постоянного тока с концевыми выключателями и кнопкой включения/выключения
в чем заключается ваш вопрос? ... этот сайт предназначен для вопросов и ответов, а не для форума и не для мозгового штурма, @jsotola