国外课栈 - 国外电子信息技术视角栈

Arduino和Python螺旋桨角度数学模型

 二维码 18

关联知识

硬件

用Anaconda安装Pycharm

我建议将Anaconda与Pycharm一起安装,因为这使Python集成开发环境(IDE)的安装非常简单。 Anaconda是Python和R编程语言的开源发行版,旨在简化程序包的管理和部署。 当您安装Anaconda时,只需单击一下,它就会自动为您提供世界各地许多人正在使用的流行软件包。 另一方面,Pycharm是Python的IDE。 它为您提供了许多功能,例如代码完成,错误检查,项目导航等。

我只会在Windows上显示安装,但在其他平台上也应该没有太大的不同。 首先,您需要先安装Anaconda。 您可以从Anaconda的网站获取安装文件。 有2个版本的Python(2.7和3.6),它们之间有一些区别。 本教程使用Python 3.6,所以我建议您也使用3.6版本(语法上也有所差异),这样就不会出现任何问题。 下载文件后,您可以继续安装Anaconda。 使用默认设置应该没有问题,因此在安装过程中,只需单击下一个按钮,但请注意安装Anaconda的目录。

接下来,您需要安装Pycharm,可以从Pycharm的网站下载。 我们将使用社区版本,因为它是免费的,并且已经提供了超出我们所需的功能。 下载文件后,请继续安装。 再一次,默认设置应该不会造成任何问题。 完成后,您可以启动Pycharm(如果在查找过程中遇到问题,请在Windows搜索中键入pycharm),然后应到达以下窗口。

图略

单击“配置”按钮,然后选择“设置”。

图略

在“设置”中,转到左侧的“项目解释器”选项卡,然后选择“path\to\Anaconda3\python.exe”。 它应该立即可用,而无需您查找,但如果不是这样,只需单击右侧的齿轮图像,然后单击“Add Local”。

图略

在“ Virtualenv Environment”选项卡下,单击“…”按钮并查找您的Anaconda3目录,然后选择python.exe文件并单击OK。完成所有操作后,您应该到达以下窗口。

图略

如果您设法进入此视图(程序包可能有所不同,但列表也应该很长),则IDE不会有任何问题。 继续单击“确定”,完成配置。 单击“创建新项目”,然后选择要在其中创建项目的目录。

图略

如上所示,项目解释器应标记为``New Virtualenv Environment''。确认后,单击“创建”,即可开始滚动。

构建电路

这是我们将要构建的电路的原理图。 刚开始时,对于那些不习惯看它们的人来说,看起来确实很复杂,但是一旦掌握了这些,实际上并不难。 我在本文的最后部分中写了关于该电路工作原理的说明,因此,如果您已经了解晶体管开关和电容器滤波,则可以跳到那里。

电路原理图

图略

达林顿/锡克莱对晶体管

晶体管是电路中的基本组件之一,其主要目的是执行电气开关。 它类似于物理开关,它允许您打开/关闭电路,但是晶体管使用电信号作为输入来执行此开关。 在此,我将介绍达林顿/锡克莱对晶体管。 如果再次看一下上面的示意图,您会发现有2个晶体管连接在一起。 为什么需要多级晶体管? 答案就是晶体管的电流放大系数。

如果您查看晶体管的数据表(这里是一个),您会发现找到一个标为 (电流放大系数)的参数,如下所示。

图略

顾名思义,该参数告诉您晶体管能够放大多少电流,以用于控制晶体管的开关。  是要控制的电路的电流(在集电极处的电流), 是控制信号的电流(在基极处的电流)。 控制  的公式如下:

在上面的数据表摘录中,供应商仅给出了最大 = 100mA的值,但可以说最大DC电流增益值为300适用于所有 值。 然后,如果您使用最大电流输出为0.020A的Arduino,则基本上可以控制最大0.020A * 300 = 6A的电路。 这意味着您将无法接通需要7A电流的电机。 除此之外,绝对不要将最大值用作任何安全设计的尺度。 无论如何,这并不是一个很好的例子。 这种类型的小型晶体管不适用于控制需要大量电流的电机。 实际上,电路应处理的最大值是数据表中规定的最大值,在这种情况下为100mA。

现在让我们看一下另一个用于开关电动机的晶体管。

图略

您可以看到在此数据表中晶体管的最大给定值为4安培。 = 4.0A的最小hfe为40,因此从上面的等式(1)可以知道 = 4.0 / 40 = 0.1。 由于 = 40是最小值,因此,如果我们给 = 0.1,则可以肯定我们将能够切换4A电路。 再次使用2A值进行相同的分析,我们知道切换2A电路需要至少0.033A的电流。

现在,我们有一个问题。 我们的微控制器Arduino无法从其引脚提供0.033A的电流(最大值为0.040A,但建议使用的电流为0.020A)。 我们将要使用的电动机在5V电压下运行时大约需要3A电流,因此,如果仅使用此晶体管,我们知道Arduino将无法关闭电动机(因为该晶体管是PNP型晶体管,所以无法将其关闭)。

解决方法很简单。 只需在电路中添加另一个晶体管以首先放大Arduino引脚电流,然后将其馈入功率晶体管即可。 这样做会带来一些后果,但通常不会影响像我们将要使用的那样的简单电路。 当您同时使用2个相同类型的晶体管时,它称为达林顿对(PNP-PNP或NPN-NPN),当您同时使用2个不同类型的晶体管时,它称为锡克莱对(PNP-NPN或NPN-PNP )。

图略

我已经在电路原理图中标出了晶体管部分,实际上我们正在使用Sziklai对。 为什么是Sziklai,而不是Darlington? 这里没有太多原因可以简化电路。 您可以使用达林顿对来完成相同的工作,即使最终表现没有差异也没有关系。

我上面提供的2个示例实际上是我们将要使用的晶体管。 从 变量可以看到,小信号晶体管只能安全地控制100mA的电路,因此它将无法切换需要约3A电流的电机电路。 另一方面,功率晶体管需要大约0.033A的输入电流才能控制2A电路,但我们的微控制器只能提供高达0.020A的电流。 解决方案是在电路中将两者结合使用。 我们将首先使用小信号晶体管(2N3904)放大来自Arduino的电流,然后使用放大后的信号来切换功率晶体管(D45H11)以控制我们的电机。

在滤波的背景下了解电容器

对于那些研究信号处理的人来说,这个主题似乎很直观,但是对于其他背景的人来说,我想您通常很难确定电路要使用的电容器值。 我写这篇文章的目的是希望它可以帮助您了解电容器的功能,以及对电路的影响。 我已经编写了python代码来帮助您可视化电容器的属性,因此,如果您还没有python IDE,则可以按照我以前的文章中的说明安装Pycharm。

电容器的图示如上所示,电容器的数学模型由下式给出:

傅立叶变换告诉我们,任何信号都可以分解为正弦波。 如果您还没有听说傅立叶变换,那么本文将对傅立叶变换非常复杂的数学表达式进行简单直观的说明。 这里的要点是,如果所有信号都可以用正弦波表示,那么我们可以通过确定系统对正弦波的响应来简单地分析任何系统。 除此之外,欧拉还为我们提供了欧拉公式,从而使我们的生活变得更加简单:

其中j代表

通过一点操作,我们发现可以使用欧拉公式以指数形式表示余弦和正弦。

那么,做所有这些事情有什么意义呢? 首先,通过傅立叶变换,任何信号都可以用正弦波表示。 然后,通过欧拉公式,我们知道正弦曲线可以用指数表示。 因此,我们现在可以使用这些指数分析任何系统。 关于指数的好处是,在微分方程中处理起来要简单得多,因此我们必须感谢傅里叶和欧拉使我们的生活变得更加简单。

如果我们让 ,那么

我们现在可以用上述方程式表示频率为f的信号。 我们可以将上述正弦和余弦方程视为正负两个频率。 这是因为我们现在正在实部和虚部中工作。 如果再次扩展指数项,您会发现虚部将消失,仅留下实部。

一般而言,正弦曲线由正频率项 和相等的负频率项 。 我们可以忽略 ,因为它只是一个比例项,我们对系统的频率分析更感兴趣。 由于我们所做的所有计算仅涉及线性运算符(加,减,除,乘,微分等),因此我们可以在此处应用叠加原理。 这意味着我们可以分别分析正负频率,并在以后简单地将结果相加。

现在让我们假设输入到电容器的电压为:

其中f是我们感兴趣的正弦频率。请注意,f只是一个变量,可以表示正或负频率,而A只是比例系数。

然后,我们可以将其代入电容器模型,以得出以下公式:

根据欧姆定律,我们知道电压除以电流会得到电阻。 因此,根据上式,电容器的“电阻”由 给出。 官方的术语实际上是阻抗,因为它实际上与电阻并不相同。 首先,这个值是虚构的。

现在,我们可以从一个简单的模型开始,如下所示。

现实生活中的电容器并不完美。 为了更好地建模,我们经常使用一个称为等效串联电阻(ESR)的参数,您通常会在电容器的数据表中看到该参数。 将图中的R2设为该ESR,并将R1设为您要操作的负载。 为了分析这样的电路,我们只需要将电容器当作具有 的电阻(实际上是阻抗)的普通电阻器即可。

应用分压器规则,经过一些操作,我们将得出以下方程式:

这实际上是我们电路的频率响应! 您可以替代正频率 来确定该正频率的 ,然后再次对负频率进行相同的操作 获得另一个 作为负频率。 之后,您只需要添加(对于余弦信号)或减去(对于正弦信号)2个 即可得到最终答案。 看起来很乏味,不是吗? 但是,等等,实际上是更简单的出路。 让我举一个例子。

假设我们的输入信号由下式给出:

由于 ,因此此输入的频率为 。根据欧拉公式,我们可以将余弦分解为两个具有正负频率的指数项之和,如下所示。

接下来,让我们的频率响应为

将输入中的2个指数项分别代入方程式,我们将得到以下内容

简化为

      

    

我处理了常数,以便得到一个简单的方程式。 无论如何,我们现在必须将虚部转换为指数形式。如果您忘记了复数操作,请遵循以下规则:

假设A = a + cj 且B = b + dj。

因此,回到频率响应方程式,我们现在可以通过以下方式计算幅度:

在此请注意,正负频率的幅度相同。则参数(或相位)为:

因此,

现在,我们可以进一步简化方程(1)和(2)

从叠加原理来看,

最后,我们有了输入信号的输出! 现在,您是否意识到,如果我们的信号是正弦信号,我们的输出也将是正弦信号,而其他常数将保持不变! 此外,我们的输出幅度就是输入幅度乘以频率响应函数的幅度(正或负),我们的输出相位就是输入相位加上正频率的频率响应函数的相位。 这意味着仅对正指数项进行分析就足够了! 这也是信号相关数学始终使用此类函数 进行系统分析的原因。

简要概述,如果您对结果输出 的幅度感兴趣,则只需将输入 的幅度乘以频率响应函数的幅度 。 如果您对输出的结果相位感兴趣,则可以简单地将输入的相位添加到“频率响应”功能的相位中。

我们对此分析的阶段并不十分感兴趣,因为我们只想知道信号是否会被系统衰减或放大。 因此,我们需要知道频率响应方程的大小。 为了确定复数的大小,我们必须对实数部分的平方加上虚数部分的平方求平方根,即 。 我们将把这个任务委托给全能的python,因为它在那里要简单得多。

现在,让我们将这个方程式放到Python中并进行绘制,以查看电容器(C)的电容如何影响输出电压

图略

用于绘制上图的值是R1 = 1ohm和C =47μF。 图的z轴为对数刻度,它表示系统的增益。 简单来说,它是输出幅度与输入幅度之比。 在上面的图片中并不清楚,但是z轴上的值实际上是负值,因此这意味着输出的幅度小于输入的幅度。 对于那些不适应对数刻度的人,刻度上的值仅等于20log10a,其中a是正常刻度上的值。 因此,在对数刻度上的值-20表示比率

从图中可以看出,当频率增加时,增益降低。 当R2(电容器的ESR)很低时,这一点尤为突出。 下面提供了生成该图的代码,因此请尝试一下以了解不同参数如何影响结果。

现在,让我们看看3D图,以显示R2 = 0.1ohm的结果。这是结果图:

图略

当频率约为80kHz时,增益约为-20dB。 按正常比例,即 。 换句话说,如果您的信号中的频率高于80kHz,则这些高频信号的幅度将大约降低90%,而较低的频率不会受到太大的影响。 这就是为什么这种类型的电路(您在信号与电容器并联的地方)被称为低通滤波器的原因。 它只让低频通过。

这也是过滤系统中高频噪声的方法。您只需将一个电容器连接到它,然后让它完成工作。例如,请看一下传感器板上该稳压器的原理图:

现在看起来不熟悉吗? 此处的电容器用于过滤输入电压VIN和芯片输出的电压。 如示意图所示,当您放置多个电容器进行滤波时,它称为级联低通滤波器。 通常,使用越多的电容器,从某种意义上说,较低的频率不会衰减太多,而较高的频率会衰减得更多(上面2D图形的斜率会变得更陡峭),则滤波器的性能会更好。

以下是Python脚本,用于绘制上面显示的图形。您可以更改参数值以查看其对电路的影响。

Python脚本

3D绘图

代码略

2D绘图

代码略

要素整合

Arduino和Python绘制数据(+代码)

使用Python创建GUI(+代码)

电机速度控制(数学模型+代码)

螺旋桨相对角度控制(数学模型+代码)

螺旋桨绝对角度控制(数学模型+代码)

阅读完整文档


文章分类: 电子创客EM-Arduino