У меня есть Arduino Mega, подключенная к 6-осевой роботизированной руке.Все 6 прерываний подключены к энкодерам (один контакт энкодера на прерывании, другой на ванильном цифровом входе).Прерывания обрабатываются с помощью этого кода:
void readEncoder1(){
//encoders is a 2d array, where the first d is the axis, and the two pin numbers
//first pin is on an interrupt (CHANGE), and second is a standard digital in
if (digitalRead(encoders[0][0]) == digitalRead(encoders[0][1])) {
positions[0]++;
} else {
positions[0]--;
}
if(servoEnable){
updatePositions(); //// compares positions[] to targets[] and adjusts motor speed accordingly
}
}
Это разработано, чтобы держать руку заблокированной в определенном положении - если arduino обнаруживает, что положение двигателя выключено по определенному порогу, оно обновляетМощность идет на двигатель, чтобы держать руку на месте.
Проблема в том, что, если две или три (или более) оси находятся под нагрузкой (требуется постоянное обновление, чтобы оставаться на месте) или они движутся, Arduino перестанет получать неповрежденные команды на последовательном входе, несколько символов будут удалены.Прерывания, очевидно, выполняются довольно быстро, и по какой-то причине это приводит к повреждению команд.Есть ли способ обойти это?Архитектурно, я делаю это правильно?Мой основной инстинкт - вызывать updatePositions () в главном цикле выполнения, скажем, с интервалом в 100 мс, это значительно уменьшит издержки прерывания?Я думаю, что мой вопрос сводится к тому, как я могу получить надежные последовательные команды в Arduino, даже если все 6 кодировщиков пульсируют?