judy的博客

6种常见的单片机数字滤波算法

judy的头像

单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。

在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。

采用数字滤波算法克服随机干扰的误差具有以下优点:

1、数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。

2、数字滤波使用软件算法实现,多输入通道可共用一个滤波程序,降低系统开支。

3、只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。

4、在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。

MCU产品、软件、生态系统的演变及未来展望

judy的头像

作者:王朋朋

单片机进入中国30年,也正是单片机高速发展的时代。从简单的控制到嵌入式系统,再到物联网,从工业领域到消费电子、安防、医疗、汽车、智能家居等产品,单片机无处不在,并从高科技领域越来越多的进入我们的日常生活。

单片机的发展从8位开始,目前8位单片机仍占有较高市场份额,在很多应用中发挥重要作用,但32位的ARM产品显然成长更快。从8位到32位,不仅仅是位数和CPU内核的变化,在软件开发、工具和环境、工程师开发方式、生态系统方面,都带来了深刻的变化。甚至产品的名字也从早期的“单片机”,到更多地使用“微控制器”或者“嵌入式系统”这样的术语(如表1)。我们下文更多以MCU或微控制器来指代这一产品。

基于TI-RTOS的CC2650DK开发(14)---邮箱

judy的头像

Mailboxes(邮箱)

ti.sysbios.knl.Mailbox模块提供了一系列函数管理mailboxes。Mailboxes可用于在相同处理器的两个task中传递缓冲。一个Mailbox实例可用于多个readers和writers。

Mailbox模块拷贝缓冲到合适尺寸的内部缓冲。这些缓冲的尺寸和个数在Mailbox实例创建时指定。拷贝在通过Mailbox_post()发送缓冲时建立。另外一份拷贝在通过Mailbox_pend()接收缓冲时建立。

Mailbox_create()和Mailbox_delete()分别用于创建和删除mailboxes。你也可以静态地创建mailbox对象。Mailbox可用于确保输入缓冲流不会超过系统处理那些缓冲的能力。本节稍后给出的例子演示了这种设计。

在创建mailbox时,你可以为每个缓冲指定其尺寸以及内部mailbox缓冲的个数。在创建Mailbox时确定尺寸之后,所有Mailbox的发送和接收缓冲必须使用这个相同的尺寸。

基于TI-RTOS的CC2650DK开发(13)---门

judy的头像

Gates(门)

Gates是用于防止并发访问代码关键区域的设备。各种门关于如何锁住关键区域的实现并不一样。

线程可以被更高优先级线程抢占,一些代码段在被另一个线程执行前需要被一个线程执行完毕。使用代码改变关键区域的全局变量这样的普通应用需要通过Gate来进行保护。

Gates通常用于禁用一些级别的抢占,如禁用task切换或甚至硬件中断,或用于二元semaphore。通过使用一个key,所有Gate实现支持嵌套。

对于禁止函数抢占的门来说,有可能多个线程调用Gate_enter(),但在所有线程调用Gate_leave()之后,才能重新载入抢占。这个功能通过使用一个key来实现。调用Gate_enter()时返回的key必须在之后传递回Gate_leave()。只有最外层调用的Gate_enter()返回正确的key才会重新载入抢占。

基于TI-RTOS的CC2650DK开发(11)---信号量

judy的头像

信号量(Semaphores)

SYS/BIOS在semaphores的基础上提供了一系列用于任务间同步和通信的函数。Semaphore通常用于协调访问一系列竞争任务间的共享资源。Semaphore模块提供的函数通过Semaphore_Handle类型句柄来操作semaphore对象的访问。参阅video introducing Semaphores进行概览。

无论是简单的(FIFO)或是优先级semaphores,Semaphore对象即可声明为计数semaphore,也可声明为二元semaphore。Semaphores可被用于task同步或互斥。相同的APIs可同时用于计数和二元semaphores。

基于TI-RTOS的CC2650DK开发(10)---空闲循环

judy的头像

The Idle Loop

dle Loop是 SYS/BIOS中的后台线程,在没有Hwi、Swi或Task时持续运行。任何其它线程在任何时间可抢占Idle Loop。

Idle管理器允许你在Idle Loop中插入函数运行。在configured. Idle_loop中会调用的每个Idle对象所相联的函数。Idle Loop每次调用一个函数,并在一个连续循环中往复调用所有函数。

所有Idle线程都按顺序运行于相同的优先级。函数按照创建的顺序依次运行。一个Idle函数必须完成后才会开始另一个Idle函数。当最后一个Idle函数完成,则又重新运行第一个Idle函数。

Idle Loop函数经常用于轮询那些不会(或不能)产生中断的非时实设备,用于监测系统状态或执行其它后台活动。

在SYS/BIOS应用程序中,Idle Loop的优先级最低,仅在没有Hwis、Swis或Tasks时运行。

CPU和线程的载入是在Idle Loop函数中计算完成的(目标和主机间的数据传送由一个低优先级task完成)。

基于TI-RTOS的CC2650DK开发(8)---任务

judy的头像

3.6 Tasks

SYS/BIOS task对象是由Task模块管理的线程。Tasks的优先级高于Idle Loop并低于硬件中断和软件中断。参阅video introducing Tasks进行概览。

Task模块基于task的优先级和当前task的运行状态动态地安排和抢占tasks。 这确保了处理器永远运行那些拥有最高优先级的线程。tasks的优先级总共有32个级别,默认优先级是16。MSP430和C28x的最高优先级是16。最低优先级0保留用于运行Idle Loop。

Task模块提供了一系列函数用于控制task对象。它们通过Task_Handle类型句柄访问Task对象。

内核为每个task对象维护了一个处理器寄存器拷贝。每个task都有自己的运行时栈用于存储本地变量以及下一层嵌套函数调用。见3.6.3节获取更多关于任务栈尺寸的输电网信息。

所有运行于单个程序中的tasks共享一个公共的全局变量集合,按照为C函数定义的标准规则范围进行访问。

3.6.1 创建Tasks

页面

订阅 RSS - judy的博客