2013-12-22 237 views
0

我試圖將我的arduino板連接到我的RC接收器。我有接收機使用一個非常標準的4xAA包供電,並且我有一個接收器的通道連接到arduino上的端口7(我嘗試了幾個不同的引腳)。下面的代碼只返回8000的範圍內的數字(有時是9000,有時是7000),但是當我將控制從發射機應用到通道時,這並不會改變。更值得一提的是,即使從接收器拔下端口7的電線(但仍連接到arduino),數字仍會返回。這有意義嗎?有什麼想法嗎?Arduino pulseIn返回奇怪值

int pin = 7; 
unsigned long duration; 

void setup() 
{ 
    pinMode(pin, INPUT); 
    Serial.begin(9600); // Pour a bowl of Serial 
} 

void loop() 
{ 
    duration = pulseIn(pin, LOW); 
    Serial.print("Channel 1:"); // Print the value of 
    Serial.println(duration);  // each channel 
} 

回答

1

只是爲了澄清,你想測量R/C接收器輸出信號的脈衝寬度嗎?要做到這一點,你需要使用中斷。我這樣做的方法如下:

volatile int16_t pwm = 0; //pwm value 
volatile int16_t trig = 0; //timer value 
#define pin 7 //pin the interrupt is attached to 

void intHandler() //function to call on interrupt 
{ 
    if(digitalRead(pin)) //if the pin is HIGH, note the time 
    { 
    trig = micros(); 
    } 
    else 
    { 
    pwm = micros()-trig; //if it is low, end the time 
    } 
} 

void setup(){ 
    pinMode(pin, INPUT); //set the pin to input 
    attachInterrupt(pin,intHandler,CHANGE); //attach the interrupt function "intHandler" to "pin" whenever the state changes 
    Serial.begin(9600); //begin serial comms 
} 

void loop() 
{ 

    Serial.print("PWM = "); 
    Serial.println(pwm); 
} 

請注意,這可能僅適用於Arduino的到期,其已經擴展了中斷處理能力。但是,這應該給你如何去做的一般想法。中斷功能僅適用於certain pins,這可能是pulseIn函數不適用於您的原因。

+0

這是有道理的。我會試一試。謝謝! – kschembri

+0

如果這對你有用,我會很高興將它標記爲答案。如果沒有,讓我們看看我們是否可以搞清楚。 – achase90

+0

嗨achase90,你的解決方案的工作原理,但真正的問題是由我的不適當的地面引起的。這是造成奇怪的數字,而不是代碼本身。我投票給你,因爲你的解決方案在長期運作,但不會解決眼前的問題:) – kschembri