程控滤波器设计报告.docx
《程控滤波器设计报告.docx》由会员分享,可在线阅读,更多相关《程控滤波器设计报告.docx(26页珍藏版)》请在冰点文库上搜索。
程控滤波器设计报告
综合课程设计报告
—程控滤波器
指导老师:
林旭
班级:
信通4班
姓名:
朱明贵
学号:
111100443
同组:
刘奕兰
学号:
111100423
1、设计题目
程控滤波器
2、设计简介
(1)、任务
设计并制作程控滤波器,其组成如图所示。
放大器增益可设置;低通或高通滤波器通带、截止频率等参数可设置。
图1程控滤波器组成框图
(2)、要求
1).基本要求
①放大器输入正弦信号电压振幅为10mV,电压增益为40dB,增益10dB步进可调,通频带为100Hz~40kHz,放大器输出电压无明显失真。
②滤波器可设置为低通滤波器,其-3dB截止频率fc在2kHz~10kHz范围内可调,调节的频率步进为2kHz,2fc处放大器与滤波器的总电压增益不大于30dB,RL=1k。
③滤波器可设置为高通滤波器,其-3dB截止频率fc在2kHz~10kHz范围内可调,调节的频率步进为2kHz,0.5fc处放大器与滤波器的总电压增益不大于30dB,RL=1k。
④电压增益与截止频率的误差均不大于10%。
⑤有设置参数显示功能。
2.发挥部分
放大器电压增益为60dB,输入信号电压振幅为10mV;增益10dB步进可调,电压增益误差不大于5%。
3、方案论述
(1)放大器方案论证与比较
方案一:
采用模拟开关和通用放大器实现。
放大器采用反向比例放大的接法进行多级级联,通过用单片机控制模拟开关切换不同的反馈电阻,从而达到放大倍数步进可调的要求。
此方案电路结构比较简单,但电路原件数目庞大,控制复杂。
方案二:
采用可控增益放大器实现。
用两块放大倍数为-10dB~30dB的可控增益放大器AD603级联的方式实现-20dB~60dB增益步进可调。
满足基本部分和发挥部分要求,电路简单,易于控制,故选此方案。
(2)滤波方案论证与比较
方案一:
采用基于FPGA的数字滤波器实现
采用“A/D转换->FPGA/MCU处理->D/A”转换的方法进行数字滤波处理。
数字滤波器具有灵活性好,精度高,截止特性好等优点。
但是运算量大,需要大量处理器资源编程复杂。
方案二:
采用MAX262可编程滤波器实现
MAX262是可编程通用开关电容滤波集成电路,通过MCU编程控制高通、低通、带通、带阻的工作模式及中心频率和品质因数。
此方法电路结构简单,但程序控制稍显复杂。
方案三:
采用LTC1068时钟控制滤波器实现
LTC1068时钟可控多功能滤波器,可以用Linear公司提供的FilterCAD软件进行电路设计,可以得到高通、低通、带通、带阻不同工作模式,可以设计滤波器为巴特沃斯、契比雪夫、椭圆和自定义滤波器模型。
由于设计电路方法简单,控制简单,故选此设计方案。
(3)MCU控制方案论证与比较
方案一:
采用STC89C51系列单片机实现
51系列单片机开发环境成熟,且易于上手。
但是因为滤波信号要求精度比较高,51难以实现。
方案二:
采用STM32系列单片机实现
STM32同样具有成熟的开发环境,虽然相对51系列难度有所增加,但是STM32具有高精度,内置高速AD、DA转换,驱动TFT显示屏等功能。
故选择此方案。
4、系统设计
系统级模块组成框图
其中我主要是做设计,包括整体的系统构造思路、分模块的软硬件设计;队友主要是辅助,包括查找资料,帮忙查找电路错误。
5、模块设计
(1)放大器部分
放大器部分主要由可变增益放大器AD603、通用放大器OP37、OP07和宽带低失真放大器OPA642组成。
其电路原理图如图a和b所示
AD603放大部分电路图
放大部分总体电路图
放大部分总体PCB图
(2)滤波部分
1)低通滤波器
低通滤波器采用两级滤波模块组成的四阶Butterworth低通接法。
两级的品质因数分别为Q1=1.3066,Q2=0.5412,
电路图如图a所示。
幅频特性曲线如图b所示。
a低通滤波器电路图
b低通滤波器幅频特性
2)高通滤波器
高通滤波器采用两级滤波模块组成的四阶Butterworth高通接法。
两级的品质因数分别为Q1=1.3066,Q2=0.5412,
电路图如图a所示。
幅频特性曲线如图b所示。
a高通滤波器电路图
b高通滤波器幅频特性
6、系统测试
(1)放大部分测试
测试方法:
放大器部分采用输入信号峰峰值为20mV的正弦信号,测试放大器模块的增益点从0dB~60dB,输入信号的频率变化范围在100Hz~40kHz的输出电压峰峰值。
0.1
0.2
0.4
1
10
20
30
40
0dB
10dB
20dB
30dB
40dB
50dB
60dB
(2)低通滤波器测试
使用信号发生器产生峰峰值为2V的稳定的正弦波信号接到滤波器的输入端,用单片机控制滤波器的截止频率在1kHz~20kHz,调节信号发生器的输出频率,使得滤波器输出信号电压为通带内的0.707倍,记录可得实际fc值和2fc处放大器和滤波器的总增益值。
并计算相对误差,测试结果如下图所示。
FC设定值/KHz
1
2
3
4
5
6
7
8
9
10
FC实测值/KHz
相对误差
%
2fc处最大增益/dB
FC设定值/KHz
11
12
13
14
15
16
17
18
19
20
FC实测值/KHz
相对误差
%
2fc处最大增益/dB
(3)高通滤波器测试
使用信号发生器产生峰峰值为2V的稳定的正弦波信号接到滤波器的输入端,用单片机控制滤波器的截止频率在1kHz~20kHz,调节信号发生器的输出频率,使得滤波器输出信号电压为通带内的0.707倍,记录可得实际fc值和0.5fc处放大器和滤波器的总增益值。
并计算相对误差,测试结果如下图所示。
FC设定值/KHz
1
2
3
4
5
6
7
8
9
10
FC实测值/KHz
相对误差
%
2fc处最大增益/dB
FC设定值/KHz
11
12
13
14
15
16
17
18
19
20
FC实测值/KHz
相对误差
%
2fc处最大增益/dB
6、测试结果及其分析
7、设计总结
通过本题的具体设计,我们对程控滤波器的整体设计原理及所要用到各类芯片有了一个系统的认识和掌握,可谓受益匪浅。
当然在设计过程中,我们还发现一些问题和不足,比如在方案论证方面,对于多个可实现同一功能的方案我们犹豫不决。
通过查阅大量资料及团队探讨,我们最终选择了最易实现的方案。
参考文献
[1]电子技术基础, 康华光等, 高等教育出版社
[2]数字信号处理, 张立材等, 北京邮电大学出版社
[3]十六为单片微处理器原理及应用, 张培仁等, 清华大学出社
[4]电子系统设计, 俞承芳等, 复旦大学出版社
[5]MATLAB通信仿真及应用实力详解, 邓华等, 人民邮电出版社
[6]凌阳单片机在大学生电子竞赛中的应用,凌阳科技大学计划,北京航空航天大学出版社
[7]Electronic Circuit Analysis and DesignDonald A.Neamen,Publishing House of Electronics Industry
附录
一、电路图
原理图
实物图
二、源程序
放大控制部分
#ifndef__DAC_H
#define__DAC_H
#include"sys.h"
voidDac1_Init(void);//回环模式初始化
voidDac1_Set_Vol(u16vol);
#endif
#include"dac.h"
#include"stm32f10x_dac.h"
//DAC通道1输出初始化
voidDac1_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
DAC_InitTypeDefDAC_InitType;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA通道时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);//使能DAC通道时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//端口配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//PA.4输出高
DAC_InitType.DAC_Trigger=DAC_Trigger_None;//不使用触发功能TEN1=0
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable;//DAC1输出缓存关闭BOFF1=1
DAC_Init(DAC_Channel_1,&DAC_InitType);//初始化DAC通道1
DAC_Cmd(DAC_Channel_1,ENABLE);//使能DAC1
DAC_SetChannel1Data(DAC_Align_12b_R,0);//12位右对齐数据格式设置DAC值
}
//设置通道1输出电压
//vol:
0~3300,代表0~3.3V
voidDac1_Set_Vol(u16vol)
{
floattemp=vol;
temp/=1000;
temp=temp*4096/3.3;
DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值
}
按键部分
#ifndef__KEY_H
#define__KEY_H
#include"sys.h"
//#defineKEY0PEin(4)//PE4
//#defineKEY1PEin(3)//PE3
//#defineKEY2PEin
(2)//PE2
//#defineKEY3PAin(0)//PA0WK_UP
#defineKEY1GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_6)//读取按键1左移+
#defineKEY2GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_3)//读取按键2右移-
#defineKEY3GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_4)//读取按键3“+”
#defineKEY4GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_5)//读取按键4“-”
#defineKEY5GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_9)//读取按键5RESET1
#defineKEY6GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_10)//读取按键6RESET2
//#defineKEY_LEFT1
//#defineKEY_RIGHT2
//#defineKEY_UP3
//#defineKEY_DOWN4
voidKEY_Init(void);//IO初始化
u8KEY_Scan(u8);//按键扫描函数
#endif
#include"key.h"
#include"sys.h"
#include"delay.h"
//按键初始化函数
voidKEY_Init(void)//IO初始化
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE);//使能PORTG时钟
////初始化KEY0-->GPIOA.13,KEY1-->GPIOA.15上拉输入
//GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PE2~4
//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//设置成上拉输入
//GPIO_Init(GPIOE,&GPIO_InitStructure);//初始化GPIOE2,3,4
//初始化-->GPIOG.2/3/4/5上拉输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//PA0设置成输入,默认上拉
GPIO_Init(GPIOG,&GPIO_InitStructure);//初始化GPIOG.0
//GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//PB0设置成输入,默认上拉
//GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB.0B.1
}
//按键处理函数
//返回按键值
//mode:
0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下
//4,KEY3按下
//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!
!
u8KEY_Scan(u8mode)
{
staticu8key_up=1;//按键按松开标志
if(mode)key_up=1;//支持连按
if(KEY1==0||KEY2==0||KEY3==0||KEY4==0||KEY5==0||KEY6==0)
{
//delay_ms(10);//去抖动
key_up=0;
if(KEY1==0)
{
delay_ms(10);//去抖动
if(KEY1==0)
{
while(!
KEY1);
return1;
}
}
elseif(KEY2==0)
{
delay_ms(10);//去抖动
if(KEY2==0)
{
while(!
KEY2);
return2;
}
}
elseif(KEY3==0)
{
delay_ms(10);//去抖动
if(KEY3==0)
{
while(!
KEY3);
return3;
}
}
elseif(KEY4==0)
{
delay_ms(10);//去抖动
if(KEY4==0)
{
while(!
KEY4);
return4;
}
}
elseif(KEY5==0)
{
delay_ms(10);//去抖动
if(KEY5==0)
{
while(!
KEY5);
return5;
}
}
elseif(KEY6==0)
{
delay_ms(10);//去抖动
if(KEY6==0)
{
while(!
KEY6);
return6;
}
}
}elseif(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1&&KEY5==1&&KEY6==1)key_up=1;
return0;//无按键按下
}
CLK信号部分
#include"sys.h"
#defineLED0PGout(14)//PG14
#defineLED1PBout(5)//PB0
#defineRESET_FPEout(5)//PE5
voidLED_Init(void);//初始化
#endif
#include"led.h"
//初始化PB5和PE5为输出口.并使能这两个口的时钟
//LEDIO初始化
voidLED_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOG,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//LED1-->E5端口配置,推挽输出
GPIO_Init(GPIOE,&GPIO_InitStructure);//推挽输出,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE.5输出高
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//端口配置,推挽输出LED0-->b5
GPIO_Init(GPIOB,&GPIO_InitStructure);//推挽输出,IO口速度为50MHz
GPIO_SetBits(GPIOB,GPIO_Pin_5);//PE.5输出高
}
#ifndef__TIMER_H
#define__TIMER_H
#include"sys.h"
voidTIM3_Int_Init(u16arr,u16psc);
voidTIM3_PWM_Init(u16arr,u16psc);
#endif
#include"timer.h"
#include"led.h"
#include"usart.h"
#include"stm32f10x_tim.h"
//V1.120120904
//1,增加TIM3_PWM_Init函数。
//2,增加LED0_PWM_VAL宏定义,控制TIM3_CH2脉宽
//////////////////////////////////////////////////////////////////////////////////
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:
自动重装值。
//psc:
时钟预分频数
//这里使用的是定时器3!
voidTIM3_Int_Init(u16arr,u16psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//时钟使能
TIM_TimeBaseStructure.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision=0;//设置时钟分割:
TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能指定的TIM3中断,允许更新中断
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPri