2013-02-15 34 views
1

我使用Arduino進行了一些編程,但是我遇到了問題。在loop()函數中,我想爲每個執行loop()函數的變量添加值pwm。我從我寫的一些函數中獲得這個值,並用命令pwm += result將它添加到pwm,但它不起作用。如果我打印pwm,我總是得到零。即使打印result給了我一些非零值。整個代碼:Arduino添加作業

float pwm = 0; 
float result = 0; 

void loop(){ 

    .... 

    errV = w - cm; 
    errDtV = errOldV - errV; 

    result = flc->cog(errV, errDtV); 

    Serial.print("RESULT: "); 
    Serial.println(result); 

    pwm += result; 
    Serial.println(pwm); 
} 

和輸出是這樣的:

RESULT: 31.98 
0.00 

可能是什麼問題?

編輯:這裏是整個小品

#include "FSet.h" 
#include "FRule.h" 
#include "Flc.h" 
#include <NewPing.h> 
#include "MotorControl.h" 

MotorControl* m; 
Flc* flc; 
FRule* rule1,*rule2,*rule3,*rule4,*rule5,*rule6,*rule7,*rule8,*rule9; 

NewPing sonar1(32,33,200); 

static int dirA = 9; 
static int pwmA = 8; 

// Setup the FSets 
FSet errZ(0,5,0); 
FSet errMP(-15,15,0); 
FSet errLP(-30,15,-1); 

FSet errDtLN(-4,2,-1); 
FSet errDtMN(-2,2,0); 
FSet errDtZ(0,2,0); 
FSet errDtMP(2,2,0); 
FSet errDtLP(4,2,1); 

FSet cntLN(-40,20,0); 
FSet cntMN(-20,20,0); 
FSet cntZ(0,20,0); 
FSet cntMP(20,20,0); 
FSet cntLP(40,20,0); 

void setup(){ 
    Serial.begin(4800); 
    pinMode(dirA,INPUT); 

    //Creating FRules for test  
    rule1 = new FRule(&errZ,&errDtMP,&cntMN); 
    rule2 = new FRule(&errZ,&errDtZ,&cntZ); 
    rule3 = new FRule(&errZ,&errDtMN,&cntMP); 
    rule4 = new FRule(&errMP,&errDtLP,&cntMN); 
    rule5 = new FRule(&errMP,&errDtMN,&cntMP); 
    rule6 = new FRule(&errLP,&errDtMP,&cntMP); 
    rule7 = new FRule(&errLP,&errDtZ,&cntLP); 
    rule8 = new FRule(&errLP,&errDtMN,&cntLP); 
    rule9 = new FRule(&errLP,&errDtLN,&cntLP); 

    flc = new Flc(9); 
    flc->addRule(rule1); 
    flc->addRule(rule2); 
    flc->addRule(rule3); 
    flc->addRule(rule4); 
    flc->addRule(rule5); 
    flc->addRule(rule6); 
    flc->addRule(rule7); 
    flc->addRule(rule8); 
    flc->addRule(rule9); 

} 

int errV = 0; 
int errOldV = 0; 
int errDtV = 0; 
int w = 30; 
unsigned int uS; 
unsigned int cm; 

float pwm1 = 0; 
float result = 0; 

void loop(){ 
    uS = sonar1.ping(); 
    cm = (uS/US_ROUNDTRIP_CM); 

    errV = w - cm; 
    errDtV = errOldV - errV;  

    result = flc->cog(errV,errDtV); 

    Serial.print("RESULT: "); 
    Serial.println(result); 

    pwm1 = pwm1 + result; 

    Serial.println(pwm1); 
    analogWrite(pwmA,pwm1); 

    errOldV = errV; 

} 

FLC類的頭文件: 的#ifndef FLC_H 的#define FLC_H 的#include 「Arduino.h」 的#include 「FRule.h」

class Flc { 
    public: 
     Flc(int size); 
     ~Flc(); 
     int addRule(FRule* rule); 
     int mom(float x1,float x2); 
     float cog(float x1,float x2); 

     FRule** rules; 

    private: 
     int last; 
     int size; 
     float h; 
     float numerator = 0; 
     float denominator = 0; 
     float result = 0; 

}; 

#endif 

FLC類源: #包括 「Arduino.h」 的#include 「Flc.h」

+1

請張貼實際的代碼來演示這個問題。上面發佈的代碼snippit實際上不能做你所聲稱的。 – 2013-02-15 21:41:49

+1

這是實際的代碼,我只是省略了部分,我從中獲取傳感器的值。 – MitchNajmitch 2013-02-15 21:43:56

+0

你試過用'pwm = result + pwm;'? – EAKAE 2013-02-15 21:48:03

回答

1

你的函數cog()中的某些東西正在跺腳變量pwm。一旦float變量損壞,Serial.print()將只顯示零。下面的示例顯示浮點數設置爲0xffffff時,浮點數學庫將停止對該變量進行任何操作。

運行下面的示例程序,您將看到一次pwm正確打印。在第一次錯誤的通話之後,它會打印零。所佔用的內存也不再改變。

pwm=0.50 zpwm=0.50 
pwm=0.00 zpwm=3.95 result=3.45 
255-255-255-255 
pwm=0.00 zpwm=4.45 
pwm=0.00 zpwm=7.90 result=3.45 
255-255-255-255 

示例程序顯示寫入錯誤內存位置的函數。 查看鏈接器輸出的內存映射,變量按列出的順序放置在內存中。所以寫過var的結尾,會破壞pwm。

float zpwm = 0; 
byte var = 0; 
float pwm = 0; 
float result = 0; 


float badactor() { 
    *((long*)(&var+1)) = -1; 
    return 3.45; 
} 

void setup() { 
    Serial.begin(57600); 
} 

void loop() { 

    zpwm += 0.5; 
    pwm += 0.5; 

    Serial.print("pwm="); 
    Serial.print(pwm); 
    Serial.print(" zpwm="); 
    Serial.println(zpwm); 

    result = badactor(); 
    pwm += result; 
    zpwm += result; 

    Serial.print("pwm="); 
    Serial.print(pwm); 
    Serial.print(" zpwm="); 
    Serial.print(zpwm); 
    Serial.print(" result="); 
    Serial.println(result); 

    uint8_t* ptr; 
    ptr = (uint8_t*)&pwm; 
    Serial.print((int)*(ptr)); 
    Serial.print("-"); 
    Serial.print((int)*(ptr+1)); 
    Serial.print("-"); 
    Serial.print((int)*(ptr+2)); 
    Serial.print("-"); 
    Serial.println((int)*(ptr+3)); 

    delay(1000); 
} 
+0

我添加打印語句befere'COG()'和之後,也加入之後,如果我運行它,一段時間後,我得到這個: '前COG:90.72' \t'結果:1.35' \t'COG AFTER:90.72' \t'加入後:92.07' \t'前COG:92.07' \t'結果:0.00' \t'後COG:92.07' \t'加入後:0.00' 它接縫,apwm變量的腐敗是由加法完成的。但我完全不明白爲什麼?! – MitchNajmitch 2013-02-17 09:08:46

+0

檢查除以零。如果分母爲零,那麼結果不是數字。該值將導致涉及的每個操作也返回NaN。 – jdr5ca 2013-02-17 19:43:05