34

关于投票
10种软件滤波方法

 

1、限幅滤波法(又称程序判断滤波法)
    A、方法:
        根据经验判断,确定两次采样允许的最大偏差值(设为A)
        每次检测到新值时判断:
        如果本次值与上次值之差<=A,则本次值有效
        如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
    B、优点:
        能有效克服因偶然因素引起的脉冲干扰
    C、缺点
        无法抑制那种周期性的干扰
        平滑度差
   
2、中位值滤波法
    A、方法:
        连续采样N次(N取奇数)
        把N次采样值按大小排列
        取中间值为本次有效值
    B、优点:
        能有效克服因偶然因素引起的波动干扰
        对温度、液位的变化缓慢的被测参数有良好的滤波效果
    C、缺点:
        对流量、速度等快速变化的参数不宜

3、算术平均滤波法
    A、方法:
        连续取N个采样值进行算术平均运算
        N值较大时:信号平滑度较高,但灵敏度较低
        N值较小时:信号平滑度较低,但灵敏度较高
        N值的选取:一般流量,N=12;压力:N=4
    B、优点:
        适用于对一般具有随机干扰的信号进行滤波
        这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动
    C、缺点:
        对于测量速度较慢或要求数据计算速度较快的实时控制不适用
        比较浪费RAM
       
4、递推平均滤波法(又称滑动平均滤波法)
    A、方法:
        把连续取N个采样值看成一个队列
        队列的长度固定为N
        每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
        把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
        N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4
    B、优点:
        对周期性干扰有良好的抑制作用,平滑度高
        适用于高频振荡的系统   
    C、缺点:
        灵敏度低
        对偶然出现的脉冲性干扰的抑制作用较差
        不易消除由于脉冲干扰所引起的采样值偏差
        不适用于脉冲干扰比较严重的场合
        比较浪费RAM
       
5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
    A、方法:
        相当于“中位值滤波法”+“算术平均滤波法”
        连续采样N个数据,去掉一个最大值和一个最小值
        然后计算N-2个数据的算术平均值
        N值的选取:3~14
    B、优点:
        融合了两种滤波法的优点
        对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
    C、缺点:
        测量速度较慢,和算术平均滤波法一样
        比较浪费RAM


6、限幅平均滤波法
    A、方法:
        相当于“限幅滤波法”+“递推平均滤波法”
        每次采样到的新数据先进行限幅处理,
        再送入队列进行递推平均滤波处理
    B、优点:
        融合了两种滤波法的优点
        对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
    C、缺点:
        比较浪费RAM

7、一阶滞后滤波法
    A、方法:
        取a=0~1
        本次滤波结果=(1-a)*本次采样值+a*上次滤波结果
    B、优点:
        对周期性干扰具有良好的抑制作用
        适用于波动频率较高的场合
    C、缺点:
        相位滞后,灵敏度低
        滞后程度取决于a值大小
        不能消除滤波频率高于采样频率的1/2的干扰信号
       
8、加权递推平均滤波法
    A、方法:
        是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
        通常是,越接近现时刻的数据,权取得越大。
        给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低
    B、优点:
        适用于有较大纯滞后时间常数的对象
        和采样周期较短的系统
    C、缺点:
        对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号
        不能迅速反应系统当前所受干扰的严重程度,滤波效果差

9、消抖滤波法
    A、方法:
        设置一个滤波计数器
        将每次采样值与当前有效值比较:
        如果采样值=当前有效值,则计数器清零
        如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
            如果计数器溢出,则将本次值替换当前有效值,并清计数器
    B、优点:
        对于变化缓慢的被测参数有较好的滤波效果,
        可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动
    C、缺点:
        对于快速变化的参数不宜
        如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统

10、限幅消抖滤波法
    A、方法:
        相当于“限幅滤波法”+“消抖滤波法”
        先限幅,后消抖
    B、优点:
        继承了“限幅”和“消抖”的优点
        改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统
    C、缺点:
        对于快速变化的参数不宜

 

系统分类: 模拟技术
用户分类: 单片机类
标签: 无标签
来源: 整理
发表评论 阅读全文(978) | 回复(1)

33

关于投票
51单片机开发的原理图
rar
系统分类: 单片机
用户分类: 单片机类
标签: 无标签
来源: 原创
发表评论 阅读全文(910) | 回复(0)

38

关于投票
motorola芯片分类
1.dsp 
(1)dsp56300 
(2)dsp56800 
(3)dsp56810 
(4)MSC8100(starcore) 
(5)dsp development tools(hardware software) 
(6)dsp achives 
2.Microcontrollers 
(1)8-bit 
MCH68CH05 
MCH68CH08 
MCH68CH11 
(2)16-bit 
HCS12 
M68HC12 
DSP56800 
M68HC16 
(3)32-bit 
68K 
M683XX 
M*core 
MPC500
系统分类: 单片机
用户分类: 单片机类
标签: 无标签
来源: 原创
发表评论 阅读全文(853) | 回复(0)

61

关于投票
Skyeye安装手记
最近好不容易把Skyeye整到我Vmware虚拟机上了,参考了不少资料,终于完成,供大家参考。


1 在linux 下安装skyeye
1.1 从源代码进行安装skyeye
下载最新的skyeye-v0.x.x.tar.bz2源码包
解开skyeye-v0.x.x.tar.bz2 :
tar jxf skyeye-v0.x.x.tar.bz2
进入解压后的skyeye目录,按照SkyEye.README介绍的步骤做configure,make,make install
cd skyeye
./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest
make
make install
如果一切正常,则在/usr/local/bin目录下,有一个执行文件skyeye
注意:
需要指出的是,在mandrake8.2环境中,make 时会有error,不过不是什么大问题,
error:display.c->tcap.h->termcap.h:no such file or directory
在本机/usr/include下find一下,termcap.h头文件在/usr/include/ncurses目录下,
将termcap.h中的<termcap.h>改成<ncurses/termcap.h>
重新执行make就ok了。
执行make install命令后,skyeye默认安装在/usr/local/bin/目录下,你可以通过改configure命令参数prefix来改变安装路径。
1.2 直接安装编译好的skyeye
下载最新的skyeye执行代码skyeye-0.x.x-redhat9.0.bin (目前只提供了在redhat9下编译好的代码),目前最新的版本为 skyeye-0.4.7-redhat9.0.bin
把下载的skyeye-0.4.7-redhat9.0.bin 移动到/usr/local/bin下,并改名为skyeye,改变skyeye的属性:
mv skyeye-0.4.7-redhat9.0.bin /usr/local/bin/skyeye
chmod 755 /usr/local/bin/skyeye
2 安装arm-elf交叉编译器 (用于编译ucosii4skyeye 和 uclinux4skyeye)
下载arm-elf-tools-20030314.sh 位于 ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm目录下,或到www.uclinux.org处下载
改变文件属性,并执行:
chmod 755 arm-elf-tools-20030314.sh
./arm-elf-tools-20030314.sh
结束后,arm-elf-gcc/gdb....工具会安装到/usr/local/bin下
3 安装 ucosii for skyeye
3.1 从源码安装
下载ucosii for skyeye源代码,目前的最新版本源代码为ucosii4skyeye-v1.8.2.tgz
解压文件:
tar zxf ucosii4skyeye-vx.x.x.tgz
进入解压生成的目录下,编译ucosii for skyeye:
cd ucosii4skyeye
make config
make dep
make
结束后,则生成五个sample的执行文件,分别位于ucosii4skyeye/samples/对应的应用名目录下。
3.2 直接下载编译好的cuosii for skyeye
目前最新的版本为ucosii4skyeye-binary-v1.8.tgz
解压文件:
tar zxf ucosii4skyeye-binary-v1.8.2.tgz
4 调试 ucosii for skyeye
在一个存在 skyeye.conf和*.elf文件(设为simple_test.elf)的目录下,执行:
skyeye simple_test.elf
(skyeye) target sim
(skyeye) load
(skyeye) run
就可以看到程序运行的情况
5 编译并运行uClinux-dist-20020927.tar.gz
运行环境:redhat9
前提:安装了 arm-elf-tools工具
以uClinux-dist-20020927.tar.gz为例。位于 ftp://166.111.68.183/pub/embed/uclinux/soft/目录下,或到www.uclinux.org处下载
将uClinux-dist-20020927.tar.gz下载并解开,比如解开在/usr/src/uclinux-dist/下,然后在/usr/src/uclinux-dist/目录下执行如下命令:
tar zxf uClinux-dist-20020927.tar.gz
cd uClinux-dist
在图形方式下可用命令 make xconfig 或 在命令行方式下可用命令 make menuconfig
在vendor/product中选择GDB/ARMulator,kernel版本选择2.4,save and exit.
------------------------------------------------------------------------------------------------------------------------------------------------
这时在/usr/src/uclinux-dist/linux-2.4.x目录下生成linux文件
如果想一步生成带调试信息的linux kernel执行文件和linux kenel 执行文件映像和磁盘映像文件romfs.img
可简单是运行命令
make dep
make
就行了。可查看/usr/src/uclinux-dist/images/下是否有文件 romfs.img等
在/usr/src/uclinux-dist/linux-2.4.x目录下生成linux的elf格式的内核执行文件
-------------------------------------------------------------------------------------------------------------------------------------------------
在 uclinux-dist 目录下建立仿真AT91的skyeye配置文件 skyeye.conf,内容如下:
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
这个时候就可以用skyeye来调试运行kernel了,在/usr/src/uclinux-dist执行如下命令:
skyeye linux-2.4.x/linux
(skyeye)target sim
(skyeye)load
(skyeye)run
kernel start.....
注意:
要在 skyeye.conf 所在目录下执行skyeye。
6 下载测试软件集合
目前最新版本的测试软件集合为:
skyeye-binary-testsuits-in-rh9-2003-09-21.tar.bz2
到 ftp:/166.111.68.183/pub/embed/skyeye/binary/下载
解压并测试:
tar jxf skyeye-binary-testsuits-in-rh9-2003-09-21.tar.bz2
cd test
可以看到有编译好的skyeye 和编译好的针对各个硬件平台的内核代码
执行过程与上面类似
系统分类: 生活点滴
用户分类: 单片机类
标签: 无标签
来源: 原创
发表评论 阅读全文(1949) | 回复(4)

60

关于投票
初学单片机步骤
初学单片机步骤精华帖
 1。懂一些数字电路
    2。选一种单片机进行学习,建议你最好先学8051单片机,因为8051方面的书籍、资料、器材都较多,而PIC及其它系列在这一点上则显得不太理想。 
   3。购买单片机的书籍最好是书的前面你能看懂,后面你不懂的,其次可以买一些应用方面的书籍以便参考。
   4。应该购置相关单片机的芯片、编程器、实验板,以及开发他的相关软件。并以边看书边实验的方式进行学习其效果将明显好的多。
   5。最后软件编程,首先应掌握基本的汇编指令,然后就是熟悉C编程。Keil C 
希望初学者能得到收获
系统分类: 单片机
用户分类: 单片机类
标签: 无标签
来源: 原创
发表评论 阅读全文(1090) | 回复(1)

35

关于投票
利用KeilCx51实现T0的精确定时
利用89C51设计一个简易日历时钟系统,时钟系统硬件主要由单片机控制的计时电路、复位等辅助电路、按键电路、数码管显示电路、电源系统等组成。日历时钟可以显示年、月、时、分、秒;可以设置年、月、时、分。其中计时控制电路由AT89C51单片机控制;按键电路包含时间设置;时间显示屏电路由7个数码管组成;电源系统由小功率整流滤波稳压电路组成,输出直流电压5 V,向主电路及显示电路供电。系统框图如图1所示。

点击看大图

    在计时过程中,系统利用89C51自身的计时器T0作为时钟基准,计时器中断的准确度直接关系到整个系统的精度,因此获取精确的定时时钟信号成为该系统的关键。MCS-51单片机内有2个可编程的16位定时器/计数器,在本系统设计中采用AT89C51的定时器T0,并工作在方式l下,晶振频率为12MHz。

1 T0定时中断
    定时器/计数器T0工作方式1的电路逻辑结构如图2所示。TO定时特性功能寄存器由TL0(低8位)和TH0(高8位)构成。特殊功能寄存器TMOD控制定时寄存器的工作方式;TCON则用于控制定时器T0和T1的启动和停止计数,同时管理定时器TO和T1的溢出标志等。程序开始时需对TL0和TH0进行初始化编程,以定义它们的工作方式,并控制T0和T1的计数。在系统的设计中,计时单位以s为基准,并要求日误差≤10 s,如果用循环去做,无法满足精度要求。选用12 MHz的晶体可得到lμs的精度,经分析确定使用定时器0的方式l。这个方式下 定时器0是16位定时器,也就是最大定时值为jFFFFH,12 MHz晶体的每个定时周期为1 μs,最多可以定时FFFFH×1 μs=65635 μs,即使使用最大值也无法一次定时1 s,设计中使用1次定时20 ms,50次定时中断得到1 s。20 ms定时中断的定时值为:FFFFH-20 ms/l μs=B1DFH[1]. 

2 程序测试与调整
在Keil uVision3平台下利用C语言实现如下代码:
#include
#define uehar unsigned char
uehar data MScond="0"; //ms
uchar data Scond="0"; //s
uchar data Minure="0"; //rain
uchar data Hollr="0"; //h
void main(void){
EA=1; //允许CPU中断
ET0=1; //定时器0中断打开
TMOD=0xl; //设定时器0为方式1
TH0=0xBl:
TL0=0xDF~ //设定时值为20 000 μs(20 ms)
TR0=1; //开始定时
while(1);
}
void Time0(void)interrupt 1 using 1
{TH0=0xBl; //20 ms断点 (1)
TL0=0xDF; //设定时值
MScond=MScond+1 ;
if(MScond==50)
{MScond=0;
Scond=Scond+1;
if(Seond==60)
{Scond=0;
Minute=Minute+1; //分断点 (2)
if(Minute==60)
{Minute=0;
Hour=Hour+1; //d,时断点 (3)
if(Hour==24)
{Hour=0;}}}}

    首先调试每20 ms中断时的精度,在选项中设定调试晶振为12 MHz,在(1)处设置一个断点再运行,这时记录下每次中断时的时间,如图3所示。在初始化中费时为551 μs,每一次中断时间应该考虑该项的影响。在实际处理中可以利用两次中断时间的差来作为定时器的中断时间间隔。

点击看大图

    通过测试,得到第一次为0.020 568 00 s,第二次为0.040 580 00 s,第三次为0.060 59Z 00 s。可以看出,每中断一次会比定时值长了12 μs。如果将断点设定在(2)处,并通过Logic Analyzer tool,得到分钟第一次中断的时间为60.036 57 s,第二次中断的时间为120.072 57 s,则每分钟的实际时间为60.036 s。再将断点设定在(3)处,得到小时第一次中断的时间为3 602.160 576 s,第二次中断的时间为7 204.320 576 s,可以得到小时的实际时间为3 602.16 s,如图4所示。

点击看大图


    为什么会产生这些误差呢?通过对中断程序的汇编源码进行分析,实际上中断程序入堆栈时使用了两条语句:PUSH ACC和PUSH PSW。执行人栈指令花费了4个机器周期,加上重新对TH0和TL0的加载又用去2个机器周期,计数值加1花费了2个机器周期,中断返回约4个机器周期共约12个机器周期。为了消除这些因素的影响,需要在对T0设置计数值时减去12个机器周期,将计算得到的初始值B1DFH加上12(0CH)得到:B1DFH+12=B1EBH作为新的定时器初值,修改后的程序为:
#include
#define uchar unsigned char
uchar data MScond="0";//ms
uehar data Seond="0"; //s
uchar data Minute:0; //rain
uchar data Hour="0"; //h
void main(void){
EA=1; //允许CPU中断
ET0=1; //定时器0中断打开
TMOD=Oxl; //设定时器0为方式1
TH0=0xBl;
TL0=OxEB; //设定时值为20 000 μs(20 ms)减去12 μs
TR0=1; //开始定时
while(1);
void Time0(void)interrupt 1 using 1
{TH0=0xBl; //20 ms断点 (1)
TL0=0xDF‘ //设定时值
MSeond=MScond+1:
if(MSeond==50)
{MScond=0;
Seond=Seond+1 ;
if(Scond==60)
{Scond=0;
Minute=Minute+1;//分断点 (2)
if(Minute==60)
{Minure=0;
Hour=Hour+1; I/d,时断点 (3)
if(Hour==24)
{Hour=0;}}}}

    重新调试程序,仍然在选项中设定调试晶振为12 MHz,重新测试20 ms定时器的实际时间,在(1)处设置一个断点后运行,重新记录下每次中断时的时间,如图5所示。初始化时间为556 μs,为消除其影响,使用两次中断时间间隔来作为定时器实际获得的基准时钟。

点击看大图


    得到第一次中断时的时间为0.020 556。O s,第二次为O.040 556 000 s,第三次为0.060 556。O s,可以看出每次中断间隔刚好20 ms。如果将断点设定在(2)处,并通过Logle Analyzer tool,得到第一次中断时时间为60.000 57 s,第二次为120.000 57 s,间隔刚好60 s。将断点设定在(3)处,得到第一次中断的时间为3 600.000 578 s,第二次中断时间为7 200.000 578 s,时间间隔为3 600 s,测试结果如图6所示,完全可以满足系统设计的需要。

点击看大图

3 总结
    通过对定时器的误差分析和校正,可以提高系统的精确度。当然,上面的分析是在软环境下理想晶振频率下实现的,在现实中会因晶振偏差等因素而造成误差[2]。在该测试中,主程序没有进行其他处理,而在日历设计中还要涉及到计时器T1的中断来完成对扫描显示电路的处理,还包括外部中断对时钟进行了调整,加上一些闹钟功能,这必然会对T0的定时精确性产生影响。另外,当中断程序中语句越多,占用的机器周期也越多,因此在设计中应充分利用Keil uVIsion3的分析工具,通过多次调整计数初值以获取精确的时钟信号,这对于要求精确时钟信号的应用具有重要的意义。

系统分类: 单片机
用户分类: 单片机类
标签: 定时
来源: 原创
发表评论 阅读全文(899) | 回复(3)

35

关于投票
数字电路抗干扰
 在电子系统设计中,为了少走弯路和节省时间,应充分考虑并满足抗干扰性 的要求,避免在设计完成后再去进行抗干扰的补救措施。形成干扰的基本要素有三个:
(1)干扰源,指产生干扰的元件、设备或信号,用数学语言描述如下:du/dt, di/dt大的地方就是干扰源。如:雷电、继电器、可控硅、电机、高频时钟等都可 能成为干扰源。
(2)传播路径,指干扰从干扰源传播到敏感器件的通路或媒介。典型的干扰传 播路径是通过导线的传导和空间的辐射。
(3)敏感器件,指容易被干扰的对象。如:A/D、D/A变换器,单片机,数字IC, 弱信号放大器等。

抗干扰设计的基本原则是:抑制干扰源,切断干扰传播路径,提高敏感器件的 抗干扰性能。(类似于传染病的预防)
1 抑制干扰源
  抑制干扰源就是尽可能的减小干扰源的du/dt,di/dt。这是抗干扰设计中最优 先考虑和最重要的原则,常常会起到事半功倍的效果。 减小干扰源的du/dt主要是通过在干扰源两端并联电容来实现。减小干扰源的 di/dt则是在干扰源回路串联电感或电阻以及增加续流二极管来实现。
  抑制干扰源的常用措施如下:
(1)继电器线圈增加续流二极管,消除断开线圈时产生的反电动势干扰。仅加 续流二极管会使继电器的断开时间滞后,增加稳压二极管后继电器在单位时间内可 动作更多的次数。
(2)在继电器接点两端并接火花抑制电路(一般是RC串联电路,电阻一般选几K 到几十K,电容选0.01uF),减小电火花影响。
(3)给电机加滤波电路,注意电容、电感引线要尽量短。
(4)电路板上每个IC要并接一个0.01μF~0.1μF高频电容,以减小IC对电源的 影响。注意高频电容的布线,连线应靠近电源端并尽量粗短,否则,等于增大了电 容的等效串联电阻,会影响滤波效果。
(5)布线时避免90度折线,减少高频噪声发射。
(6)可控硅两端并接RC抑制电路,减小可控硅产生的噪声(这个噪声严重时可能 会把可控硅击穿的)。

按干扰的传播路径可分为传导干扰和辐射干扰两类。
所谓传导干扰是指通过导线传播到敏感器件的干扰。高频干扰噪声和 有用信号的频带不同,可以通过在导线上增加滤波器的方法切断高频干扰 噪声的传播,有时也可加隔离光耦来解决。电源噪声的危害最大,要特别 注意处理。所谓辐射干扰是指通过空间辐射传播到敏感器件的干扰。一般 的解决方法是增加干扰源与敏感器件的距离,用地线把它们隔离和在敏感 器件上加 蔽罩。

切断干扰传播路径的常用措施如下:
(1)充分考虑电源对单片机的影响。电源做得好,整个电路的抗干扰就 解决了一大半。许多单片机对电源噪声很敏感,要给单片机电源加滤波电路 或稳压器,以减小电源噪声对单片机的干扰。比如,可以利用磁珠和电容 组成π形滤波电路,当然条件要求不高时也可用100Ω电阻代替磁珠。
(2)如果单片机的I/O口用来控制电机等噪声器件,在I/O口与噪声源之 间应加隔离(增加π形滤波电路)。 控制电机等噪声器件,在I/O口与噪声源之 间应加隔离(增加π形滤波电路)。
(3)注意晶振布线。晶振与单片机引脚尽量靠近,用地线把时钟区隔离 起来,晶振外壳接地并固定。此措施可解决许多疑难问题。
(4)电路板合理分区,如强、弱信号