2013-02-15 76 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