极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10800|回复: 3

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

[复制链接]
发表于 2014-12-28 20:51:55 | 显示全部楼层 |阅读模式
尊敬的各位大侠、专家、高手:

我打算采用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);  
}




回复

使用道具 举报

 楼主| 发表于 2014-12-28 22:15:00 | 显示全部楼层
哪位大侠帮忙解决下啊,谢谢了。
回复 支持 反对

使用道具 举报

发表于 2014-12-29 09:11:22 | 显示全部楼层
這是我之前的測試結果, 直接用 pulseIn 去讀取時間, 但依然會有機會出現 1% 的誤差.
http://www.geek-workshop.com/thread-11138-1-1.html

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

使用道具 举报

发表于 2014-12-29 19:13:49 | 显示全部楼层
建议取平均值
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 05:21 , Processed in 0.037273 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表