0

像往常一样,我知道如何通过一些丑陋的补丁工作来绕过这个问题,但我想让它变得优雅:我想为 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 先生

4

1 回答 1

1

您面临一个基本问题:在没有数据的情况下调用 ISR。换言之,不向 ISR 函数提供任何指示其中断源的数据。

基本方法是编写代码的人通过对函数进行硬编码来提供输入和动作之间的联系。您正在寻找的棘手方法是 ISR 可以通过该方法找出来源是什么。

因此,您希望拥有 N 个具有来自正交编码器的 2N 个输入的电机。在 CHANGE 条件下,单个中断处理程序连接到所有输入引脚。所有 N 个电机都调用同一个处理程序。它可以通过将输入引脚与上次调用它的值进行比较来确定要更新哪个电机。如果输入引脚发生变化,则调用该电机。这是一个伪代码

Motor motor1;
Motor motor2;

onSomethingChanged() {
  static int in1aprev, in1bprev;
  static int in2aprev, in2bprev;
  int in1a, in1b;
  int in2a, in2b;
  in1a = digitalRead(....
  same for other in's

  if( (in1a!=in1alast) || (in1b!=in1blast)) {
    motor1.encoderInput(in1a,in1b);
    in1alast = in1a;
    in1blast = in1b;
  }

  if( (in2a!=in2alast) || (in2b!=in1blast)) {
    motor2.encoderInput(in2a,in2b);
    in1a2ast = in2a;
    in1b2ast = in2b;
  }

  return;
} 

不久前,这种类型的功能将在整个芯片中处理(参见可编程中断控制器)。该芯片实现了触发和捕获中断源的所有逻辑。主 CPU 只是得到一个触发器“发生了什么事”。处理程序轮询芯片以询问“发生了什么”。

提供了这种方法后,我不确定我是否会推荐。你不能隐藏你的代码发生了什么。电机必须物理连接到正确的引脚。你消耗了一种稀缺资源——你必须告诉人们。

于 2013-06-18T05:52:35.497 回答