除了拿Arduino实现简单的IO口控制外,还想加入更多的元素,这次计划加入一个PID控制算法来实现位置跟随运动,以求追求更加高大上的应用体验。附件内容讲述了如何使用Arduino和夏普红外传感器来检测距离。并就PID的基本理论进行阐述。以及将以电机的控制电压量变化演示如何实现PID反馈闭环控制。
基于Arduino的PID测距控制.docx (720.9 KB)
位置检测元件使用的是一个夏普红外传感器,其技术规格如下所示
• 信号类型:模拟输出
• 探测距离:4-30cm
• 工作电压:4.5~5.5V
• 标准电流:33mA
• 接口类型:PH2.0-3P
• 最大尺寸:40x20x13.5 mm
由于位置传感器输出的是模拟量,需要在通过Arduino接收后再转化为数字量,使用的Arduino UNO如下图所示,
传感器的输出量的参考转换代码如下
void loop ()其中pin为模拟量输入引脚号(A0-A5),distance为转换成的数字量。
{
uint16_t value = analogRead (pin);
if (value < 16)
value = 16;
distance= 2076.0 / (value - 11.0);}
PID算法
上面所示的是PID控制原理框图,我们需要将其在程序中离散化
这样看似高深的东西可以简化为每次采样完成后的计算输出,我们计划采用u作为控制器的控制量,控制电机的转动,电机的输出速度与输入电压成正比例关系,拟采用电机转动的位置来模拟最终的调节量,如果传感器检测到目标位置,电机将停止转动。
接着以电机的控制电压量变化演示如何实现PID反馈闭环控制。下图是控制原理框图
由于不知道控制对象具体的理论传递函数,我们在进行PID参数的选取时进行了若干次的尝试,直到相对满意时为止。
如何定义一个ms采样周期?
Arduino的millis()函数能够获取arduino从开始运行到现在的程序之后的毫秒数,返回值为unsignd long型。通过设置一个timechang=now-lasttime,阈值设为100时,即表示100ms的时间间隔。
定义采样周期计算Arduino的输出值
那么如何将PID计算输出呢?
up=Kp*error;
ud=Kd*(error-error_1)/Ts;
ui=ui_1+Ki*error*Ts;
输出u=up+ud+ui,Ts表示采样周期,error为当前检测到距离距离目标位移的差值,而error_1为上一次采样的差值,这样既可以将上期bloggger中的离散控制算法转换为C语言。
监控Arduino的控制量
通过Serial.print (),通过Arduino的Serial Monitor显示出来,附件为参考的代码。
PWM控制在Arduino中的应用实例:LED亮度调节
PWM(Pulse Width Modulation),一般指脉冲宽度调节,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
对于PWN,如果你已经有了一定的了解和认知,那可以看一下接下来我要向大家展示的使用Arduino和PWM控制完成的两个小作品,大家有兴趣的话也可以自己动手尝试一下。
PWM控制在Arduino中的应用实例.docx (365.5 KB)
Arduino的步进马达控制
学习使用Arduino的马达扩展板去控制步进马达。
介绍了什么是步进马达﹐它如何运作以及不同类型的步进马达;把步进马达与Arduino马达扩展板连接在一起﹐并已安装在Arduino Uno板上﹐有一个基本的程序运行。
Arduino的步进马达控制.docx (737.3 KB)
以Arduino控制的卷线机
使用Arduino马达扩展板和步进马达将线缠绕到线轴上。
用到的是齿轮傅动的马达﹐所以不能随意地把它调较至在这专案中所需要的那么快。附件会介绍使用不同的步进马达去把线缠绕在木制线轴上﹐并且还添加了可以控制缠绕多少线的开关。
以Arduino控制的卷线机.docx (1.3 MB)
来源:designspark