gpt4 book ai didi

c++ - 有 Arduino PID 代码的说明吗?

转载 作者:行者123 更新时间:2023-11-27 23:58:11 32 4
gpt4 key购买 nike

我有使用 Arduino MegaPi 板的 Makeblock Ultimate 2.0 套件。有一个 Arduino PID 示例。但是,没有解释命令是什么以及数字是什么。有什么手册或教程吗?提前致谢。

示例程序如下:

/**
* \par Copyright (C), 2012-2016, MakeBlock
* @file Me_Megapi_encoder_pid_speed_MAM.ino
* @author MakeBlock
* @version V1.0.0
* @date 11/27/2016
* @brief Description: this file is sample code for Megapi encoder motor device.
*
* Function Call List:
* 1. uint8_t MeEncoderOnBoard::getPortB(void);
* 2. uint8_t MeEncoderOnBoard::getIntNum(void);
* 3. void MeEncoderOnBoard::pulsePosPlus(void);
* 4. void MeEncoderOnBoard::pulsePosMinus(void);
* 5. void MeEncoderOnBoard::setMotorPwm(int pwm);
* 6. double MeEncoderOnBoard::getCurrentSpeed(void);
* 7. void MeEncoderOnBoard::setSpeedPid(float p,float i,float d);
* 8. void MeEncoderOnBoard::setPosPid(float p,float i,float d);
* 7. void MeEncoderOnBoard::setPosPid(float p,float i,float d);
* 8. void MeEncoderOnBoard::setPulse(int16_t pulseValue);
* 9. void MeEncoderOnBoard::setRatio(int16_t RatioValue);
* 10. void MeEncoderOnBoard::runSpeed(float speed);
* 11. void MeEncoderOnBoard::loop(void);
*
* \par History:
* <pre>
* <Author> <Time> <Version> <Descr>
* Mark Yan 2016/07/14 1.0.0 build the new
* MAM 10/27/2016 1.0.0 Renamed Me_Megapi_encoder_pid_speed_MAM.ino
* </pre>
*/
#include <MeMegaPi.h>
MeEncoderOnBoard Encoder_1(SLOT1);
MeEncoderOnBoard Encoder_2(SLOT2);
void isr_process_encoder1(void)
{
if(digitalRead(Encoder_1.getPortB()) == 0)
{
Encoder_1.pulsePosMinus();
}
else
{
Encoder_1.pulsePosPlus();;
}
}
void isr_process_encoder2(void)
{
if(digitalRead(Encoder_2.getPortB()) == 0)
{
Encoder_2.pulsePosMinus();
}
else
{
Encoder_2.pulsePosPlus();
}
}
void setup()
{
attachInterrupt(Encoder_1.getIntNum(), isr_process_encoder1, RISING);
attachInterrupt(Encoder_2.getIntNum(), isr_process_encoder2, RISING);
Serial.begin(115200);

//Set PWM 8KHz
TCCR1A = _BV(WGM10);
TCCR1B = _BV(CS11) | _BV(WGM12);
TCCR2A = _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(CS21);
Encoder_1.setPulse(7);
Encoder_2.setPulse(7);
Encoder_1.setRatio(26.9);
Encoder_2.setRatio(26.9);
Encoder_1.setPosPid(1.8,0,1.2);
Encoder_2.setPosPid(1.8,0,1.2);
Encoder_1.setSpeedPid(0.18,0,0);
Encoder_2.setSpeedPid(0.18,0,0);
}
void loop()
{
if(Serial.available())
{
char a = Serial.read();
switch(a)
{
case '0':
Encoder_1.runSpeed(0);
Encoder_2.runSpeed(0);
break;
case '1':
Encoder_1.runSpeed(100);
Encoder_2.runSpeed(-100);
break;
case '2':
Encoder_1.runSpeed(200);
Encoder_2.runSpeed(-200);
break;
case '3':
Encoder_1.runSpeed(255);
Encoder_2.runSpeed(-255);
break;
case '4':
Encoder_1.runSpeed(-100);
Encoder_2.runSpeed(100);
break;
case '5':
Encoder_1.runSpeed(-200);
Encoder_2.runSpeed(200);
break;
case '6':
Encoder_1.runSpeed(-255);
Encoder_2.runSpeed(255);
break;
default:
break;
}
}
Encoder_1.loop();
Encoder_2.loop();
Serial.print( "Speed 1:\t");
Serial.print(Encoder_1.getCurrentSpeed());
Serial.print(" \t Speed 2:\t");
Serial.println(Encoder_2.getCurrentSpeed());
}

最佳答案

我试图快速搜索是否有任何您可能错过的在线内容,但除了 MeMegaPi 库 ( https://github.com/Makeblock-official/Makeblock-Libraries/tree/master/makeblock/src ) 的源代码外,我找不到太多其他内容

他们还会将您引回 MegaBlocks 网站以获取更多信息,我想您已经这样做了。因此,我将稍微解释一下这里发生的事情,但在未来,使用 API 将需要您阅读源代码,如果您不熟悉 C/C++,这可能有点令人生畏。不管怎样,这里是:

MeEncoderOnBoard Encoder_1(SLOT1);
MeEncoderOnBoard Encoder_2(SLOT2);
void isr_process_encoder1(void)

首先,我们分别为 MeEncoderOnBoard Encoder_1 和 MeEncoderOnBoard Encoder_2 将编码器实例化到 SLOT1 和 SLOT2。 SLOT1 和 SLOT2 是您设备上连接 1 和连接 2 (/src/MePort.h) 的别名(我猜是某种多针电缆)。这些编码器还对 Action 进行编码,我们很快就会看到。

void isr_process_encoder1(void)
{
if(digitalRead(Encoder_1.getPortB()) == 0)
{
Encoder_1.pulsePosMinus();
}
else
{
Encoder_1.pulsePosPlus();;
}
}
void isr_process_encoder2(void)
{
if(digitalRead(Encoder_2.getPortB()) == 0)
{
Encoder_2.pulsePosMinus();
}
else
{
Encoder_2.pulsePosPlus();
}
}

然后我们为这些编码器制作中断例程isr_process_encoder#s 1和2。对于两者,我们都在读取端口 B(连接槽上的一个引脚)并对他们所谓的脉冲位置执行递增/递减(取决于端口 B 上的值)。

void setup()
{
attachInterrupt(Encoder_1.getIntNum(), isr_process_encoder1, RISING);
attachInterrupt(Encoder_2.getIntNum(), isr_process_encoder2, RISING);
Serial.begin(115200);

在 setup() 中,我们将中断例程附加到编码器,并告诉它们在上升信号中断时触发。在两个编码器都设置了中断处理程序后,我们在 arduino 设备上以 115200 的波特率启动串行通信。

  //Set PWM 8KHz
TCCR1A = _BV(WGM10);
TCCR1B = _BV(CS11) | _BV(WGM12);
TCCR2A = _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(CS21);

接下来的 4 行代码有点神奇。推理(正如评论所暗示的那样)是将 PWM 速率设置为 8KHz,我假设是电机。 _BV 显然是 arduino 如何在低级别设置位值(在这里做出很大的猜测)?实际上对此不太确定,但我相信做这个的人做了他们的功课。

  Encoder_1.setPulse(7);
Encoder_2.setPulse(7);
Encoder_1.setRatio(26.9);
Encoder_2.setRatio(26.9);
Encoder_1.setPosPid(1.8,0,1.2);
Encoder_2.setPosPid(1.8,0,1.2);
Encoder_1.setSpeedPid(0.18,0,0);
Encoder_2.setSpeedPid(0.18,0,0);
}

现在……诚然,我不知道 setPulse、setRatio、setPosPid 或 setSpeedPid 中的数字代表什么……我希望您的 PID 电机有某种文档可用,因为这对我来说也很神奇。然而,这些函数调用只是在编码器对象上设置这些属性(希望我有更多话要说:[)...

void loop()
{
if(Serial.available())
{
char a = Serial.read();
switch(a)
{

接下来是主程序循环。首先,我们检查是否有可以收听的串行连接。如果是,那么我们从串行连接中读取一个字节。如果我们读取的字节对应于任何情况,我们将适本地设置编码器的速度。

  Encoder_1.loop();
Encoder_2.loop();

在这个 switch block 之后,我们对我们的编码器执行 loop() 调用。根据消息来源,这实际上是一个更新步骤,我们的设置实际上被中继到我们正在与之通信的设备(我一直假设它是一对电机)。

  Serial.print(     "Speed 1:\t");
Serial.print(Encoder_1.getCurrentSpeed());
Serial.print(" \t Speed 2:\t");
Serial.println(Encoder_2.getCurrentSpeed());
}

最后,我们打印出电机的速度,然后循环例程继续执行此 [Read->Update->Print] 循环

抱歉,我无法为您提供更多帮助,但这就是我能给您的全部了。祝你好运,我希望你能找到文档!我回去从事无聊的非嵌入式编程工作;)

关于c++ - 有 Arduino PID 代码的说明吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41050308/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com