像往常一样,我知道如何通过一些丑陋的补丁工作来绕过这个问题,但我想让它变得优雅:我想为 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);
* }
*/
感谢您的帮助,我认为一旦完成它对其他人也有用:)
问候,Mystère 先生