2013-02-15 1 views
1

Arduino를 사용하여 프로그래밍을 수행하지만 문제가 있습니다. loop() 함수에서 loop() 함수가 실행될 때마다 변수에 값을 추가하려고합니다 (pwm). 필자가 작성한 일부 함수에서 그 값을 얻었고 명령으로 pwm에 추가했지만 작동하지 않습니다. pwm을 인쇄하면 항상 0이됩니다. result 인쇄는 나에게 0이 아닌 값을줍니다.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 

것은 무엇 잘못 될 수 있는가?

편집 : #ifndef FLC_H #DEFINE FLC_H 사용법 #include "Arduino.h" 사용법 #include "FRule.h"

다음은 전체 스케치

#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 클래스 헤더 파일입니다

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 클래스 소스 : 사용법 #include "Arduino.h" 사용법 #include "Flc.h"

+1

문제를 나타내는 실제 코드를 게시하십시오. 위에 게시 한 코드 snippit은 귀하가 주장하는 것을 문자 그대로 사용할 수 없습니다. –

+1

그것은 실제 코드입니다. 나는 센서에서 값을 얻는 부분을 생략했습니다. – MitchNajmitch

+0

'pwm = result + pwm;'을 사용해 보셨습니까? – EAKAE

답변

1

함수 cog()의 일부가 변수 pwm을 스 st핑하고 있습니다. float 변수가 손상되면 Serial.print()가 0으로 표시됩니다. 아래 예제는 부동 소수점 연산 라이브러리가 0xffffff로 설정된 부동 소수점을 사용하여 변수에 대한 연산을 중지 함을 보여줍니다.

아래의 샘플 프로그램을 실행하면 pwm이 올바르게 인쇄되는 것을 볼 수 있습니다. 첫 번째 불량 통화 후에는 0을 인쇄합니다. 또한 점유 된 메모리가 더 이상 변경되지 않습니다.

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하기 전에 : 90.72' \t'결과 : 1.35' COG AFTER \t': 90.72' \t'첨가 한 후 : 92.07' COG 전 \t': 92.07' \t'결과 : 0.00' \t'AFTER COG : 92.07' \t'첨가 한 후 : 0.00' 이 추가 변수를 사용하여 변수 apwm의 손상을 완료하는 이음새 . 하지만 전 왜 이해가 안되나요?! – MitchNajmitch

+0

0으로 나누기를 확인하십시오. 분모가 0이면 결과는 숫자가 아닙니다. 이 값을 사용하면 관련된 모든 작업이 NaN을 반환하게됩니다. – jdr5ca