Прерывание MSP432 с счетчиком кодера - PullRequest
0 голосов
/ 20 ноября 2018

Я использую MSP432 для проекта, и я хотел бы знать, как генерировать прерывание, когда инкрементный кодер достиг заданного числа. Прерывание должно помешать двигателю двигаться в определенном направлении.

Справочная информация: я использую инкрементальный датчик для управления двигателем щетки. Когда двигатель щетки движется влево или вправо, он механически соединяется с инкрементным датчиком, который считает импульсы или «щелчки». Инкрементальный датчик эффективно контролирует ограничение движения двигателя. То есть, если датчик считывает 20 импульсов в правильном направлении, двигатель должен остановиться. Мой проект имеет два режима работы, управляемых оператором switch-case. Первый - это обычный режим, а второй - режим, в котором пользователь может управлять двигателем с помощью джойстика. Независимо от того, в каком режиме находится программа, двигатель должен остановиться, когда будет достигнут предел движения.

Код Psedo:

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 Ответ

0 голосов
/ 20 ноября 2018

Ваш код очень похож на код Arduino, чтобы прикрепить прерывание, вы должны использовать функцию attachInterrupt () Arduino.Если вы используете другую высокоуровневую библиотеку поддержки, ее документация должна включать несколько примеров прерываний.


Что касается сути вашего вопроса.

Ваш инкрементальный кодировщик должен иметь две строки,один для указания движения влево, другой для указания движения вправо.

Вам нужно будет изменить глобальную переменную encoder_count вверх и вниз, как указано этими строками.Это определенно должно быть сделано с использованием прерывания для каждой строки.Прерывание должно срабатывать при переходе по краю, как указано в техническом описании кодера.Нет разницы между срабатыванием по краю кнопки и по краю энкодера (за исключением того, что кнопки грязные и требуют разбора, найдите необъявленный пример).

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

Однако, вероятно, достаточно выполнить тест как часть вашего основного цикла.(Примечание: помните, что вам нужно обращаться с джойстиком по центру.)

Я бы также порекомендовал создать функцию для управления двигателем.Это абстрагирует детали реализации, позволяя вашему главному циклу сосредоточиться на функциональности более высокого уровня.Обеспечение того, чтобы управление двигателем всегда выполнялось одной функцией, также позволяет гарантировать, что ваши пределы всегда применяются.

...