会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 用于单片机的几种C语言算法!

用于单片机的几种C语言算法

时间:2025-11-05 15:57:28 来源:益强数据堂 作者:系统运维 阅读:790次

 单片机主要作用是用于语控制外围的器件,并实现一定的单片通信和数据处理。虽然单片机不擅长实现算法和进行复杂的算法运算,但在某些特定场合,用于语不可避免地要用到数学运算。单片

比如:在单片机进行数据采集时,算法会遇到数据的用于语随机误差,随机误差是单片由随机干扰引起的,其特点是算法在相同条件下测量同一量时,其大小和符号会现无规则的用于语变化而无法预测,但多次测量的单片结果符合统计规律。

为克服随机干扰引起的算法误差,硬件上可采用滤波技术,用于语软件上可采用软件算法实现数字滤波。单片滤波算法往往是算法系统测控算法的一个重要组成部分,实时性很强。

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

 数字滤波无需其他的硬件成本,只有一个计算过程,可靠性高,高防服务器不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。  数字滤波使用软件算法实现,多输入通道可共用一个滤波程序,降低系统开支。  只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。  在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。

限幅滤波算法

该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。

A的大小由被测对象的具体情况而定,如果小于或等于允许的企商汇最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。

算法的程序代码如下: 

 1#define A //允许的最大差值   2   3char data; //上一次的数据   4   5char filter()  6   7{   8   9    char datanew; //新数据变量  10  11    datanew=get_data(); //获得新数据变量  12  13    if((datanew-data)>A||(data-datanew>A))  14  15        return data;  16  17    else  18  19        return datanew; 20  21} 

说明:

限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到

中值滤波算法

该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。

算法的程序代码如下: 

 1#define N 11 //定义获得的数据个数 2 3char filter()   4   5{   6 7    char value_buff[N]; //定义存储数据的数组 8 9    char count,i,j,temp;  1011    for(count=0;count<N;count++)  1213    {  1415        value_buf[count]=get_data();  1617        delay(); //如果采集数据比较慢,那么就需要延时或中断1819    }  2021    for(j=0;j<N;j++)  2223    { 2425        if(value_buff[i]>value_buff[i+1])  2627        {  2829            temp=value_buff[i];  3031            value_buff[i]=value_buff[i+1];  3233            value_buff[i+1]=temp;  3435        }  3637    }  3839return value_buff[(N-1)/2];  4041} 

说明:中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢,采用中值滤波法效果会比较好,站群服务器但如果数据变化比较快,则不宜采用此方法。

算术平均滤波算法

该算法的基本原理很简单,就是连续取N次采样值后进行算术平均。

算法的程序代码如下: 

 1char filter()   2   3{   4   5    int sum=0;   6   7    for(count=0;count<N;count++)   8   9    {  10  11        sum+=get_data();  12  13        delay():  14  15    }  16  17    return (char)(sum/N);  18 19} 

说明:算术平均滤波算法适用于对具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值附近上下波动。

信号的平均平滑程度完全到决于N值。当N较大时,平滑度高,灵敏度低;当N较小时,平滑度低,但灵敏度高。为了方便求平均值,N一般取4、8、16、32之类的2的整数幂,以便在程序中用移位操作来代替除法。

加权平均滤波算法

由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。

它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。

各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。其中加权平均数字滤波的数学模型是:

式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。

一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。

加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。

样例程序代码如下: 

1char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区   2   3char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;   4   5char filter()   6   7{  8   9    char count;  10  11    char value_buff[N];  12  13    int sum=0;  14  15    for(count=0;count<N;count++)  16  17    {  18  19        value_buff[count]=get_data();  20  21        delay();  22 23    }  24  25    for(count=0;count<N;count++)  26  27        sum+=value_buff[count]*jq[count];  28  29    return (char)(sum/sum_jq);  30  31} 

滑动平均滤波算法

以上介绍和各种平均滤波算法有一个共同点,即每获取一个有效采样值必须连续进行若干次采样,当采速度慢时,系统的实时得不到保证。

这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。

如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。

每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。

程序代码如下: 

 1char value_buff[N];   2  3char i=0;   4   5char filter()   6   7{   8   9    char count;  10  11    int sum=0;  12  13    value_buff[i++]=get_data();  14  15    if(i==N)  16  17        i=0;  18  19    for(count=0;count<N;count++)  20 21        sum=value_buff[count];  22  23    return (char)(sum/N);  24  25} 

低通滤波

将普通硬件RC低通滤波器的微分方程用差分方程来表求,变可以采用软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下: 

1Yn=a* Xn+(1-a) *Yn-1  2  3式中 Xn——本次采样值  4  5Yn-1——上次的滤波输出值;  6  7a——滤波系数,其值通常远小于1;  8  9Yn——本次滤波的输出值。 

由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值,这和加权平均滤波是有本质区别的),本次采样值对滤波输出的贡献是比较小的,但多少有些修正作用,这种算法便模拟了具体有教大惯性的低通滤波器功能。滤波算法的截止频率可用以下式计算: 

1fL=a/2Pit pi为圆周率3.14…  2  3式中 a——滤波系数;  4  5t——采样间隔时间;  6  7例如:当t=0.5s(即每秒2次),a=1/32时;  8  9fL=(1/32)/(2*3.14*0.5)=0.01Hz 

当目标参数为变化很慢的物理量时,这是很有效的。另外一方面,它不能滤除高于1/2采样频率的干搅信号,本例中采样频率为2Hz,故对1Hz以上的干搅信号应采用其他方式滤除,

低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和1-a。为计算方便,a取一整数,1-a用256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a和1-a,均以立即数的形式编入程序中,不另外设表格。

虽然采样值为单元字节(8位A/D)。为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。

设Yn-1存放在30H(整数)和31H(小数)两单元中,Yn存放在32H(整数)和33H(小数)中。 

(责任编辑:人工智能)

上一篇:Justniffer 是一个可用于替代 Snort 的网络协议分析器。它非常流行,可交互式地跟踪/探测一个网络连接。它能从实时环境中抓取流量,支持 “lipcap” 和 “tcpdump” 文件格式。它可以帮助用户分析一个用 wireshark 难以抓包的复杂网络。尤其是它可以有效的帮助你分析应用层流量,能提取类似图像、脚本、HTML 等 http 内容。Justniffer 有助于理解不同组件之间是如何通信的。功能Justniffer 可以收集一个复杂网络的所有流量而不影响系统性能,这是Justniffer 的一个优势,它还可以保存日志用于之后的分析,Justniffer 其它一些重要功能包括:1.可靠的 TCP 流重建它可以使用主机 Linux 内核的一部分用于记录并重现 TCP 片段和 IP 片段。2.日志保存日志用于之后的分析,并能自定义保存内容和时间。3.可扩展可以通过外部的 python、 perl 和 bash 脚本扩展来从分析报告中获取一些额外的结果。4.性能管理基于连接时间、关闭时间、响应时间或请求时间等提取信息。安装Justniffer 可以通过 PPA 安装:运行下面命令添加库:$ sudo add-apt-repository ppa:oreste-notelli/ppa更新系统:$ sudo apt-get update安装 Justniffer 工具:$ sudo apt-get install justniffermake 的时候失败了,然后我运行下面的命令并尝试重新安装服务$ sudo apt-get -f install示例首先用 -v 选项验证安装的 Justniffer 版本,你需要用超级用户权限来使用这个工具。$ sudo justniffer -V示例输出:1.以类似 apache 的格式导出 eth1 接口流量,显示到终端。$ sudo  justniffer -i eth1示例输出:2.可以用下面的选项跟踪正在运行的tcp 流$ sudo  justniffer -i eth1 -r示例输出:3.获取 web 服务器的响应时长$ sudo justniffer -i eth1 -a %response.time示例输出:4.使用 Justniffer 读取一个 tcpdump 抓取的文件首先,用 tcpdump 抓取流量。$ sudo tcpdump -w /tmp/file.cap -s0 -i eth0然后用 Justniffer 访问数据$ justniffer -f file.cap示例输出:5.只抓取http 数据$ sudo justniffer -i eth1 -r -p port 80 or port 8080示例输出:6.获取一个指定主机的 http 数据$ justniffer -i eth1 -r -p host 192.168.1.250 and tcp port 80示例输出:7.以更精确的格式抓取数据当你输入 justniffer -h 的时候你可以看到很多用于以更精确的方式获取数据的格式关键字。$ justniffer -h示例输出:让我们用 Justniffer 根据预先定义的参数提取数据。$ justniffer -i eth1 -l %request.timestamp %request.header.host %request.url %response.time示例输出:其中还有很多你可以探索的选项。总结Justniffer 是一个很好的用于网络测试的工具。在我看来对于那些用 Snort 来进行网络探测的用户来说,Justniffer 是一个更简单的工具。它提供了很多 格式关键字 用于按照你的需要精确地提取数据。你可以用.cap 文件格式记录网络信息,之后用于分析监视网络服务性能。
下一篇:以三的榨汁机材质(探究以三的榨汁机材质的优势与特点)
推荐内容
  • 佳能190相机的卓越性能与多功能性(深度剖析佳能190相机的画质、拍摄模式和操作便捷性)
  • 聊聊PG等待事件清单
  • 运维人员如何应对访问出错故障?
  • Zabbix企业应用 :固定端口监控Redis
  • Ubuntu 和Windows操作系统间可以通过创建共享目录,来进行数据、文件等资源的共享、读写等操作。下面介绍下如何实现在Ubuntu下创建共享目录,然后在windows 下进行该文件夹的访问和读写。Ubuntu安装Samba工具1、进入Ubuntu主界面,双击“Ubuntu 软件中心”(Ubuntu Software Center)2、在搜索输入框中输入“Samba”进行搜索。3、选中下图所示软件项,点击安装按钮进行安装。(注意,我已安装,所以看到的是移除-Remove按钮)创建共享文件夹并设置访问属性1、本文以Home目录进行事例讲解,所以先进入Home目录, 鼠标右键新建一个文件夹。2、命名该文件夹(ShareFolder)后右键该文件夹,在快捷菜单中点击属性(Properties)3、在弹出的对话框中点局域网共享(Local Network Share)一项4、开启所有列出项功能 - 分享,允许创建、删除、允许游客访问,点击创建分享(Create Share)。5、在权限确认对话框中选择自动添加权限,然后点击close关闭对话框即可。测试访问共享目录进行读写操作1、在ShareFolder中新建一个测试文件,以供访问测试使用2、进入Windows系统,打开文件夹或我的电脑,在地址栏中输入你的Ubuntu IP地址,然后点击回车键即可进入Ubuntu共享目录。3、双击ShareFolder, 即可看到前几部创建的test文件4、右键该文件,可以看到该文件支持读写操作。
  • Redis数据一致性问题的三种解决方案