基于stm32的信号发生器设计Word文档格式.docx

上传人:b****6 文档编号:17300139 上传时间:2022-12-01 格式:DOCX 页数:13 大小:20.34KB
下载 相关 举报
基于stm32的信号发生器设计Word文档格式.docx_第1页
第1页 / 共13页
基于stm32的信号发生器设计Word文档格式.docx_第2页
第2页 / 共13页
基于stm32的信号发生器设计Word文档格式.docx_第3页
第3页 / 共13页
基于stm32的信号发生器设计Word文档格式.docx_第4页
第4页 / 共13页
基于stm32的信号发生器设计Word文档格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

基于stm32的信号发生器设计Word文档格式.docx

《基于stm32的信号发生器设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于stm32的信号发生器设计Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。

基于stm32的信号发生器设计Word文档格式.docx

实验设备:

a)示波器、信号发生器、万用表

b)STC单片机开发板、C8051F开发板、STM32开发板

实验器件:

STM32F103ZET6、ADUC7026

四.方案比较

1.1波形生成方案

方案一:

采用锁相式频率合成方案

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

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

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

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

方案二:

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

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

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

1.2任意波形的生成原理

触摸屏绘制波形

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

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

用键盘输入数据

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

优点是输入值精确。

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

五.系统设计分析

(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<

128)

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

192)

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

256)

(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<

stdio.h>

stm32f10x_lib.h>

//STM32F10xLibraryDefinitions

#include"

STM32_Reg.h"

//STM32registerandbitDefinitions

STM32_Init.h"

//STM32Initialization

common.h"

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;

stm32_Init();

//STM32setup

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;

Get_SW3())

func=HACKLE_WAVE;

switch(func)

caseSINE_WAVE:

//-------------------------------------------------------------

#ifdefSINE_WAVE

if(i<

1024)i+=2;

elsei=0;

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

4;

#endif

break;

caseRECT_WAVE:

#ifdefRECT_WAVE

for(i=0;

i<

2000;

i++)

*(pDAC_BASE+0x08)=0x0fff;

*(pDAC_BASE+0x08)=0;

caseHACKLE_WAVE:

#ifdefHACKLE_WAVE

if(flag)

{

flag=0;

while(TRUE)

{

4096)i+=1;

elsebreak;

*(pDAC_BASE+0x08)=i;

}

}

else

flag=1;

if(i>

0)i-=1;

default:

//-------------------------------------------------------------

}//endwhile

}//endmain

*设置方向

voidSet_IO_direction(UINT8PORT,UINT8GPIO,UINT8Value)

APB2ENR|=RCC_APB2ENR_IOPAEN;

if(PORT==PORT_A)

if(GPIO<

8)

GPIOA->

CRL&

=~(0x0f<

(GPIO*4));

//Clrusedbit

CRL|=(Value<

//Setusedbit

else

CRH&

(GPIO*4-8*4));

//Clrusedbit

CRH|=(Value<

//Setusedbit

}

if(PORT==PORT_B)

GPIOB->

if(PORT==PORT_C)

GPIOC->

if(PORT==PORT_D)

GPIOD->

if(PORT==PORT_E)

GPIOE->

}

SendChar

WritecharactertoSerialPort.

intSendChar(intch){

while(!

(USART2->

SR&

USART_FLAG_TXE));

USART2->

DR=(ch&

0x1FF);

return(ch);

GetKey

ReadcharactertoSerialPort.

intGetKey(void){

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,0xe7,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,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda

0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,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};

六.数据测试与测试分析

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

条件:

峰峰值为5V。

表1频率测量

预置频率/Hz

方波

正弦波

三角波

1

1.01

1.01

100

99.99

200

199.98

500

500.02

1000

1000.1

1000.0

2000

2000.2

2000.3

5000

5000.8

5000.9

10,000

10005

20,000

20,008

20009

50,000

50003

50004

100,000

100005

100006

200,000

200007

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

频率为100Hz。

表2波形幅测量

预置峰峰值/v

方波/v

正弦波/v

三角波/v

0.1

\

0.2

0.22

0.26

0.32

0.5

0.51

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

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1