dabham 发表于 2014-12-28 20:51:55

求教:用Arduino 2560 采集 4路 PWM信号

尊敬的各位大侠、专家、高手:

我打算采用ArduinoMega2560板子采集4路PWM输入,然后再由arduino混合生成6路PWM波,驱动舵机。

4路采用外部中断,然而,在串口监视上显示四路的值有4-6us的抖动,输出的舵机也随之有抖动。

请问各位尊敬的大侠、专家、高手改如何解决?不胜感激。

ARDUINO 采集代码
int pwm1 = 21;
int pwm2 = 20;
int pwm3 = 19;
int pwm4 = 18;

unsigned long rc1_PulseStartTicks,rc2_PulseStartTicks, rc3_PulseStartTicks, rc4_PulseStartTicks;      
volatile int rc1_val, rc2_val, rc3_val, rc4_val;

void setup() {

      Serial.begin(11500);


      pinMode(pwm1, INPUT);
      pinMode(pwm2, INPUT);
      pinMode(pwm3, INPUT);
      pinMode(pwm4, INPUT);


      attachInterrupt(2, rc1, CHANGE);   
      attachInterrupt(3, rc2, CHANGE);
      attachInterrupt(4, rc3, CHANGE);
      attachInterrupt(5, rc4, CHANGE);

}

void rc1()
{

      if (digitalRead( pwm1 ) == HIGH)
                rc1_PulseStartTicks = micros();    // store the current micros() value
      else
                rc1_val = micros() - rc1_PulseStartTicks;
}

void rc2()
{

      if (digitalRead( pwm2 ) == HIGH)
                rc2_PulseStartTicks = micros();   
      else
                rc2_val = micros() - rc2_PulseStartTicks;
}
void rc3()
{

      if (digitalRead( pwm3 ) == HIGH)
                rc3_PulseStartTicks = micros();   
      else
                rc3_val = micros() - rc3_PulseStartTicks;
}
void rc4()
{

      if (digitalRead( pwm4 ) == HIGH)
                rc4_PulseStartTicks = micros();   
      else
                rc4_val = micros() - rc4_PulseStartTicks;
}

void loop() {


      Serial.print("channel 1:");
      Serial.print(rc1_val);
      Serial.print("    ");
      Serial.print(" channel 2:");   
      Serial.print(rc2_val);
      Serial.print("    ");
      Serial.print(" channel 3:");   
      Serial.print(rc3_val);
      Serial.print("    ");
      Serial.print(" channel 4:");   
      Serial.println(rc4_val);
}




dabham 发表于 2014-12-28 22:15:00

哪位大侠帮忙解决下啊,谢谢了。

Super169 发表于 2014-12-29 09:11:22

這是我之前的測試結果, 直接用 pulseIn 去讀取時間, 但依然會有機會出現 1% 的誤差.
http://www.geek-workshop.com/thread-11138-1-1.html

基本上讀 2 次就應該最少有一次是正確的, 只要加入多次讀取(最好三次或以上)再取其最大值, 應該可以得出準確的數值.

suoma 发表于 2014-12-29 19:13:49

建议取平均值
页: [1]
查看完整版本: 求教:用Arduino 2560 采集 4路 PWM信号