Прерывание MSP432 с счетчиком кодера
Я использую MSP432 для проекта, и я хотел бы знать, как генерировать прерывание, когда инкрементальный кодировщик достиг заданного числа. Прерывание должно помешать двигателю двигаться в определенном направлении.
Справочная информация: я использую инкрементальный датчик для управления двигателем кисти. Когда двигатель щетки движется влево или вправо, он механически соединяется с инкрементным датчиком, который считает импульсы или "щелчки". Инкрементальный датчик эффективно контролирует ограничение движения двигателя. То есть, если датчик считывает 20 импульсов в правильном направлении, двигатель должен остановиться. Мой проект имеет два режима работы, управляемых оператором switch-case. Первый - это обычный режим, а второй - режим, в котором пользователь может управлять двигателем с помощью джойстика. Независимо от того, в каком режиме находится программа, двигатель должен остановиться, когда будет достигнут предел движения.
Код Пседо:
Case: Routine Button Mode
{
// Motor executes right, left, right movement routine
digitalWrite(directionMotor,RIGHT); // telling motor what direction to go
analogWrite(pwm_motor2,60); // telling motor to activate at 60% PWM
if(encoder_count == Motion_Limit)
analogWrite(pwm_motor,0); // tell motor to stop
// change direction
digitalWrite(directionMotor,LEFT); // telling motor what direction to go
analogWrite(pwm_motor2,60); // telling motor to activate at 60% PWM
}
Case: Joystick_Control
{
while(analogRead<10) // Joystick is pushed to the left
{
digitalWrite(directionMotor,LEFT); // telling motor what direction to go
analogWrite(pwm_motor2,60); // telling motor to activate at 60% PWM
if(encoder_count == Motion_Limit)
analogWrite(pwm_motor,0); // tell motor to stop
}
while(analogRead>1000) // Joystick is pushed to the right
{
digitalWrite(directionMotor,RIGHT); // telling motor what direction to go
analogWrite(pwm_motor2,60); // telling motor to activate at 60% PWM
if(encoder_count == Motion_Limit)
analogWrite(pwm_motor,0); // tell motor to stop
}
} // end case statement
Опять же, независимо от того, в каком режиме работы находится программа, она должна остановиться, когда будет достигнут счет. Даже после достижения предела движения программа все равно должна позволять джойстику управлять двигателем от предела движения. То есть, если считать == 20 на правом пределе, я все еще могу вести двигатель влево. По сути, датчик должен отслеживать двигатель в любой момент работы.
Вопросы: 1. Как объявить прерывание на MSP432? 2. Могу ли я использовать инкрементальный датчик для прерывания? Большинство примеров, которые я нашел, используют кнопку, которая выводит сигнал высокого или низкого уровня в качестве флага для прерывания. Я не уверен, что могу сделать то же самое с кодировщиком
1 ответ
Ваш код очень похож на код Arduino, чтобы прикрепить прерывание, вы должны использовать функцию attachInterrupt() Arduino. Если вы используете другую высокоуровневую библиотеку поддержки, ее документация должна включать несколько примеров прерываний.
Что касается мяса вашего вопроса.
Ваш инкрементальный энкодер должен иметь две строки, одна для обозначения движения влево, другая для указания движения вправо.
Вам нужно будет изменить глобальную переменную encoder_count вверх и вниз, как указано в этих строках. Это определенно должно быть сделано с использованием прерывания для каждой строки. Прерывание должно срабатывать при переходе по краю, как указано в техническом описании кодера. Нет никакой разницы между срабатыванием по краю кнопки и краю кодировщика (за исключением того, что кнопки имеют грязный характер и должны быть подвергнуты сомнению, найдите пример без размышлений).
Если очень важно остановить двигатель точно по инкрементальному счету, вы можете проверить значения в прерываниях инкрементного увеличения / уменьшения энкодера и при необходимости отключить двигатель.
Однако, вероятно, достаточно сделать тест как часть вашего основного цикла. (Примечание: помните, что вам нужно обращаться с джойстиком по центру.)
Я также рекомендовал бы создать функцию для управления двигателем. Это абстрагирует детали реализации, позволяя вашему главному циклу сосредоточиться на функциональности более высокого уровня. Обеспечение того, чтобы управление двигателем всегда выполнялось одной функцией, также позволяет гарантировать, что ваши пределы всегда применяются.