基于stm的信号发生器设计.docx

上传人:b****3 文档编号:10702716 上传时间:2023-05-27 格式:DOCX 页数:15 大小:74.88KB
下载 相关 举报
基于stm的信号发生器设计.docx_第1页
第1页 / 共15页
基于stm的信号发生器设计.docx_第2页
第2页 / 共15页
基于stm的信号发生器设计.docx_第3页
第3页 / 共15页
基于stm的信号发生器设计.docx_第4页
第4页 / 共15页
基于stm的信号发生器设计.docx_第5页
第5页 / 共15页
基于stm的信号发生器设计.docx_第6页
第6页 / 共15页
基于stm的信号发生器设计.docx_第7页
第7页 / 共15页
基于stm的信号发生器设计.docx_第8页
第8页 / 共15页
基于stm的信号发生器设计.docx_第9页
第9页 / 共15页
基于stm的信号发生器设计.docx_第10页
第10页 / 共15页
基于stm的信号发生器设计.docx_第11页
第11页 / 共15页
基于stm的信号发生器设计.docx_第12页
第12页 / 共15页
基于stm的信号发生器设计.docx_第13页
第13页 / 共15页
基于stm的信号发生器设计.docx_第14页
第14页 / 共15页
基于stm的信号发生器设计.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于stm的信号发生器设计.docx

《基于stm的信号发生器设计.docx》由会员分享,可在线阅读,更多相关《基于stm的信号发生器设计.docx(15页珍藏版)》请在冰点文库上搜索。

基于stm的信号发生器设计.docx

基于stm的信号发生器设计

课程设计报告

设计课题:

信号发生器

专业班级:

姓名:

学号:

信号发生器

1.实验概述

本系统以低功耗单片机stm32为主控器件,分为微控制器、FPGADA转换器、功率放大等模块,实现了一个能产生任意波形的波形发生器。

本设计利用单片机生成各种波形的数据,将数据传输给RAM存储器,通过后级的DA转换器实现波形的产生。

系统采用触摸屏方式输入波形参数和手绘波形,频率1HZ步进可调,

峰-峰值可在0到10V之间任意调节。

电路设计条理清晰,人机交互界面友好,控制方便,很好地完成了题目的所有基本和发挥要求。

2.实验要求与目的

实验要求:

设计简易函数信号发生器系统

实验目的:

掌握应用嵌入式系统生成函数信号的方法

3.实验内容与实验设备

实验内容:

a)设计程控放大器电路

b)设计嵌入式系统电路及程序,实现信号发生器基本功能,可

以产生三种标准波形:

正玄波、三角波和方波;

c)编写嵌入式系统程序,实现函数信号发生器功能,可以对标准波形设计频率、周期、最大值、最小值、峰峰值、偏移量和方波占空比。

d)编写嵌入式系统程序,实现随机信号发生器功能,输出在手写板上描绘的波形。

e)编写嵌入式系统程序,实现通讯功能,可以通过RS232接口设置输出信号。

实验设备:

a)示波器、信号发生器、万用表b)STC单片机开发板、C8051F开发板、STM32开发板

实验器件:

STM32F103ZET6、ADUC7026

4.方案比较

1.1波形生成方案

方案一:

采用锁相式频率合成方案

这种方案利用锁相环将压控振荡器VCO的输出频率锁定在所需频率上。

这种方案具有很好的窄带跟踪特性,很好的选择所需频率。

但由于模拟方法合成的正弦波参数(如:

幅度,频率,相位)都很难被控制,难以满足实现任意波形的要求。

方案二:

采用STM32单片机生成波形,由于是软件滤波,所以不会有寄生的高次谐波分量,生成的波形比较纯净。

它的特点是价格低、性能高,在低频范围内稳定性好、操作方便、体积小、耗电少。

经比较,方案二既可满足课程设计的基本要求又能充分发挥其优势,电路简单,易控制,性价比高,所以采用该方案

1.2任意波形的生成原理

方案一:

触摸屏绘制波形

以触摸屏作为操作界面,用户可在触摸屏上输入波形参数及绘制波形。

此方法操作简易,并且可绘制任意波形,但是对编程者要求较高,故选择相对简单的用键盘输入数据。

方案二:

用键盘输入数据

采用键盘输入,这是最基本的方法。

优点是输入值精确。

但用户自定义输入时无法自由输入想要的特殊波形,而且输入数据繁琐,操作麻烦,由于实现相对简单,故本实验采用该方案。

5.系统设计分析

(A)硬件部分

键盘输入控制

(B)微控制器软件实现:

微控制器主要用于完成数据的采集,显示以及处理,生成各种波形数据,本系统采样256个数据,采用8位DA转换器,因此RAM地址位设置为8位,数据位设置为8位。

微控制器先进行数据收集处理,生成各种波形的归一化数据,然后存储在256位的数组里,根据幅值要求乘以相应的系数,最终生成可以存放在RAM里的数据。

本系统采用12位DA转换器,最大输出电压为5Vpp,功率放大为2倍,所以系统最大的输出电压可以达到10Vpp,可计算出最小电压分辨率为:

电压分辨率:

K=10/4096(V)

(A)是波形发生器的主流图,由系统初始化和人机交互模块组成,其中液

晶显示子模块和键盘输入处理子模块占用单片机主要处理时间,单片机反复运行

该模块程序人机交互模块相当于系统的监控程序;(B)是定时中断服务流程图,

波形发生模块放置在定时中断服务程序中,系统每隔一定时间,产生一个定时中断,暂停主流程运行,转到定时中断服务程序起始处,执行波形发生模块,该模块输出一个样值后,结束此次中断服务,返回主流程断点处继续运行。

反复多次定时中断服务,从而完成波形生成。

(C)键盘输入处理子模块

在具体实现时,键值识别部分作为主程序,键功能处理部分作为子程序,它们之间的关系是主程序调用子程序。

键盘的工作过程:

(1)扫描键盘,获得列扫描码和行状态码,从而确定被按下的按键的键值;

(2)根据键值,通过散转表,跳转到相应的键功能处理部分;

(3)进入键处理部分,完成键功能;

(4)完成一次键输入工作。

通过键盘对单片机系统进行设置,每按一次键,键盘都会有上述的处理过程,每次仅能完成一个键功能。

在实际设置波形参数时,一个参数需要多个键功能来实现,那么相应的键盘也要多次完成键值识别,跳转键处理的工作过程。

(D)函数参数设置

1)

正弦波归一化数据生成函数

S(t)=sin(t)/(2K)

2)

三角波归一化数据生成函数

T(t)=t/(63*2K)

(t<64)

T(t)=(127-t)/(63*2K)

(64

T(t)=(t-128)/(63*2K)

(128

T(t)=(255-t)/(63*2K)

(192

3)

方波归一化数据生成函数

根据电压分辨率可以得出方波归一化数据生成函数为:

F(t)=1/(2k)(0

F(t)=-1/(2k)(128

4)5次谐波数据的生成函数

W(t)=a*sin(t)+b*sin(2t+m)+c*sin(3t+n)+d*sin(4t+p)+e*sin(5t+q)

此函数要求幅值和相位参数:

a.b.c.d.e.m.n.p.q

5)正弦波、方波、三角波线性组合波数据生成函数

D(t)=a*S(t)+b*F(t+m)+c*T(t+n)

(E)实验参考程序

/*

*功能:

STM32DAC数模转换(正弦波/矩形波/三角波)输出实验

*说明:

按SW5输出正弦波/按SW4输出矩形波/按SW3输出三角波,输出端口PA4

#include

//STM32F10xLibraryDefinitions

//STM32registerandbitDefinitions

//STM32Initialization

#include

#include"STM32_Reg.h"

#include"STM32_Init.h"

#include"common.h"

#include"sine_wave_1024.h"//输出端口:

PA4

#defineSINE_WAVE1//sine正弦波

#defineRECT_WAVE2//rectangular矩形波

#defineHACKLE_WAVE3//hackle三角波

UINT8flag=0;

UINT8func=SINE_WAVE;

/*

MAINfunction

*/

intmain(void)

{

UINT16i=0;

UINT32*pDAC_BASE=(UINT32*)DAC_BASE;

LED_Init();

//打开DAC时钟使能

RCC->APB1ENR|=(UINT32)(1<<29);

//设置DAC控制参数*(pDAC_BASE+0x00)=(0x01<<0)|(0x00<<2)|(0x04<<3)|(0x03<<6)|(0x0b<<8);

*(pDAC_BASE+0x04)=0x01

printf("Programstart\r\n");

while(TRUE)//Loopforever

{

if(!

Get_SW5())

{

func=SINE_WAVE;

}

elseif(!

Get_SW4())

{

func=RECT_WAVE;

}

elseif(!

Get_SW3())

{

func=HACKLE_WAVE;

}

switch(func)

{

caseSINE_WAVE:

//

#ifdefSINE_WAVE

if(i<1024)i+=2;

*(pDAC_BASE+0x08)=Sine_WAVE[i]<<4;

#endif

//

break;

caseRECT_WAVE:

#ifdefRECT_WAVE

for(i=0;i<2000;i++)

*(pDAC_BASE+0x08)=0x0fff;

for(i=0;i<2000;i++)

*(pDAC_BASE+0x08)=0;

#endif

//

break;

caseHACKLE_WAVE:

#ifdefHACKLE_WAVE

if(flag)

{

flag=0;

while(TRUE)

{

if(i<4096)i+=1;

elsebreak;

*(pDAC_BASE+0x08)=i;

}

else

{flag=1;while(TRUE){

if(i>0)i-=1;elsebreak;

*(pDAC_BASE+0x08)=i;

}}

#endifbreak;

default:

break;

}

//

}//endwhile

}//endmain

/*

*设置方向

**/

voidSet_IO_direction(UINT8PORT,UINT8GPIO,UINT8Value){

RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;

if(PORT==PORT_A)

{

if(GPIO<8)

GPIOA->CRL|=(Value<<(GPIO*4));//Setusedbit

}else

{

GPIOA->CRH&=~(0x0f<<(GPIO*4-8*4));//Clrusedbit

GPIOA->CRH|=(Value<<(GPIO*4-8*4));//Setusedbit}

}

if(PORT==PORT_B)

{

if(GPIO<8)

{

GPIOB->CRL&=~(0x0f<<(GPIO*4));//Clrusedbit

GPIOB->CRL|=(Value<<(GPIO*4));//Setusedbit

}

else

{

GPIOB->CRH&=~(0x0f<<(GPIO*4-8*4));//Clrusedbit

GPIOB->CRH|=(Value<<(GPIO*4-8*4));//Setusedbit}

}

if(PORT==PORT_C)

{

if(GPIO<8){

GPIOC->CRL&=~(0x0f<<(GPIO*4));//Clrusedbit

else

{

GPIOC->CRH&=~(0x0f<<(GPIO*4-8*4));//Clrusedbit

GPIOC->CRH|=(Value<<(GPIO*4-8*4));//Setusedbit}

}

if(PORT==PORT_D)

{

if(GPIO<8)

{

GPIOD->CRL&=~(0x0f<<(GPIO*4));//Clrusedbit

GPIOD->CRL|=(Value<<(GPIO*4));//Setusedbit

}

else

{

GPIOD->CRH&=~(0x0f<<(GPIO*4-8*4));//Clrusedbit

GPIOD->CRH|=(Value<<(GPIO*4-8*4));//Setusedbit}

}

if(PORT==PORT_E)

{

if(GPIO<8)

{

GPIOE->CRL&=~(0x0f<<(GPIO*4));//Clrusedbit

GPIOE->CRL|=(Value<<(GPIO*4));//Setusedbit

}

else

{

GPIOE->CRH&=~(0x0f<<(GPIO*4-8*4));//Clrusedbit

GPIOE->CRH|=(Value<<(GPIO*4-8*4));//Setusedbit}

}

}

/*

SendChar

WritecharactertoSerialPort.

*

intSendChar(intch){

while(!

(USART2->SR&USART_FLAG_TXE));

USART2->DR=(ch&0x1FF);

return(ch);

}

/*

GetKey

ReadcharactertoSerialPort.

*

intGetKey(void){

while(!

(USART2->SR&USART_FLAG_RXNE));

return((int)(USART2->DR&0x1FF));

voidLED_Init(void)

{

Set_IO_direction(PORT_E,LED1,OUTPUT);

Set_IO_direction(PORT_E,LED2,OUTPUT);

Set_IO_direction(PORT_E,LED3,OUTPUT);

Set_IO_direction(PORT_E,LED4,OUTPUT);

Set_IO_direction(PORT_B,SW2,INPUT);

Set_IO_direction(PORT_B,SW3,INPUT);

Set_IO_direction(PORT_E,SW4,INPUT);

Set_IO_direction(PORT_E,SW5,INPUT);

Turn_OFF_LED1();

Turn_OFF_LED2();

Turn_OFF_LED3();

Turn_OFF_LED4();

}

/*

insertadelaytime.

*

voiddelay(unsignedintnCount)

{

for(;nCount!

=0;nCount--);

正弦波归一化程序:

tosin[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,

0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5

0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0

xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5

0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd

0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0x

ea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda

0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0x

b4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99

0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,

0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51

0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,

0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16

0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,

0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00

0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07

0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15

0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,

0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e

0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,

0x7c,0x80};

6.数据测试与测试分析

(1)输出波形频率范围测试测试数据见下表:

条件:

峰峰值为5V。

表1频率测量

预置频率/Hz

方波

正弦波

三角波

1

1.01

1.01

1.01

100

99.99

99.99

99.99

200

199.98

199.98

199.98

500

500.02

500.02

500.02

1000

1000.1

1000.0

1000.1

2000

2000.2

2000.3

2000.3

5000

5000.8

5000.8

5000.9

10,000

10005

10005

10005

20,000

20,008

20009

20009

50,000

50003

50003

50004

100,000

100005

100005

100006

200,000

200007

200007

200007

(2)输出波形的幅度测量测试数据见下表:

条件:

频率为100Hz。

表2波形幅测量

预置峰峰值/V

方波/v

正弦波/v

三角波/v

0.1

\

\

\

0.2

0.22

0.26

0.32

0.5

0.51

0.54

0.56

1

1.01

1.05

1.1

2

2.00

2.08

2.1

5

5.01

5.02

5.08

10

10.0

10.0

10.1

结果分析总结:

1从表中可以看出频率可以实现1HZ步进可调,而且精度比较高。

0.1V

2从表中我们可以看出,幅度可调,步进为0.1V。

但输出峰峰值为时效果不佳,无法测量。

当峰峰值大于0.5V时精度比较高。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2