数控滤波器的研究

数控滤波器的研究

信宜市职业技术学校   李昌荣

摘要本文以数控低通滤波器为例来说明数控滤波器的设计。利用DAC1208及单片机系统实现程控截止频率的低通滤波器设计,由单片机系统、D/A转换系统、运算放大系统三大系统组成,阐述了硬件结构和软件设计。单片机采用89S52芯片,D/A转换采用12位高分辨率的DAC1208芯片。运算放大系统由LM358、LF356芯片组成。

关键词程控滤波器;单片机;DAC1208;截止频率;低通滤波器;

在无线电通讯、自动测量及控制系统、数据采集系统等领域中,常常利用滤波电路进行信号的处理。 滤波电路的作用实质上是“选频”,即允许某一部分频率的信号顺利通过,而使另一部分频率的信号被急剧衰减(即被滤掉)。

在信号频率动态范围不宽的场合, 设定固定截止频率的滤波技术已很成熟, 但在声频工程应用领域, 信号频率的动态范围往往很宽, 其信号频率在几赫兹到几千赫兹之间不等。因此就有必要采用多种截止频率的滤波器, 用程控方法对频率动态范围宽的信号进行滤波。最通常的想法是用电阻、电容以及运放组成滤波器, 并通过模拟开关选取不同的阻值以实现截止频率的改变, 但是这样分布参数较大, 截止频率精度不高, 并且当要求较多时, 所需模拟开关必然很多,电路复杂。因此最好应用便于控制的滤波器集成电路辅以可程控的简单的外围器件实现。本文利用12位分辩率的DAC1208数摸转换芯片结合单片机系统实现程控低通滤波器的设计。

1. 系统总体设计

 

1  系统总设计框图

1中,本设计中的键盘电路采用独立式键盘,单片机采用89S52芯片。由键盘设定滤波器的截止频率,单片机对此频率进行运算,算出与此频率相对应的数字量Di,并将Di通过I/O口传送到DAC1208进行D/A转换。运放A1设计成电压跟随器方式,为D/A转换提供基准电压UREF。待滤波的原信号Ui通过电阻R1送到运放A1的同相输入端,运放A1的输出电压直接送到DAC1208芯片的基准电压输入端。经过D/A转换后得到的输出电流IOUT1、IOUT2由DAC1208芯片的13、14脚输出,再送入到运放A2的信号输入端。运放A2对滤波后的信号进行放大输出。运放A2的输出端再通过电阻R2把信号反馈回运放A1的同相输入端。显示模块负责显示滤波器当前工作的截止频率。显示模块由三个共阴极的LED数码管组成。显示的滤波器截止频率范围是1KHZ—999KHZ。电源电路则为各个电路模块提供工作电源

2.系统硬件设计

2.1 CPU芯片

由于本低通滤波器软件程序量不是很大,因而CPU选用89S52芯片。片内含有8K ROM,不需外部扩展ROM。硬件简单,调试方便。如图2所示,单片机的时钟电路采用12M的晶振,复位电路采用电平方式开关复位电路。

AT89S52是一种低功耗、高性能的CMOS8位微控制器,具有8K在系统可编程的Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,3个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

 

 

2  89S52时钟电路和复位电路原理图

2.2 DAC1208结构特点

 

3  DAC1208内部结构图

如图3所示,DAC1208是12位带有双缓冲器的D/A转换器。内部有8位输入锁存器,4位输入寄存器,12位DAC寄存器,12位DAC乘法器。但对于输入寄存器而言,则是有一个8位寄存器和一个4位寄存器组成,以便于和8位的CPU连接。但与单片机89S52连接时,必须保证12位数字量同时送入D/A转换器进行转换。DAC1208内部有两级锁存器,利用前一级锁存器分两次送入12位数据.第一次先送高8位数据,在第二次送低4位数据时,同时打开后一级锁存器,使12位数据一起进行D/A转换。

2.3 显示电路设计

 

4  显示电路原理图

如图4所示,显示电路由发光LED、限流电阻、LED数码管和CD4511驱动器组成。3个LED数码管用于显示滤波器的截止频率,分别显示截止频率的个位、十位、百位。每个LED数码管有各自的CD4511驱动器负责驱动。P2.3、P2.4、P2.5三个I/O口用于实现3个LED数码管驱动的片选。3个LED数码管均采用共阴极连接。每个LED数码管旁边分别配上一个发光LED,其作用是:当键盘电路中的按键对滤波器的截止频率进行设置时,选通其中某位时,其对应的发光LED就亮。没有被选通的,其对应的发光LED不亮。例如:选通个位时,个位对应的发光LED就亮。十位和百位对应的发光LED不亮。

2.4 键盘电路设计

5  键盘电路原理图

如图5所示,键盘电路由单片机的P1.0—P1.3四个I/O口、W1--W4四个按键开关、4个限流电阻、+5V电源组成。W1键是移位键,其功能是移位选通滤波器截止频率的百位、十位、个位3位的其中某位。W2键、W3键是数值加键、数值减键。这3个按键均采用加一移位的方式。例如:通过W1键的有效按下,选通十位,则十位对应的发光LED亮,再通过有效按下W2键或W3键,设定0—9中的某一位数字,例如设定是“5”,再由数码管把“5”显示出来。W4是滤波器截止频率设定确定按键。当滤波器的截止频率设定好了,按下W4键进行确认,刚才设置的滤波器截止频率就会保存下来,单片机再执行相关的操作。2.5 运算放大器电路设计

如图6所示,运放A1A采用LM358芯片,设计成电压跟随器,输出端连接到DAC1208芯片的10脚,为DAC1208提供基准电压UREF。运放A2采用LF356芯片。滑动电阻器RW用于输出电压的零位调整。待滤波的信号Ui经电阻R1输入到运放A1A的同相输入端,运放A1A输出电压送到DAC1208的10脚,经DAC1208D/A转换后的电流IOUT1、IOUT2由DAC1208芯片的13、14脚输出,分别送到运放A2的反相、同相输入端,进行放大输出。运放A2的输出端通过电阻R2反馈回运放A1A的同相输入端。

 

 

6  运算放大器电路原理图

运放A1A工作在电压跟随状态,为D/A转换器提供基准电压UREF,因为UO反馈回A1A同相端,有:

 

(1) DAC1208的输出电流为:

                                

(2) 式中R为DAC1208内部R—2R译码网络的电阻。电阻R的取值为15KΩ。

运放A2的输出电压为:  

                          

(3)将(2)(3)两式代入(1)式即可得到滤波器的传输函数:

           

这正是一阶低通滤波器的传递函数。

其中:           

就是截止频率。

由此可见,在2n个台阶上,可以被输入的数字编码Di控制。利用单片机键入不同的Di就可以改变滤波截止频率,达到程控低通滤波的目的。

本设计中,低通滤波器的截止频率范围是1 KHZ 至999 KHZ 。各个元件参数取值如下:R1=2MΩ,R2=20KΩ,R=15KΩ,C=0.22μF。常数

A取整数300。有=A*Di得,当min=1KHZ时,Di=/A=1KHZ/300=3.33。当max=999KHZ时,Di=/A=999KHZ/300=3330。

2.6 电源电路设计

 

7  电源电路原理图

如图7所示,电源电路由变压器、整流桥、7815芯片、7805芯片、滤波电容、分压电阻组成。因为运放A2采用LF356芯片,需要15V正负电源,所以使用具有中心抽头的变压器。此电路产生+5V、±15V电源。

3. 系统软件设计

8  主程序流程图

系统软件主程序流程如图8所示,其工作流程如下:先通过键盘电路设定滤波器的截止频率,并由数码管显示出来。再检测确认键是否按下并释放,当检测到确认键按下并释放,就把存储在寄存器的滤波器截止频率调出来,按预先设定好的算法进行计算,算出与当前截止频率相对应的数字量Di。再把此数字量Di送到DAC1208的12位DAC寄存器。DAC1208芯片配合运放电路,对输入信号进行滤波。最后返回主程序开始端,等待下一次滤波器截止频率的设定。在下一次滤波器截止频率设定生效前,此滤波器都按当前设定的截止频率工作,直至下一次滤波器截止频率设定生效,才按新设定的截止频率工作。

键盘输入子程序流程如图9所示,其工作流程如下:先检测移位键是否按下并释放,当检测到移位键按下并释放时,确定移位选通具体哪一位,再通过数值加减键来对此选通位进行频率的设定。当滤波器的截止频率设定好了,等待确认键的闭合,对此截止频率进行确认。最后返回主程序。

百、十、个位数值设定子程序流程如图10所示,其工作流程如下:移位键选通了百、十、个位的其中某位,其对应的指示灯亮。用于存储数值的寄存器先置0,对应数码管显示“0”。再通过数值加键或数值减键来设定具体数值。当检测到数值加键有效按下并释放,寄存器内容执行加1操作,数码管显示当前寄存器的数值;当检测到数值减键有效按下并释放,寄存器内容执行减1操作,数码管显示当前寄存器的数值。当移位键选通其他位时,此指示灯灭,返回主程序。

由于DAC1208是12位数据总线,因此对于8位的单片机要分两次从CPU送出。只可连接成双缓冲器方式。数据的操作分三次进行。首先将高8位数据写入8位输入锁存器,其次将低4位数据写入4位输入锁存器,最后将12位数据从输入锁存器中写入12位的DAC寄存器。设12位转换数据分两个字节存放在内部RAM中的两个单元30H和31H中。其中高8位存在30H单元中,低4位存在31H单元的低4位中。本设计中,当送高8位时,其地址是:0BFFFH,此时低4位输入寄存器和12位DAC寄存器均不通。当送低4位时,其地址是:3FFFH,此时高8位输入寄存器和12位DAC寄存器均不通。当12位数据一齐送DAC寄存器时,其地址是:7FFFH。此时低4位输入寄存器和高8位输入寄存器均不通。具体程序附于附录2。

 

 

 

9 键盘设定输入子程序流程图

      

  10百、十、个位数值设定子程序流程图

4. 结束语

本设计使用的DAC1208是12位分辩率的D/A转换芯片,这种芯片的转换精度较高,反应速度快,接口简单,价格低廉,再加上89S52单片机的配合,外围元件少,使系统设计简单,成本低。但由于时间关系,只实现低通滤波,频率覆盖范围不够宽,日后可把本设计扩展到高通滤波、带通滤波、带阻滤波。以后可对此加以改进,不断完善。

 

 

参考文献

[1] 杨素行. 模拟电子技术基础简明教程[M].北京:高等教育出版社,2004.367--380

[2] 陈大欣. 模拟电子技术基础[M].北京:高等教育出版社,2002.250--261

[3] 顾滨等. 单片微计算机原理、开发及应用[M].北京:高等教育出版社,2004.14--96

[4] 王幸之等. AT89系列单片机原理与接口技术[M].北京:北京航空航天大学出版社,2004.43--58

[5] 付家才. 单片机控制工程实践技术[M].北京:化学工业出版社,2004. 99--105

[6] 余孟尝. 数字电子技术基础简明教程[M].北京:高等教育出版社,2003.393--399

[7] 窦振中. 单片机外围器件实用手册输出通道器件分册[M].北京: 北京航空航天大学出版社,2003.1--321

[8] 秦迎春. 利用DAC1208实现程控低通滤波器设计[J].河南科学,2003,(21):78--80

附录

附录1 电路原理图

附录2  软件程序 

       ORG    0000H

       LJMP   MAIN

MAIN: LCALL KEY             ;调用键盘设定输入子程序

       JB    P1.3 ,MAIN      ;确认键没有闭合,返回

       LCALL DELAY-10ms       ;闭合,延时去抖动

JB    P1.3 ,MAIN

DDSF: JNB   P1.3 ,DDSF      ;等待确认键释放

       CLR   P1.5             ;片选指示灯全灭

       CLR   P1.6

       CLR   P1.7

       MOV   A  , R1

       MOV   B ,#100

       MUL   A ,B            ;R1*100

       MOV   R4 ,B           ;乘积高8位送R4

       MOV   R5 ,A           ;低8位送R5

       MOV   A,R2

       MOV   B,#10

       MUL   A ,B

       CLR   C

       ADDC  A ,R3           ;R2*10+R3

       ADDC  A ,R5           ;R2*10+R3+百位数低8位

       MOV   41H ,A          ;截止频率低8位送41H单元

       ADDC  R4,#0           

       MOV   40H ,R4         ;高8位送40H单元

DIV16:MOV   44H ,#01H       ;除数300的高8位送44H单元

MOV   45H ,#2CH       ;低8位送45H单元

MOV   R0  ,#40H       ;被除数(截止频率)为0则退出

       MOV   A  , @R0

       JNZ   LOP1             ;(40H)不为0,转LOP1,为0则查(41H)

       INC   R0

MOV   A ,@R0

JNZ   LOP1

RET

LOP1: CLR   A

       MOV   42H ,A          ;余数单元清0

       MOV   43H ,A

       MOV   R2 ,#10H        ;置移位次数

LOP2: CLR   C

       MOV   R3 ,#04H

       MOV   R0 ,#40H        ;被除数地址指针

LOP3: MOV   A ,@R0          ;余数单元,被除数单元左移一次

       RLC   A

       MOV   @R0 ,A

       INC   R0

       DJNZ  R3 ,LOP3

       MOV   R0 ,#42H        ;余数单元减除数

       MOV   R1 ,#44H

       MOV   A ,@R0

       CLR   C

       SUBB  A ,@R1

       MOV   48H ,A           ;暂存差的低字节

       INC   R0

       INC   R1

       MOV   A ,@R0

       SUBB  A ,@R1

       MOV   49H ,A           ;暂存差的高字节

       JC    LOP4              ;不够减继续左移

       MOV   R0 ,#42H         ;够减时差值取代原余数

       MOV   R1 ,#48H

       MOV   A ,@R1

       MOV   @R0 ,A

       INC   R0

       INC   R1

       MOV   A ,@R1

       MOV   @R0 ,A

       MOV   A ,40H

       INC   A                 ;够减被除数单元加1

       MOV   40H ,A

LOP4: DJNZ  R2 ,LOP2         ;移位次数不到,继续

   MOV   DPTR , #0BFFFH    ;送高8位地址

MOV   R0 ,#40H  

MOV   A ,@R0

MOVX  @DPTR ,A         ;送高8位数据

DEC   DPTR

INC   R0

MOV   A ,@R0

MOVX  @DPTR ,A

MOV   DPTR ,#3FFFH     ;送低4位时,同时打开后一级锁存器,

MOVX  @DPTR ,A         ;一起送12位数据进行D/A转换

RET

KEY:  MOV   P1,#0FFH         ;置P1口为输入状态

       MOV   A ,P1            ;读键值

       CPL   A

       ANL   A ,#01H          ;屏蔽高7位

       JZ    RET               ;移位键无闭合,返回

       LCALL DELAY-10ms        ;闭合,延时去抖动

       JNB   ACC.0 ,DDSF      ;移位键闭合,等待其释放

       RET                     ;无闭合,返回

DDSF: JNB   P1.0 ,DDSF       ;等待释放

PX  : MOV   R0 ,#0FFH        ;移位键释放,转片选

       INC   R0

BW  : CJNE  R0 ,#00H ,SW    ;R0=0 ,选百位

       LCALL BWSR              ;转百位输入设定

SW  : CJNZ  R0 ,#01H ,GW    ;R0=1 ,选十位

       LCALL SWSR              ;转十位输入设定

GW  : CJNE  R0 ,#02H ,FH    ;R0=2 ,选个位

       LCALL GWSR              ;转个位输入设定

FH  : CJNE  R0 ,#03H ,PX    ;R0=3 ,返回片选

       LJMP   PX

BWSR: SETB  P1.5              ;百位指示灯亮

       CLR   P1.6

       CLR   P1.7

MOV   R1 ,#00H

XH1 : LCALL DISPLAY           ;调用显示子程序

SZJIA:JB    P1.1 ,SZJ        ;数值加键没闭合,转查数值减键

       LCALL DELAY-10ms        ;闭合,延时去抖动

       JB    P1.1 ,SZJ

DDSF1A:JNB  P1.1 ,DDSF1A     ;等待释放

       INC   R1                ;R1内容加1

       CJNE  R1 ,#0AH ,XH1   ;R1内容小于10,继续

       MOV   R1 ,#09H         ;大于10则赋值为9

       LJMP   XH1

SZJ : JB    P1.2 ,SZJIA      ;数值减键没闭合,转查数值加键

       LCALL DELAY-10ms

       JB    P1.2 ,SZJIA

DDSF1B:JNB  P1.2 ,DDSF1B

       DEC   R1                ;R1内容减1

       CJNZ  R1 ,#0FFH ,XH1  ;R1内容大于0,继续

       MOV   R1 ,#00H         ;R1内容等于0FFH,只赋值0

       LJMP   XH1

WAIT: SJMP   WAIT

SWSR: SETB  P1.6              ;十位指示灯亮

       CLR   P1.5

       CLR   P1.7

       MOV   R2 ,#00H

XH2 : LCALL DISPLAY

       LJMP   SZJIA

DDSF2A:JNB  P1.1 ,DDSF2A     ;等待释放

       INC   R2                ;R2内容加1

       CJNE  R2 ,#0AH ,XH2   ;R2内容小于10,继续

       MOV   R2 ,#09H         ;大于10则赋值为9

       LJMP   XH2

       LJMP   SZJ

DDSF2B:JNB  P1.2 ,DDSF2B

       DEC   R2                ;R2内容减1

       CJNZ  R2 ,#0FFH ,XH2  ;R2内容大于0,继续

       MOV   R2 ,#00H         ;R2内容等于0FFH,只赋值0

       LJMP   XH2

WAIT: SJMP   WAIT

GWSR: SETB  P1.7              ;个位指示灯亮

       CLR   P1.5

       CLR   P1.6

       MOV   R3 ,#00H

XH3 : LCALL DISPLAY

       LJMP   SZJIA

DDSF3A:JNB  P1.1 ,DDSF3A     ;等待释放

       INC   R3                ;R3内容加1

       CJNE  R3 ,#0AH ,XH3   ;R3内容小于10,继续

       MOV   R3 ,#09H         ;大于10则赋值为9

       LJMP   XH3

       LJMP   SZJ

DDSF3B:JNB  P1.2 ,DDSF3B

       DEC   R3                ;R3内容减1

       CJNZ  R3 ,#0FFH ,XH3  ;R3内容大于0,继续

       MOV   R3 ,#00H         ;R3内容等于0FFH,只赋值0

       LJMP   XH3

WAIT: SJMP   WAIT

DELAY-10ms:MOV  R6 ,#20

       DE1:MOV  R7 ,#248

            DJNZ R7 ,$

            DJNZ R6 ,DE1

DISPLAY1:  CLR  P3.5          ;选百位

            SETB P3.2

            SETB P3.3

            MOV  A ,R1        ;送数据

            MOV  P2 ,A

            SETB P3.5          ;送完数据,锁存

            RET

DISPLAY2:  CLR  P3.2          ;选十  位

            SETB P3.3

            SETB P3.5

            MOV  A ,R2        ;送数据

            MOV  P2 ,A

            SETB P3.2          ;送完数据,锁存

            RET

DISPLAY3:  CLR  P3.3          ;选个位

            SETB P3.2

            SETB P3.5

            MOV  A ,R3        ;送数据

            MOV  P2 ,A

            SETB P3.3          ;送完数据,锁存

            RET

            END

微信二维码
扫码添加微信咨询
QQ客服:1663286777
电话:137-1883-9017
收到信息将及时回复