Arduino添加任务
Arduino addition assignment
我使用Arduino进行了一些编程,但我遇到了一个问题。在loop()
函数中,每次执行loop()
函数时,我都想向变量pwm
添加一个值。我从我编写的某个函数中获得了这个值,并用命令pwm += result
将其添加到pwm
中,但它不起作用。如果我打印pwm
,我总是得到零。尽管打印result
会给我一些非零值。整个代码是:
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类头文件:#如果FLC_H#定义FLC_H#包括"Arduino.h"#包括"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"#包括"Flc.h"
Flc::Flc(int size){
this->rules = (FRule**) malloc(sizeof(FRule*) * size);
this->size = size;
last = -1;
}
Flc::~Flc(){
free(rules);
}
int Flc::addRule(FRule* rule){
this->rules[++last] = rule;
return last;
}
int Flc::mom(float x1,float x2){
return 0.0;a
}
float Flc::cog(float x1, float x2){
for(int i = 0; i < size;i++){
h = rules[i]->dof(x1,x2);
float area = rules[i]->widthOfCon() * ( h - h*h/2);
numerator += rules[i]->cntrOfCon() * area;
denominator += area;
}
result = numerator / denominator;
return result;
}
函数cog()中的某些东西正在踩踏变量pwm。一旦float变量损坏,Serial.print()将只显示零。下面的示例显示,当float设置为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);
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 只能向C++添加一定数量的字符
- Qt和C++:将QLineEdit添加到QTabWidget中
- 即使在多任务处理时,添加用户时间 + 系统时间(来自 shell 的时间命令)是否是一种可靠的措施?
- 如何仅在使用 c++ 中的 boost 完成所有任务时才向线程池添加新任务
- 如何将按钮添加到任务栏后使窗口看起来对称
- C++ -<Task> 删除堆上分配的任务数组时,将列表 l(或任何 STL 容器)添加为数据成员会导致错误
- Arduino添加任务