基于某stm32地信号发生器设计.docx
《基于某stm32地信号发生器设计.docx》由会员分享,可在线阅读,更多相关《基于某stm32地信号发生器设计.docx(18页珍藏版)》请在冰豆网上搜索。
![基于某stm32地信号发生器设计.docx](https://file1.bdocx.com/fileroot1/2022-10/10/4c65b1b6-3c96-4e21-add5-b2eeaaf71066/4c65b1b6-3c96-4e21-add5-b2eeaaf710661.gif)
基于某stm32地信号发生器设计
实用标准文案课程设计报告
设计课题:
信号发生器
电子信息科学与技术一班专业班级:
马天琪学生姓名:
指导教师:
李浩宇
设计时间:
2013.9.20~~~2013.10.7
文档大全.
实用标准文案信号发生器
一.实验概述转换器、DA分为微控制器、FPGA、本系统以低功耗单片机stm32为主控器件,实现了一个能产生任意波形的波形发生器。
本设计利用单片机,功率放大等模块转换器实现波DA生成各种波形的数据,将数据传输给RAM存储器,通过后级的步进可调,1HZ形的产生。
系统采用触摸屏方式输入波形参数和手绘波形,频率之间任意调节。
电路设计条理清晰,人机交互界面友好,控10V0到峰-峰值可在制方便,很好地完成了题目的所有基本和发挥要求。
二.实验要求与目的设计简易函数信号发生器系统实验要求:
实验目的:
掌握应用嵌入式系统生成函数信号的方法三.实验内容与实验设备实验内容:
设计程控放大器电路a)设计嵌入式系统电路及程序,实现信号发生器基本功能,可b)以产生三种标准波形:
正玄波、三角波和方波;编写嵌入式系统程序,实现函数信号发生器功能,可以对标c)准波形设计频率、周期、最大值、最小值、峰峰值、偏移量和方波占空比。
编写嵌入式系统程序,实现随机信号发生器功能,输出在手d)写板上描绘的波形。
接口编写嵌入式系统程序,实现通讯功能,可以通过RS232e)
设置输出信号。
实验设备:
示波器、信号发生器、万用表a)
开发板C8051F单片机开发板、开发板、STM32STCb)
ADUC7026
、实验器件:
STM32F103ZET6文档大全.
实用标准文案
四.方案比较
1.1波形生成方案
方案一:
采用锁相式频率合成方案
这种方案利用锁相环将压控振荡器VCO的输出频率锁定在所需频率上。
这种方案具有很好的窄带跟踪特性,很好的选择所需频率。
但由于模拟方法合成的正弦波参数(如:
幅度,频率,相位)都很难被控制,难以满足实现任意波形的要求。
方案二:
采用STM32单片机生成波形,由于是软件滤波,所以不会有寄生的高次谐波分量,生成的波形比较纯净。
它的特点是价格低、性能高,在低频范围内稳定性好、操作方便、体积小、耗电少。
经比较,方案二既可满足课程设计的基本要求又能充分发挥其优势,电路简单,易控制,性价比高,所以采用该方案
1.2任意波形的生成原理
方案一:
触摸屏绘制波形
以触摸屏作为操作界面,用户可在触摸屏上输入波形参数及绘制波形。
此方法操作简易,并且可绘制任意波形,但是对编程者要求较高,故选择相对简单的用键盘输入数据。
方案二:
用键盘输入数据
采用键盘输入,这是最基本的方法。
优点是输入值精确。
但用户自定义输入时无法自由输入想要的特殊波形,而且输入数据繁琐,操作麻烦,由于实现相对简单,故本实验采用该方案。
五.系统设计分析
(A)硬件部分
液晶屏
STM32
D/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)(64T(t)=(t-128)/(63*2K)(128T(t)=(255-t)/(63*2K)(192(3)方波归一化数据生成函数
根据电压分辨率可以得出方波归一化数据生成函数为:
F(t)=1/(2k)(0F(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
#include//STM32F10xLibraryDefinitions
#includeSTM32_Reg.h//STM32registerandbitDefinitions
#includeSTM32_Init.h//STM32Initialization
#includecommon.h
#includesine_wave_1024.h
//输出端口:
PA4
#defineSINE_WAVE
1//sine正弦波
#defineRECT_WAVE2//rectangular矩形波
3//hackle
#defineHACKLE_WAVE三角波
UINT8flag=0;
VE;
AUINT8func=SINE_W/*----------------------------------------------------------------------------
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())
{
VE;
func=SINE_WA}
elseif(!
Get_SW4())
{
VE;Afunc=RECT_W}
elseif(!
Get_SW3())
{
VE;func=HACKLE_WA
}
switch(func)
{
VE:
caseSINE_WA//-------------------------------------------------------------
VE#ifdefSINE_WAif(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;
for(i=0;i<2000;i++)
*(pDAC_BASE+0x08)=0;
#endif
//-------------------------------------------------------------
break;
caseHACKLE_WAVE:
#ifdefHACKLE_WAVE
if(flag)
{
flag=0;
while(TRUE)
{
if(i<40