8051模拟器汇编入门(5)子程序

有时,编写代码来完成特定任务可能会变得冗余。在汇编语言中,尤其如此,因为指令的数量有限,大多数任务都涉及用它们做非常相似的事情。子程序是一组旨在执行程序中频繁使用的操作的指令。从某种意义上说,这就像在C或Java这样的语言中编写函数,但层次稍微低一些—特别是我们必须自己做更多的切换工作。

假设你想要将所有寄存器设置为零。有八个寄存器,所以写出来需要八条指令。如果你想在多个地方这样做,每次都写出八条指令就会变得很痛苦。相反,我们可以使用子程序,只写一次。为此,我们使用CALL(实际上是ACALL或LCALL)和RET指令。例如,

继续阅读

8051模拟器汇编入门(4)寄存器组和堆栈

8051架构提供了两种保存值以便以后使用的好方法:寄存器组(register bank)和堆栈(stack)。

通用寄存器实际上存在于RAM中。RAM的前32个字节被使用。默认情况下,使用的是前8个字节。然而,这可以更改为第二个8个字节、第三个8个字节或第四个8个字节。使用哪组由PSW寄存器的RS1和RS0位确定。这些位可以使用SETB和CLR指令更改。SETB“设置”一个位(为1),CLR“清除”一个位(将其设置为0)。例如,

继续阅读

8051模拟器汇编入门(3)标签和跳转

由于程序计数器(PC)寄存器用于确定下一条指令的位置,它不能像其他寄存器那样被访问——即不能使用MOV指令。相反,PC有自己特殊的一组指令。我们称这些为“跳转”,因为它们实际上对应于从一条指令跳转到另一条指令。其中最基本的是JMP指令。

图片

模拟器中的程序计数器PC

继续阅读

8051模拟器汇编入门(2)算术与逻辑

由于算术逻辑单元(ALU),8051能够执行各种算术和逻辑运算。大多数操作都使用一个特殊的寄存器,称为累加器(accumulator),通常表示为ACC或A。例如,可以使用ADD指令将两个数字相加。

MOV A, #2
ADD A, #3

第一个操作数是累加器A,第二个操作数是立即值3。请注意,要将两个数字相加,A必须已经包含要相加的第一个数字。这可以通过使用MOV指令将立即值2移动到A来完成。加法的结果存储在A中,这意味着A的原始值不会被保留。ADD指令还会影响程序状态字(PSW)的进位位CY和辅助进位位AC。

继续阅读

运动控制(十)步进电机控制

让我们来看看如何编写代码来控制一个步进电机。

介绍一个很好的单片机模拟网站:https://wokwi.com/

首先来看看如何使用Arduino直接驱动步进电机,注意这种方法只能用来驱动很小的步进电机,因为Arduino板子输出的电流大小有限。

现在Wokwi中新建一个Arduino项目,添加一个步进电机,然后建立如下连线:

继续阅读

运动控制(九)步进电机理论

之前我们学到了一点关于直流电机的知识。我们了解到直流电机接收电压作为输入,并产生速度作为输出。它通过一个被称为电机方程的公式来实现这种转换。电机方程告诉我们,电机的速度与电压输入成正比。因此,如果我们试图控制关节的速度,直流电机非常有用。但是,如果我们试图控制位置,直流电机就不太有用。

继续阅读

运动控制(八)PID:时间步长响应

是时候用一个叫做PID的算法来完成我们对运动控制的研究了。实际上,我们已经开始了对这个控制算法的研究,因为PID中的P代表比例,我们已经实现了比例控制。那是我们设置电机速度为某个常数乘以定位误差的算法,我们称这个常数为增益(gain),我们也看到了改变增益的效果。

在我们今天看PID控制的I和D部分之前,让我们花点时间研究量化改变Kp增益的效果。代码如下:

继续阅读

运动控制(七)开关vs线性:比例控制

在上一篇文章中,我们看到了如何通过牺牲一些速度和/或准确性来提高开/关控制的稳定性。如果我们不想放弃这么多目标,另一种改进控制的方法是尝试不同的算法。我们的开/关控制算法可能不是我们正在做的事情的最佳选择,比如定位一个物体相对于另一个物体的位置。例如,想象一下,你会使用开/关控制算法来定位你的汽车相对于红绿灯的任务。你会怎么做:让你的汽车以恒定速度驶向红绿灯,然后当你到达红绿灯时突然猛踩刹车。你实际上不能立即停下来,所以当你最终在十字路口停下来时,你会把车挂上倒挡,猛踩油门,你倒车全速直到你的车再次到达红绿灯,这时你再次猛踩刹车。你再次超过红绿灯,所以你再次换到前进挡,再次猛踩油门。你继续这样做,直到灯光最终变绿,然后你前往下一个红绿灯重复这个过程。如果你真的这样做了,你可能会伤害到某人,你肯定会毁了你的车。好的司机实际上做的与此非常不同,他们看到前方的红绿灯,估计他们的车和交通灯之间的距离,并在到达之前开始减速。离交通灯越近,开得越慢。通过这种方式,他们可以在不倒车的情况下平稳地停在交通灯处。这种控制算法通常被称为线性控制。与使用单一速度(要么开启要么关闭)不同,速度会根据两个物体之间的相对位置进行调整。

继续阅读

运动控制(六)开关vs线性:稳定开关控制

上一次我们学习了开环控制与反馈控制之间的区别,并建立了最简单的反馈控制类型,称为开/关控制。当我们运行这种控制算法时,我们发现我们的控制是不稳定的。今天我们将学习两种方法来提高我们控制的稳定性。第一种方法是继续使用开/关控制,但调整速度(Speed)、稳定性(Stability)和准确性(Accuracy)之间的权衡。

当我们实现控制算法时,这三者是我们控制好坏的主要衡量标准。以一个滑块控制为例,速度指的是滑块从起始位置移动到结束位置的速度。稳定性与运动的平滑性有关,我们希望滑块在最终位置附近不要有太多的抖动。当关节超过其目标点然后又返回时,这被称为超调(overshoot),通常这是不受欢迎的。如果关节在其目标位置附近无限期地振荡,那被称为不稳定( instability),这真的很糟糕,最终会对运动机构造成破坏。

继续阅读