微控制器线性电位器输出

Posted

技术标签:

【中文标题】微控制器线性电位器输出【英文标题】:Microcontroller linear potentiometer output 【发布时间】:2011-04-13 12:49:46 【问题描述】:

好的,下一个问题是:如果我在数字输入端添加了一个按钮,我可以使用它来将电位器校准为零吗?

当我按下按钮时,无论罐子在什么位置,所有值都从零开始?之后我打算在 Excel 中执行此操作,但是今天下午似乎可以尝试。你会使用 switch 语句还是某种 if 语句?

float ZPot = 0;
float YPot = 1;
float XPot = 2;
byte Reset = 10;

void setup()

    pinMode(XPot, INPUT);
    pinMode(YPot, INPUT);
    pinMode(ZPot, INPUT);
    pinMode(Reset, INPUT);

    Serial.begin(9600);


void loop()

    ZPot = analogRead(0)/ 1023.0 * 105.0;
    YPot = analogRead(1)/ 1023.0 * 105.0;
    XPot = analogRead(2)/ 1023.0 * 105.0;
    Reset = digitalRead(10);

    Serial.print("X Pot [mm] = ");
    Serial.print(XPot    );
    delay(500);

    Serial.print("   Y Pot [mm] = ");
    Serial.print(YPot    );
    delay(500);

    Serial.print("   Z Pot [mm] = ");
    Serial.println (ZPot  );
    delay(500);

【问题讨论】:

请创建另一个问题不要编辑旧问题,我们最终会得到大多数毫无意义的评论...... Alex,我已经更新了我的解决方案以包括校准。请注意,我已将 Reset 更改为 int,而不是 byte。 【参考方案1】:

你已经快到了。你只需要改变两件事:

float ZPot = 0;           
float YPot = 1;          
float XPot = 2;
int Reset = 10;
float ZCalibration = 0;
float YCalibration = 0;
float XCalibration = 0;

Reset = digitalRead(10);
ZPot = (analogRead(0) / 1023.0 * 105.0) - ZCalibration;
YPot = (analogRead(1) / 1023.0 * 105.0) - YCalibration;
XPot = (analogRead(2) / 1023.0 * 105.0) - XCalibration;

if (Reset == HIGH) 
    ZCalibration = ZPot;
    YCalibration = YPot;
    XCalibration = XPot;

【讨论】:

因此第一次更改不会对正常操作产生任何影响,但初始化为 0 或 -1 是一种很好的方式,这样您就知道模拟读取何时出现问题。如果有人的生活依赖于这个程序,请将它交给专业人士,因为有很多检查需要完成。 谢谢,我先尝试了第二个,因为它是最快的尝试。添加/1023.0 * 105.0;到模拟读取工作结束。但是更改浮点值不起作用。浮点数必须设置为模拟输入 1,2&3。我将在今晚晚些时候尝试第一个解决方案。 我的意思是在您发布的代码开头的分配 - 您只需将变量设置为其初始值(在第一次读取之前)。这对模拟读取没有任何影响,因为无论如何它都会替换这些值。感谢您接受答案:) 感谢您的帮助,不要担心这段代码不会危及任何人的生命,我将使用低级别赛车上的电位器来尝试记录前悬架是否移动与方向盘相比,我使用带有 2 个数据记录应用程序的 Iphone 来记录通过 3 轴的加速度,以及:速度、行驶距离和位置,以尝试更好地了解汽车在行驶过程中的表现角落。 哇,这听起来太棒了!玩得开心:)【参考方案2】:

尝试添加功能

float convertToMM(float reading)

  return reading/1023.0*105.0;

然后当你做阅读的时候

ZPot = convertToMM(analogRead(0));

【讨论】:

【参考方案3】:

只是为了补充答案,您还可以使用map() 函数:

ZPot = map(analogRead(0),0,1023.0,0,105);
YPot = map(analogRead(1),0,1023.0,0,105);
XPot = map(analogRead(2),0,1023.0,0,105);

手动操作可能比调用 map() 更快,但如果你的程序不是很复杂,这应该没问题。否则,您可以考虑仅使用乘法来编写表达式(analogRead(0) / 1023.0f * 105.0f)(analogRead(0) * 0.000977517107f * 105.0f)

HTH

【讨论】:

好的,下一个问题是:如果我在数字输入端添加了一个按钮,我可以使用它来将电位器校准为零吗?因此,当我按下按钮时,无论罐子处于什么位置,所有值都从零开始?之后我打算在 excel 中执行此操作,但今天下午似乎可以尝试。你会使用 switch 语句还是某种 if 语句? @Alex 我有点困惑,因为您正在通过analogRead() 连续分配值 XPot,Ypot,Zpot。如果您有一个按钮,您可以将值重置为 0,但在下一个循环中,值将被更新。您想在按下按钮时设置自定义 XPot、YPot、ZPot 值并在释放按钮时设置模拟读取值吗?或使用按钮作为预设值和模拟读取值之间的切换?恐怕我不完全理解你想要达到的目标。

以上是关于微控制器线性电位器输出的主要内容,如果未能解决你的问题,请参考以下文章

微控制器有哪些型别

我将如何使用 c 中的微控制器对模数转换进行编程

VHDL微处理器/微控制器

使用预分频器确定微控制器 (AVR) 中时钟周期的周期

LPC2138微控制器之定时器看门狗VIC实例

如何延迟 avr 微控制器的组装?