- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 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类头文件: #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类源码: #include "Arduino.h" #include "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 时, float 学库停止对该变量进行任何操作。
运行下面的示例程序,您将看到一次 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++ - Arduino加法作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14903753/
我正在尝试将父 div 标记的最小宽度设置为内部所有子项的等效宽度。有办法吗? 例如, #sidebar{ width: 325px; } #content{ width: 500
我正在其中一个脚本中做一些附加操作,下面是一些简化的代码: foreach($entry in $arr){ ... switch($entry.AccessRights) { "GenericRea
float 在我的 Java/JOGL (OpenGL for Java) 程序中没有按预期计算。在绘制方法中,当调用每一帧(每秒 60 帧)时,我尝试修改对象的位置。所有值都是浮点值。 float
我正在尝试使用 C 中的结构为一个项目进行复杂的 vector 加法和点积。我已经编写了代码,但是,虽然它的编译没有问题,但一旦我运行我的程序,它就会停止工作。我还有该程序的其他部分,但这只是相关部分
这个问题已经有答案了: Use of java.math.MathContext (5 个回答) 已关闭 8 年前。 首先,我的搜索能力可能没有我希望的那么好,所以也许这种问题已经存在了。如果是的话请
PFB 说明问题的示例代码片段: var x=0.323; var cumulativeVal = 0; for(i=0;i<30;i++){
这个查询的每一步在 PostgreSQL 中的执行顺序是什么? SELECT SUM(field1)+SUM(field2)+SUM(field3)-SUM(field4); 据我所知,加法/减法是按
我正在尝试熟悉 Java 多线程应用程序。我试图想出一个可以很好地并行化的简单应用程序。我认为 vector 加法是一个很好的应用。但是,在我的 Linux 服务器(有 4 个内核)上运行时,我没有得
我在进行简单的加法并将值保存在变量中时遇到问题。 基本上我有以下代码: var accsen; var lowsev = parseInt(accsen); var hisev
所以我最近几个小时一直在解决一个问题,似乎无法阻止我的程序崩溃。问题是创建一个程序,该程序采用任意大小的矩阵,并且能够使用运算符重载将一个矩阵加到另一个矩阵上。当我尝试添加我类(class)的两个对象
我正在尝试添加以下内容,但它一直连接并返回一个字符串。 var nums = [1.99, 5.11, 2.99]; var total = 0; nums.forEach(f
我在网上搜索了数据仓库中加法、半加法和非加法度量之间的区别。我找到了一些结果,但我很难理解这些差异,因为它们不是一个例子。您能否通过示例向我更多地解释加法、半加法和非加法措施之间的区别。 最佳答案 T
%{control.current + #displayRows} 最终是我需要执行的语句。我将其放在 s:if 标记中,并使用 test 来查看该值是否在特定范围内。 最终,我得到的是字符串连接而不
请帮助我解释为什么下面的代码会得到奇怪的输出......为什么 getName() 得到 null。 输出: 列表检查:null:1 public class ListTest { public st
我需要通过字典生成校验和。键和值。 是否有任何简单的方法以迭代方式完成此任务。 foreach(dic.Keys 中的变量项) 校验和 += 校验和(dic[item]) + 校验和(item); 在
我想计算平均销售产品数量。表: pieces | date | status ------------------------------------------- 1
我正在尝试从 mysql 获取 INT 值并进行添加,最后更新数据库。不过这个好像没有更新?我该如何解决这个问题? $resultSecond = mysql_query("SELECT * FROM
我遇到了一个奇怪的问题。 有一张图片,我只需要重新计算非零像素。我想通过 numpy 来完成,因为我处理了数千张图像并且我需要它的速度。 这是一个维度较低的简化示例。 假设我有以下矩阵: [[0,
我不确定下一步该做什么。它们只是文本字段中的美元金额。我正在尝试将它们加在一起。 NSString *checkAmount = [checkAmountInput.text substringFro
我正在测试我的一些代码,在 javascript 中我添加了 .1+.2 ,它给了我 .30000000000000004 而不是 .3 。我不明白这一点。但是当我添加 .1+.3 时,它给了我 .4
我是一名优秀的程序员,十分优秀!