いつものように、いくつかの醜いパッチ作業でこの問題を回避する方法は知っていますが、それをエレガントにしたいと思います: Arduino によってコマンドされるモーター用の小さなラッパーを作成したいと思います。速度を決定するために、右のステップ カウンター (モーター クラスのメンバー変数) を変更する必要があるためです。ただし、これらの関数は明らかに同じ処理を行います...私の質問は、固有の割り込みルーチンで変更するカウンターをどのように決定できますか?
これが私がこれまでに持っているものです。ユーザーからの割り込みを隠したいと思います。
class Motor {
volatile int counter;
unsigned long lastUpdate; //Last timestamp update (for calculating the rate)
static const unsigned int RESOLUTION = 1024; //Number of steps in one rev
static const unsigned int RPMS_TO_RPM = 60000; //Convers rev/ms to rpm
public:
Motor() : counter(0)
{
lastUpdate = millis();
}
void encoderInput(bool pinA, bool pinB)
{
counter += (pinA ^ pinB)*(-1)+!(pinA ^ pinB);
}
int getRate() {
int ret = float(counter)/RESOLUTION/(millis() - lastUpdate)*RPMS_TO_RPM;
lastUpdate = millis();
counter = 0;
return ret;
}
};
/* Example:
* Motor motor1;
*
* void motor1_isr(void) {
* motor1.encoderInput(PIN_A, PIN_B);
* }
*
* void setup() {
* attachInterrupt(PIN_I, motor1_isr, CHANGE);
* Serial.begin(9600);
* }
*
* void loop() {
* Serial.println(motor1.getRate());
* delay(1000);
* }
*/
助けてくれてありがとう、それが終わったら他の人にも役立つと思います:)
よろしく、 ミスター・ミステール