一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

低成本微控制器的高性能计算

来源:analog 发布时间:2024-02-20

摘要: 除了更传统的ALU内核外,微控制器(µc)比以往任何时候都更包含类似dsp的功能。不幸的是,许多固件开发人员不熟悉DSP算法和编码技术,无法充分利用这些设备提供的功能。本文是固件开发人员在低成本微控制器中使用信号处理技术的入门。

微控制器角色的变化

不久前,使用μ C设计意味着围绕CPU本身的大量外围设备和支持芯片。即使CPU有足够的嵌入式ROM和RAM,任何重要的项目都需要外部支持芯片提供的功能。当系统包含任何类型的信号时,这一点最为真实。即使引入最简单的信号需求,系统复杂性也会急剧上升。但是,这就是问题所在——声音、温度、压力和其他自然现象的真实世界仍然存在。实际上,一个能够在世界上运行的系统需要:

  • 将物理现象转换为电信号的换能器和信号调节器

  • 一个数据采集子系统,至少由一个具有足够精度和速度的数字转换器(ADC)和一个数字转换器(DAC)组成

  • 一种能够处理采样数据的数字信号处理器(DSP)

  • µC具有足够的吞吐量来管理DSP、数据采集子系统和其他外设,并具有足够的剩余带宽来顺利执行控制和用户界面功能;微控制器也可能包含程序ROM和数据RAM

这些复杂的设备提高了终端产品的成本,使其超出了低端应用的范围。然而,一种新的微处理器已经出现,它通过在同一个芯片上嵌入高性能数据采集子系统、类似dsp的功能和RISC CPU核心,简化了与世界的接口。现代微控制器中集成能力的图示见图1

新一代µC的一个例子是MAXQ3120。除了常用的uart,定时器和I/O端口阵列外,MAXQ3120还集成了一组外设,使接口变得容易:

  • 一个16位,1周期的RISC内核

  • 一对16位的西格马 - 得尔塔 adc

  • 一个能够在PWM模式下工作的16位定时器

  • 一个带有40位累加器的16 × 16乘法器

MAXQ3120还包括一个时钟,一个LCD控制器和硬件,以简化接口到红外通信通道。在下面的示例中,循环计数或存储要求将特别参考MAXQ3120µC。

现代微控制器在设备内集成了大多数必要的系统功能,包括外设和MAC。


图1 一个传统的嵌入式系统必须公开一个地址和数据总线来连接外部I/O设备来完成系统。

思考问题

涉及信号处理的问题最好分三个阶段处理:

  1. 你想做什么?仔细剖析问题,并将其分解为尽可能小的功能单元。问题是否涉及滤波、信号鉴别或产生特定类型的信号?当您将问题划分为一系列更简单的子任务时,您就为下一步做好了准备。

  2. 你是怎么做到的?现在搜索文献、网络或其他资源,找到与每个任务相关的算法。你可能会发现你的大部分概念问题已经被解决了。你所要做的就是最后一步。

  3. 它的代码。将算法转换为代码的任务是一个熟悉的任务,并且可用的硬件资源使其比以往更容易。

在下面的示例中,我们坚持三个步骤:描述问题,呈现算法和方法,并提供解决问题的代码示例。

电力监控与测量示例
-µC接口的一个常见示例是测量交流电路的电压和电流,以确定负载消耗的功率。乍一看,这似乎相对简单——如果电压和电流波形是正弦波,则电压和电流的均方根值仅为1/
乘以峰值电压或电流。将均方根电压和电流相乘,结果就是以瓦为单位的功率。还有什么比这更简单的呢?

这种分析有两个问题。首先,虽然电力公司提供的电压通常非常接近正弦,但电流波形不是。灯调光器、开关电源和荧光灯都向电源线呈现非正弦电流分布。简单地乘以一个常数不会得到有效值。其次,即使电流波形是正弦波,除非电压和电流波形完全一致,否则RMS值的简单乘法并不能提供以瓦为单位的实际功率使用情况。一般来说,实际负载要么包含电容抗,要么更常见地包含电感抗。因此,必须考虑无功功率。我们必须回归基本面,寻找更好的出路。

在每一时刻,瞬时电压和电流的乘积就是瞬时功率。图2说明了这种瞬时功率是如何上升和下降的,甚至可能在部分周期内降到零以下,这取决于电流。总实际功率就是瞬时电压和瞬时电流乘积的时间平均值。计算实际功率很简单——将电压样本和电流样本相乘,并将结果加到一个累加器中。当累积足够数量的样本后,只需将总和除以样本数即可得到以瓦为单位的功率。要将其转换为以瓦秒为单位的能量,请乘以样品积累的时间(以秒为单位)。


图2 虽然电压波形(虚线)通常非常接近正弦,但电流波形(实线)可能与纯正弦相差很大。此外,电流波形可能发生相移,导致线周期某些部分的瞬时功率(虚线)变为负值。

无功功率的计算就没有那么简单了。首先要注意,对于正弦电压和正弦电流,无功功率定义为:


其中V是有效值电压,I是有效值电流,那么
是电流和电压波形之间的相位差。

通过计算差值,可以随时确定无功元件的功率:



式中V(t)和I(t)为任意时刻电压和电流的瞬时值,
为任意延时,T为一个线周期的周期。区别在于:


使用三角恒等式cos(A+B) = cosAcosB - sinAsinB和cos(A-B) = cosAcosB + sinAsinB将方程更改为:


注意,余弦项相互抵消,正弦项相互增强,只剩下:


但是VI sin(
)是Q,这就是我们要找的。所以,重新排列这些项剩下:


这意味着无功功率可以通过累积最近的电流样本与前一个电压样本的乘积,以及最近的电压样本与前一个电流样本的乘积之差来计算。上式的分母是一个常数
设置为采样周期,因此可以预先计算。

一旦知道了实际功率和无功功率明显的功率(将均方根电压与功率相乘计算得到的功率)可以很容易地计算为:


最后,用实际功率除以视在功率得到功率因数。

目前,假设需要跟踪所有这些因素,那么应用程序将需要跟踪电压通道和电流通道的乘积之和,以及前面关于无功功率的讨论中描述的乘积差的总和。积累实权的代码是这样的:

void accumulateRealPower(int i_sample, int
v_sample)
{
静态长real_power;
initMAC(MULTIPLY_ADD);
preloadMAC(real_power);
real_power = getMAC(v_sample,
i_sample);
}


在本例中,initMAC函数接受一个字节,用于设置MAC中的操作参数preloadMAC函数在进行乘法运算之前将一个长变量加载到累加器中。

为了演示如何将其转换为实际的机器指令,请考虑以下基于上述代码的一组操作:

  1. 初始化乘法累积单元或MAC(一个周期)

  2. 设置内存指针求和存储面积(一个周期)

  3. 将旧的和加载到累加器中(两个循环)

  4. 将电压样本装入乘法器(一个周期)

  5. 将当前样本装入乘法器(一个周期)

  6. 等待一个周期来完成累积操作(一个周期)

  7. 将累加器保存到内存(一个周期)

因此,需要8个周期才能积累真正的功率。积累无功功率类似:

空白accumulateReactivePower (int i_sample int v_sample){静态长reactive_power; initMAC (MULTIPLY_ADD); preloadMAC (reactive_power); reactive_power = getMAC (prev_v_sample i_sample); initMAC (MULTIPLY_SUB); reactive_power = getMAC (prev_i_sample v_sample);}


注意,这里的讨论假设输入样本的直流偏置为零。如果这不是真的,就有必要为电压和电流通道提供额外的蓄电池。如果直流偏置为零,这些和将为零。如果不是,则必须从累积的实际功率中减去直流偏置所表示的功率。

过滤的例子
过滤是数字领域中最常见的任务之一。原因很简单——理想滤波器在世界上是无法实现的,但在数字逻辑中实现起来相对简单。

在本节中,介绍了低通滤波器和带通滤波器。低通滤波器通常用于在采样之前从信号中去除不需要的高频成分,以消除混叠伪影。带通滤波器通常用于将通信信道限制在特定的频率范围内。例如,FSK调制解调器可以使用带通滤波器来消除高频和低频噪声分量,只留下感兴趣的频率进行处理。

关于数字滤波器的主题已经写了很多卷,可能会让人相信这个主题很难理解。实际上,基本原理很简单,不需要成为DSP专家就可以使用滤波功能。

通过检查中的低通滤波器图图3,可以看出:


其中Y(n)为当前输出样本,Y(n-1)为 之前的输出样本,X(n)为当前输入 样本。滤波器常数b(0)预计算为:


式中f(0)为期望的半幅角频率

为样本周期。因此,对于8kHz的采样率和100Hz的期望角频率,b(0)将等于p x 125µs x 100Hz = 3.93 x 10(-2)


图3 单极低通滤波器用于信号发送之前去除信号中不需要的高频成分。

实现过滤器算法非常简单:

长lpf (int input_sample){静态长prev_out; initMAC (MULTIPLY_SUB); preloadMAC (prev_out); prev_out = getMAC (b (0), prev_out); initMAC (MULTIPLY_ADD | ONE_OP); prev_out = oneopMAC (input_sample);返回prev_out;}


oneopMAC函数只将一个操作数装入乘数,期望乘数保持第二个操作数。这样做是为了节省执行时间。这个过滤器,如果有效地编译,每个样本只需要十个周期。对于8MHz时钟,这意味着一阶低通滤波器只会消耗MAXQ3120处理带宽的1%左右(不考虑中断开销)。

二阶带通滤波器在概念上稍微复杂一些,但实际上类似,只在算法中添加了几个步骤。一个简单的二阶带通滤波器的信号流程图如图所示图4,其公式为:



图4 二阶带通滤波器可以将通信信道限制在特定的频率范围内。

与前面的示例一样,参数b(0)、a(1)和a(2)是预先计算的。参数a(1)定义了滤波器的q因子,用来衡量滤波器抑制中心频率附近带外频率的有效性。具体地说,


p通常在100到1000的范围内。较大的p值表示较窄的通带,但较长的滤波器沉淀时间。较小的p值提供更宽的通带和更快的沉降时间。

其他参数a(2)和b(0)是根据a(1)计算的。首先,我们定义两个中间变量:


现在我们可以定义另外两个参数:


注意,一旦选择了中心频率、采样率和滤波器q因子,这些参数都是常量。所需代码为:

长带通滤波器(int input_sample){静态长x[1],[1],输出;initMAC (MULTIPLY_ADD | CLEAR_ACC);输出= getMAC (y [1], (2)); initMAC (MULTIPLY_SUB);} = getMAC产量(y[0](1)),输出= getMAC (x [1], b (0)); initMAC (MULTIPLY_ADD | ONE_OP);输出= oneopMAC (input_sample); x [1] = x [0]; x [0] = input_sample; y [1] = y [0]; y[0] =输出;返回输出;}


如果有效地编译,这个例程(不包括输入和输出样本的老化)需要14个周期。老化不包括在周期估计中,因为样品通常储存在循环缓冲液中,不需要老化。

音调生成和检测示例
在通信应用中,经常需要在音频通道中生成/检测音调的组合。例如,在电话应用程序中,想要合成或检测电话线中的双音多频音(DTMF)以便在电话线上拨号是很常见的。在主干卡中,标准多频(MF)音通常用于带内信令。呼叫进程信令(拨号音、回铃音、忙音和重排音等)通常表现为两种或两种以上音调的组合。

双极数字谐振器(图5)是一种生成音调的简单方法。谐振器的公式为:


其中k为:


并且可以预先计算。请注意,这个谐振器没有输入,它可以连续工作而不需要干预。然而,要启动谐振器,Y(n-1)必须设置为零,Y(n-2)必须设置为-Asink,其中A为信号的期望幅度。


图5 正弦波的产生采用双极数字谐振器。

产生正弦波的算法是目前最简单的:

长gen_tone_sample {静态长y [1]; initMAC (MULTIPLY_ADD); preloadMAC (- y [1]); y [1] = y [0]; y [0] = getMAC (y [0], k),返回y [0];}


这个例程的代码大小估计是每个要生成的正弦波样本大约需要8个机器周期。这与产生简单的方波具有相似的CPU强度,然后必须通过外部电路滤波以产生许多应用所需的光谱纯度。

音调检测有点复杂,但与基本功能相比并不那么令人生畏。为了检测音频通道中的音调,我们选择Goertzel算法。该算法利用一个二阶滤波器和一个功率测量公式来确定滤波器通带中是否存在能量。

二阶滤波器的公式图6是:


其中k的定义与前面描述的音调发生器中的定义相同。算法为:

长* tone_filter (int input_sample){静态长y[1],输出;initMAC (MULTIPLY_ADD); preloadMAC (- y [1]); y [1] = y [0]; y [0] = getMAC (y [0], k) + input_sample;返回y;}


注意,这个例程返回一个数组而不是标量值。这是因为下一步既需要最近的结果,也需要之前的结果。一个音调检测器通道的周期计数估计为12个周期,或者,在8kHz的采样率下,大约是CPU功率的1.5%。在一般情况下,它将需要超过100个采样周期之前的过滤器沉淀,并提供一个可靠的音调存在的指示。


图6 音调检测可以通过一个二阶滤波器来完成。

为了测试是否存在音调,有必要计算滤波信号中的功率。这可以用下面的公式来完成:


由于该系数与预先计算的滤波器回路的系数相同,我们可以在这里使用它来计算功率:

power_squared = y [0] * y [0] + [1] * y y [0] [1] - k * * y [1];


在足够数量的采样周期后,音调存在通过平方功率指示显示,该指示将比没有音调的测量值至少高一个数量级。在测试中,音调的存在可能会显示出超过1000的平方振幅,在输入处具有单位信号振幅。非频率音,或非频率音的组合,通常表现出小于50的平方振幅。

结论

随着数据采集硬件和类似DSP的构建模块在廉价微控制器上变得越来越普遍,固件工程师必须找到将DSP功能纳入主CPU的方法,以降低成本并提高性能。然而,有了文献和网络上的丰富资源,这项任务比预期的要容易得多。

声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: