天津大学《电子系统设计》实验报告部分
一、|
二、实验要求
(一)利用IDE软件设计输出一个伪正弦阶梯波,要求如下:
1、输出一个频率处于100HZ~1000HZ之间的由明显阶梯的伪正弦波
2、利用开发板控制伪正弦波频率步进步退功能,间隔分别为±100HZ,
3、利用开发板控制伪正弦波的频率,从开发板键盘输入任意三位数,按“键
入”之后输出该频率的正弦波,误差不超过±5%
4、开发板的数字显示屏能过显示当前频率,误差不超过±5%
(二)利用TINA和FilterPro Desktop设计滤波器和放大器
1、根据题目要求,利用FilterPro Desktop软件设计出二阶巴特沃斯滤波
电路大致的电路模型
2、。
3、利用TINA对初步电路进行修改完善,并进行模拟仿真
4、利用TINA设计放大电路将输出波形放大
(三)焊接电路
1、根据仿真结果组装电路图,并对组装结果进行调试修改
2、强修改结果进行排布并焊接在电路板
三、实验目的
1、了解SDCC和IDE的安装过程
2、熟悉万用表、示波器、实验电源等的使用
3、【
4、学会利用IDE建立工程、编程、连接开发板和拷贝工程到开发板上
5、熟悉开发板,了解不同排针的功能,熟悉开发板的工作原理和构造
6、学习将FilterPro Desktop和TINA结合使用并进行电路设计仿真
7、学会独立设计滤波器和放大器,以及解决实验中遇到的各种问题
8、巩固焊接电路的手法,学习如何焊接出更加美观的电路
四、实验器件
1、实验器材:示波器、实验电源、MUC(C8051F020)、数字信号发生器、电脑、电
烙铁、剪线钳、吸锡器
2、实验元件:LM358,MAX7400,电阻:10KΩ*
3、20kΩ*2,瓷片电容:10nF*3、
100nF*2,电解电容:1000μF*1、220μF*1,电路板一个、排针一组、电线若干、
焊锡若干
五、]
六、实验过程
1、实验分工:(1)软件部分:刘晓寰(2):硬件加报告:徐婧文、吴美润
2、安装SDCC和IDE软件
3、学习如何使用IDE建立工程,编辑程序,连接开发板,并将工程拷贝到开发板上
4、学习实例程序,了解IDE程序语言以及编程要求
5、在示例程序的基础上对程序进行修改,使经过开发板上的输出波形满足实验要
求,并且能在开发板上实现步进,步退以及任意频率输出的实验要求
6、熟悉FilterPro Desktop和TINA模拟仿真软件的使用,学会用FilterPro
Desktop设计基础滤波电路并用TINA进行仿真完善,用TINA设计放大电路并将
滤波电路输出作为放大电路的输入进行仿真
7、利用面包板测试仿真结果电路并对其进行参数上的修改(注:测试前检查电路连
接是否出错,测试时小心芯片爆炸)
8、)
9、将利用IDE编写好的程序通过开发板数出并作为面包板的输入,再次测试电路
是否可用,如果不行继续对参数进行修改
10、设计电源电路要求能输入+5V电压,
11、对电源电路进行测试,测试无误后进行焊接(注:测试电路时远离电路板,小
心电源电路爆炸)
12、对修改后的实验电路进行排版焊接。(注:电路板上下三排和其中一端的三排
接线和其余部分不同,电路板是纵向三孔连在一起的,与面包板不同)
13、焊接完成后对实验电路进行再次测试,测试成功后将电源电路接入总电路,再
次进行测试
七、实验代码
/*====================================================
—
电子系统设计平台实验板演示程序
Release 2013
=====================================================*/
#include "driver\"
~
#include "driver\"
#include "driver\"
#include "driver\"
"8." " "
unsigned char DIGI[13]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0x00,0xff};
// 键值D0=0, D1=0, D2=0, D3=0
>
unsigned char KEY[4]={ 0x0e, 0x0d, 0x0b, 0x07};
EA=0; // 中断全局关闭
// 关闭开门狗定时器
WDTCN = 0xDE;
WDTCN = 0xAD;
/
/** Initialize the OSC */
= EXTERNAL_OSC;
= CRYSTAL;
= ;
Osc_Init(&Osc_Init_Parameter);
Loop_Delay(100);
io_config();
【
io_init();
XBR0=XBR0|BIT2_MASK; // UART0: 和
XBR2=XBR2|BIT6_MASK; // enable crossbar
REF0CN=REF0CN|BIT1_MASK|BIT0_MASK; // enable the internal voltage reference DAC0CN=DAC0CN|BIT7_MASK|BIT2_MASK; // enable DAC0, DAC0H: 8bit; DAC0L: 4bit DAC1CN=DAC1CN|BIT7_MASK|BIT2_MASK; // enable DAC1, DAC1H: 8bit; DAC1L: 4bit 、
DAC0L=0;
DAC0H=0;
DAC1L=0;
DAC1H=0;
Uart0_Init();
/*
&
printf("\n");
printf("Tianjin University\n");
printf("Electronic System Design Kit\n");
printf("Version [C]2012\n");
printf("----------------------------\n");
printf("MCU: C8051F020/24MHz\n");
printf("PWR: 100mA\n");
printf("\n");
|
*/
//////////////////////////////////////////////////////
//
// Timer 0/1 initialization
//
//////////////////////////////////////////////////////
$
// BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 // ---------------------------------------------------------------------// TCON: TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 // 0 0 0 1 0 0 0 0
//
// TMOD: GATE1 C/T1 T1M1 T1M0 GATE0 C/T0 T0M1 T0M0 // 0 0 0 0 0 0 1 0
//
¥
// IE: EA IEGF0 ET2 ES0 ET1 EX1 ET0 EX0 // 1 0 0 0 0 0 1 0
TL0=(231); // when 24MHz & SYSCLK/12, 10kHz timeout
TH0=(231); // reload
EA=1;
ET0=1;
.
TMOD=0x02;
TR0=1;
//////////////////////////////////////////////////////
#if 1
\
// 测试字符显示
//while(1)
{
for(j=0;j<12;j++)
{
for(i=0;i<6;i++)
{
LED_BUF[i]=DIGI[j];
"
}
P4=0xFF;
Loop_Delay(500);
Loop_Delay(500);
}
}
#endif
…
///////////////////////////////////////////////////////
#if 0
// 测试IO最大翻转速度
while(1)
{
-
TP0=0;
TP0=1;
TP0=0;
TP0=1;
TP0=0;
TP0=1;
;
/*TP0=0;
TP0=1;
TP0=0;
TP0=1;*/
}
#endif
'
///////////////////////////////////////////////////////
#if 0
// 测试LED数码管
while(1)
{
P2=0x01;
~
for(i=0;i<6;i++)
{
Loop_Delay(1);
P1=0xFF;
Loop_Delay(1);
。
P2=P2<<1;
}
}
#endif
///////////////////////////////////////////////////////
#if 1
(
// 测试键盘,LED数码管低两位显示行列值
while(1)
{
int l=0;
//KeyValue=0;
for(i=0;i<4;i++)
{
P3=LINE[i];
】
Loop_Delay(1);
for(j=0;j<4;j++)
{
if ((P3&0x0f)==KEY[j])
{
KeyValue=i*4+j;/*计算键值*/
·
//LED_BUF[0]=DIGI[j+1];
//LED_BUF[1]=DIGI[i+1];
LED_BUF[3]=DIGI[12];
LED_BUF[4]=DIGI[12];
LED_BUF[5]=DIGI[12];
//P2=0x01;
//P1=DIGI[j];
*
//Loop_Delay(1);
//P2=0x02;
//P1=DIGI[i];
//Loop_Delay(1);
//P1=0xFF;
{
}
while((l<500)&&((P3&0x0f)==KEY[j]))
{
Loop_Delay(1);
l++;
}
}
if((KeyValue==10)&&(f<1000))
<
{
/*设计步进间隔*/
f=f+100;
FrequencyControl=10000/f;
/*数码管显示当前频率*/
LED_BUF[0]=DIGI[0];
LED_BUF[1]=DIGI[0];
LED_BUF[2]=DIGI[(f/100)];
。
KeyValue=16;
}
if((KeyValue==11)&&(f>100))
{
/*设计步退间隔*/
f=f-100;
FrequencyControl=10000/f;
…
/*数码管显示当前频率*/
LED_BUF[0]=DIGI[0];
LED_BUF[1]=DIGI[0];
LED_BUF[2]=DIGI[(f/100)];
KeyValue=16;
}
if(KeyValue<10)
~
{
LED_BUF[(2-KeyTime)]=DIGI[KeyValue];
switch(KeyTime)
{
case(0):KeyBuffer=KeyBuffer+KeyValue*100;break;
case(1):KeyBuffer=KeyBuffer+KeyValue*10;break; case(2):KeyBuffer=KeyBuffer+KeyValue*1;break; }
…
KeyTime++;
if(KeyTime==3)
{
KeyTime=0;
}
KeyValue=16;
}
if(KeyValue==12)
`
{
f=KeyBuffer;
FrequencyControl=10000/f;
KeyValue=16;
KeyBuffer=0;
//LED_BUF[0]=DIGI[10];
//LED_BUF[1]=DIGI[10];
//LED_BUF[2]=DIGI[10];
(
}
//P1=0xFF;
}
}
#endif
?
////////////////////////////////////////////////////////
// 前台程序冻结
//while(1);
}
////////////////////////////////////////////////////////
void t0_isr(void) interrupt 1 // 定时器0中断服务程序
{
static unsigned int cnt=0;
static unsigned char led_cnt=0;
TP0=~TP0; // TP0 翻转,用来指示中断触发频率或周期
;
TP1=1; // TP1 置高,TP1的高电平持续时间代表中断服务程序执行时间/*设计阶梯波的阶梯数*/
BreakTime++;
if(BreakTime>=(FrequencyControl/4))
{
DAC0H=SIN[abc]; // DAC0 输出锯齿波,递增
SamplingControl=SamplingControl+8;
if(SamplingControl==256)
*
{
SamplingControl=0;
}
BreakTime=0;
}
DAC1H--; // DAC1 输出锯齿波,递减
// 每十次中断执行一次以下代码,扫描一位LED
—
if(cnt==10)
{
cnt=0;
switch(led_cnt)
{
case 0:
@
P2=0x01;
P1=LED_BUF[0];
led_cnt=1;
break;
case 1:
P2=0x02;
P1=LED_BUF[1];
led_cnt=2;
break;
case 2:
P2=0x04;
P1=LED_BUF[2];
led_cnt=3;
break;
case 3:
P2=0x08;
'
P1=LED_BUF[3];
led_cnt=4;
break;
case 4:
P2=0x10;
P1=LED_BUF[4];
led_cnt=5;
break;
'
case 5:
P2=0x20;
P1=LED_BUF[5];
led_cnt=0;
break;
default:
break;
}
·
cnt++;
}
else
{
cnt++;
!
}
TP1=0; // TP1 置低,TP1的高电平持续时间代表中断服务程序执行时间}
/*按键控制*/
void KeyDown(void)
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
Delay10ms();//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
>
switch(GPIO_KEY)
{
case(0X07):KeyValue=0;break;
case(0X0b):KeyValue=1;break;
case(0X0d):KeyValue=2;break;
case(0X0e):KeyValue=3;break;
}
//测试行
《
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70):KeyValue=KeyValue;break;
case(0Xb0):KeyValue=KeyValue+4;break;
case(0Xd0):KeyValue=KeyValue+8;break;
case(0Xe0):KeyValue=KeyValue+12;break;
}
{
while((a<50)&&(GPIO_KEY!=0xf0)) //检测按键松手检测
{
Delay10ms();
a++;
}
}
}
}
】
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
*/
八、实验电路
(一)总电路
图6-1 总电路图(二)滤波电路
图6-2 巴特沃斯滤波器幅频特性图
图6-3 滤波电路图
图6-4 仿真结果
根据实验要求我们设计了一个二阶巴特沃斯低通滤波器,理想状态下100HZ~1000HZ均应处于通带部分。但由于滤波器并不理想,且当按1000HZ滤波频率计算并不适用于是100HZ的伪正弦波。反复衡量我们将截止频率定为左右(三)放大电路
图6-5 放大电路图
图6-6 仿真结果
我们设计的是反向放大器,电压增益A=U/U=-R/R。实验要求放大电路要相对输入波放大几倍,而我们的放大电路是在对滤波之后的波形进行处理,所以在考虑放大倍数时要考虑到较高频率波形在滤波时有一定的衰减,在放大部分要把衰减的电压进行弥补
(四)滤直流部分图
图6-7 隔直电容
为了滤除直流分量,在滤波之后要进行滤直流的操作,为了防止两级电路级间干扰,考虑把滤直流的电容放在两级电路之间
(五)电源部分
利用7805芯片产生+5V电压
图6-8 电源电路(六)结果电路
图6-9 焊接成果九、操作说明
(一)按键操作说明
图7-1 板监控部分(二)显示说明
图7-2 开发板显示屏
LED显示屏使用右边三位,且从右向左为个、十、百位。
程序烧入开发板后开发板输出100HZ伪正弦波,LED显示屏没有任何显示。按一下“步进”键后显示200,输出200HZ伪正弦波,在此基础上按步退,LED显示屏显示100HZ,输出100HZ伪正弦波,其余阶段,按“步进”“步退”键后分别显示±100HZ之后的频率值(当前输出值)。任意数输入时,键入任意三位数(因为是100HZ~1000HZ输出频率,所以设计显示范围为1~999),按“键入”键,开发板输出该数字频率的伪正弦波,LED显示屏显示键入数字
十、实验结果
(一)实验输出伪正弦波(以100HZ为例)
图8-1 伪正弦输出
(二)滤波放大结果
图8-2 100HZ波形滤波放大结果
图8-3 1000HZ波形滤波放大结果
图8-4 任意频率输入
十一、问题分析
(一)硬件部分:
1、仿真软件是处在理想状态下进行的模拟仿真,所以仿真结果并不存在级间
干扰问题。而我们在最初在面包板上测试时是将滤波电路和放大电路两部
分分开测试,检验无误后进行两级串联。级联后最终输出显示滤波部分出
现问题,再次检验滤波输出,发现其发生明显变化。我们反复对电路进行
了一系列测更改,并没有改进。请教了老师之后才了解到我们忘记滤除直
流分量,而且两级电路之间会出现明显干扰。经老师点播之后我们决定在
两级之间加一个电容滤除直流同时电容也能起到隔离两级电路的作用。
2、最初我们以1000HZ为最终输出频率设计滤波电路考虑,截止频率设定相对
比较高,但是当输出100HZ波形经过滤波电路时截止频率相对100HZ过高,
过多的波相对100HZ的波属于高频分量。过多的杂波混入基波中造成滤波
之后的波形并不理想。经过反复调试后我们决定将截止频率定为比1000HZ
稍大点的值。
3、因为未考虑到放大倍数过高会对输出造成影响,我们直接选取了一个较大
的值进行测试,因为测试时我们电源电路并没有完成,所以使用±12V实
验电源进行测试并没有出现任何问题。后期电源电路完成后我们使用±
5V电源时出现了削顶失真。经过考虑,我们将反馈电阻减小。经反复测试
后决定了最终阻值。
(二)软件部分
1、通过改变采样点个数,控制阶梯大小。期初,我们严格根据实例图样设计
了一个阶梯很少的伪正弦波。后期调试时,为匹配硬件使用,我们需要更
改阶梯波的阶梯数。更改阶梯数是通过更改采样点的多少实现的。
2、调控步进步退间隔。更改采样点之后,步进步退间隔也随之改变,为了保
证步进步退间隔一直处于100HZ,控制步进步退的函数也要进行一定的调
整。
十二、实验心得
这次实验主要要求我们学会利用IDE软件编程,二阶巴特沃斯滤波器和放大器的设计,还有电路的焊接。通过为期十天的课程,我们理解了电子线路设计的一些知识学会了一些新的软件的使用,巩固了电工实习期间掌握的焊接技术。通过这次课程,我们更加深入的了解接触了我们专业领域的知识,了解了行业的要求。同时也了解到作为一个软件或者硬件开发者的艰辛。期间,我们一次次的更改我们的程序,不断地完善着我们的电路,满怀希望的等待着测试结果的出来,不断地推翻自己得到的结论,只为得到更加完美的结果。电路焊接时我们小心翼翼的进行每一步,生怕自己的一个失误导致不好的结果。一切努力都得到了回报,我们靠自己的努力完成实验。也许结果不是最好的,但我们为止骄傲,毕竟这是我们努力无数天的成果,毕竟我们为之拼搏过。