基于MSP430G2553的简易信号发生器.docx

上传人:b****0 文档编号:9826885 上传时间:2023-05-21 格式:DOCX 页数:25 大小:341.02KB
下载 相关 举报
基于MSP430G2553的简易信号发生器.docx_第1页
第1页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第2页
第2页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第3页
第3页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第4页
第4页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第5页
第5页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第6页
第6页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第7页
第7页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第8页
第8页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第9页
第9页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第10页
第10页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第11页
第11页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第12页
第12页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第13页
第13页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第14页
第14页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第15页
第15页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第16页
第16页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第17页
第17页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第18页
第18页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第19页
第19页 / 共25页
基于MSP430G2553的简易信号发生器.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于MSP430G2553的简易信号发生器.docx

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

基于MSP430G2553的简易信号发生器.docx

基于MSP430G2553的简易信号发生器

基于MSP430G2553的简易信号发生器

浙江工业大学

摘要:

本作品基于TI的LaunchPad设计了一款简易信号发生器,选用TI的MSP430G2553单片机。

通过单片机加外围LCD12864、DAC0832及TL082放大电路,实现了可产生正弦波、锯齿波、三角波、方波的简易信号发生器,且频率可调。

关键词:

MSP430G2553DAC0832正弦波锯齿波三角波

 

一、作品基本功能介绍

1技术参数请见表1.1所示。

波形种类

正弦波

锯齿波

三角波

方波

频率范围(Hz)

100~1200

频率步进(Hz)

100

最大幅值VP-P(V)

0~4.7

输出阻抗(Ω)

50

其他功能

频率按键可调、输出使能控制放大、LCD人机指示

表1.1技术参数

2在信号产生和处理方面。

通过MSP430G2553内部的TA定时器,外加DAC0832产生四种波形,在DA输出后,通过一个由运算放大器TL082和精密可调电位器组成的运算放大电路,以实现信号的增益控制。

最后在

负载电阻上输出电压。

系统总体框图如图1.1所示。

图1.1系统总体框图

3人机交互方面。

本作品使用三个独立按键来控制菜单选项,其功能如表1.2所示。

正弦波

锯齿波

三角波

方波

增频

减频

短按P2.2

长按P2.1

长按P2.0

长按P2.2

短按P2.1

短按P2.0

长按时间大于1s短按时间大于10ms

表1.2按键功能说明

二、系统硬件和软件说明

1硬件构成

本作品使用LCD12864作为人机交互模块,由于MSP430G2553的I/O口很少,所以通过对LCD的进行串行数据输入,以节约I/O口。

其连接如图1.2所示。

图1.2LCD12864硬件连接

由于是通过MSP430G2553输出数字量的信号来产生波形,因此需要用到DA将数字量转换为模拟量。

考虑到单片机的I/O口数量,选用8位的DA来进行数模转换。

硬件如图1.3所示,DAC0832采用直通工作方式,节省I/O口控制引脚。

图1.3DAC0832直通方式硬件连接

由DAC输出模拟量后,由于波形的幅值太小,因此还需要进行幅值的放大。

其中R3是精密可调电位器,方便用户对信号的幅度进行调节。

50Ω的电阻可以保证整个信号发生器的输出阻抗为50Ω。

信号幅度调节和输出部分电路如图1.4所示。

图1.4幅值放大的硬件电路

2软件系统

整个系统的软件主要有主函数、定时器TA中断函数、按键中断函数三个大的模块组成。

系统软件框图如图1.5所示。

图1.5系统软件框图

各函数的作用和相互关系:

在主函数中首先对系统的时钟、I/O口、定时器TA进行了初始化。

初始化完毕,开启总中断。

接着进入while

(1)循环等待定时器中断子程序的执行。

按键中断函数主要对三个菜单按键(P2.2、P2.1、P2.0)的动作进行处理。

这三个菜单按键可以实现波形的切换,频率的加减,信号的使能输出。

在按键中断函数中修改的信号频率大小和波形的种类这两个参数会被主函数和定时器TA中断函数调用。

定时器频率计算原理。

TA定时器设置为连续增计数模式,时钟频率fs采用SMCLK同步。

若要产生XHz的正弦波、锯齿波、三角波和方波则有:

TA0CCR0=

在上式中,寄存器TA0CCR0是用以定时器TA的初始值。

本作品采用的是200个采样点。

三、方案论证

方案一:

由MSP430G2553结合低通滤波器电路来模拟实现DDS芯片的功能,进而产生各种波形。

优缺点:

利用此方案可以充分利用MSP430G2553上资源,使系统成本大大降低。

但是此方案只能产生低频率的波形,不适合此次参赛题目要求。

方案二:

控制部分由MSP430G2553实现,波形产生部分使用FPGA或CPLD芯片采用波形查找表结合高速的DAC产生。

优缺点:

此方案自由度大,符合现在的发展趋势。

但是,FPGA或CPLD芯片价格相对比较高,加上高速的DAC芯片,使设计成本大大提高。

而且整个设计中MSP430G2553仅仅完成简单的控制功能,资源得不到充分的利用。

方案三:

由MSP430G2553实现对专门的DDS芯片(如AD9850、AD9833)的控制,来产生各种波形。

优缺点:

利用此方案产生波形的频率稳定度高,易于程控。

但是,专门的DDS芯片价格高,系统成本高。

方案四:

控制部分由MSP430G2553实现,波形通过代码控制生成数字量信号,再用D/A转换器输出正弦波、锯齿波、三角波及方波,也可以实现频率的数控调整。

优缺点:

方法简单易行,采用单片专用芯片,系统体积大大减小。

可产生较高的频率,容易调节频率。

但是,未能很好的利用MSP430G2553的内部资源。

综上,方案四的系统成本低,性价比较高。

方案的可行性也较高,外围电路简单,能产生较高的频率且可以满足此次参赛要求。

所以本作品最终采用方案四。

四、程序流程图

1主程序流程图

开机后,主程序首先关闭看门狗,接着对相应的I/O口、系统时钟、定时器TA进行初始化,完成后开总中断。

然后,执行main函数。

主程序流程图如图1.6所示。

图1.6主程序流程图

2定时器中断服务子程序流程图

定时器TA的中断服务程序中主要处理判断信号标志位key的值,然后输出相应值的波形。

定时器中断服务程序流程图如图1.7所示。

3按键中断服务程序流程图

按键中断服务程序中主要处理波形的选择、频率的加减、信号输出使能等功能。

按键中断服务程序流程图见图1.8所示。

 

图1.7定时器中断服务子程序流程图

图1.8按键中断服务子程序流程图

五、结论

本文设计的信号发生器基本达到了比赛的要求,能够实现正确波形,能步进100Hz调节输出波形的频率,输出频率也比较稳定。

但是由于DA存在点问题(已被我焊坏),输出的波形放大能力不高。

还有待改进。

表1.3是主要的波形测试结果。

 

TA0CCR0值

793

396

264

198

158

132

理论波形频率

100Hz

200Hz

300Hz

400Hz

500Hz

600Hz

实测波形频率

99.982Hz

200.013Hz

300.121Hz

399.802Hz

500.363Hz

599.002Hz

TA0CCR0值

113

99

88

79

72

66

理论波形频率

700Hz

800Hz

900Hz

1000Hz

1100Hz

1200Hz

实测波形频率

699.235Hz

797.881Hz

896.212Hz

997.876Hz

1096.342Hz

1209.548Hz

表1.3波形测试结果

附上系统完整的电路原理图如图1.9所示。

图1.9系统完整电路原理图

视频地址链接:

优酷网络。

因才上传到网络服务器暂时无法获取地址链接,下图为证。

已经上传《浙江工业大学第一届TI杯MSP430大赛B组作品视频展示—杨洪》的视频。

参考文献

[1]贾立新、王涌.电子系统设计与实践.北京.清华大学出版社.2011

[2]张毅刚彭喜元.单片机原理及接口技术.人民邮电出版社.2011

附录:

源程序代码

//MSP430G2553串口连接12864显示,只用连接三个引脚,大大节省资源P2.4---r/wP2.3---SCLKP2.5---CS主频在1Mhz下

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

#defineulongunsignedlong

unsignedcharaa[16]={"P2.2正弦波长按"};

unsignedcharbb[16]={"P2.1锯齿波长按"};

unsignedcharcc[10]={"P2.0三角波"};

unsignedchardd[16]={"P2.1加频P2.0减频"};

unsignedcharnumt1[13]={193,196,164,198,158,132,113,99,88,79,72,66,61};

unsignedcharnumt2[13]={200,200,100,0,0,0,0,0,0,0,0,0,0};

unsignedcharnumt3[13]={200,0,0,0,0,0,0,0,0,0,0,0,0};

unsignedcharnumt4[13]={200,0,0,0,0,0,0,0,0,0,0,0,0};

unsignedcharname[13][6]={"100Hz","200Hz","300Hz","400Hz","500Hz","600Hz","700Hz","800Hz","900Hz","1000Hz","1100Hz","1200Hz","1300Hz"};

#defineSIDBIT4

#defineSCLKBIT3

#defineCSBIT5

#defineLCDPORTP2OUT

#defineSID_1LCDPORT|=SID

#defineSID_0LCDPORT&=~SID

#defineSCLK_1LCDPORT|=SCLK

#defineSCLK_0LCDPORT&=~SCLK

#defineCS_1LCDPORT|=CS

#defineCS_0LCDPORT&=~CS

uintkey=0;//按下的按键编号

uinti=0;

uintk=0;

uintj=0;

uinttt=0;

uintTccr0=158;

uintkeynum=4;

uinttcout=0;

uinttcoutm=0;

uintttcout=0;

//uinttake=13;

//延时程序

#defineCPU_F((double)16000000)

#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))

#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))

staticunsignedchartemp=0xaa;//定时器

ucharsindata[200]={

127,131,135,139,143,147,151,155,159,162,166,170,174,177,181,185,188

192,195,198,202,205,208,211,214,217,220,222,225,227,230,232,234,236

238,240,242,244,245,246,248,249,250,251,252,252,253,253,254,254,254

254,254,253,253,252,252,251,250,249,248,246,245,244,242,240,238,236

234,232,230,227,225,222,220,217,214,211,208,205,202,198,195,192,188

185,181,177,174,170,166,162,159,155,151,147,143,139,135,131,127,123

119,115,111,107,103,99,95,92,88,84,80,77,73,69,66,62,59

56,52,49,46,43,40,37,34,32,29,27,24,22,20,18,16,14

12,10,9,8,6,5,4,3,2,2,1,1,0,0,0,0,0

1,1,2,2,3,4,5,6,8,9,10,12,14,16,18,20,22

24,27,29,32,34,37,40,43,46,49,52,56,59,62,66,69,73

77,80,84,88,92,95,99,103,107,111,115,119,123};

/***********************************************************

*名称:

LCD_Write_cmd()

*功能:

写一个命令到LCD12864

*入口参数:

cmd:

待写入的命令,无符号字节形式

*出口参数:

*说明:

写入命令时,RW=0,RS=0扩展成24位串行发送

*格式:

11111RW0RS0xxxx0000xxxx0000

*|最高的字节|命令的bit7~4|命令的bit3~0|

***********************************************************/

voidwrite_cmd(ucharcmd)

{

uchari,high4bits,low4bits;

ulonglcdcmd;

high4bits=cmd&0xf0;

low4bits=cmd&0x0f;

lcdcmd=((ulong)0xf8<<16)+((ulong)high4bits<<8)+((ulong)low4bits<<4);

CS_1;

SCLK_0;

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

{

SID_0;

if(lcdcmd&0x00800000)SID_1;

lcdcmd<<=1;

delay_ms

(1);

SCLK_1;

delay_ms

(1);

SCLK_0;

}

CS_0;

}

/***********************************************************

*名称:

LCD_Write_Byte()

*功能:

向LCD12864写入一个字节数据

*入口参数:

byte:

待写入的字符,无符号形式

*出口参数:

*范例:

LCD_Write_Byte('F')//写入字符'F'

***********************************************************/

voidwrite_dat(uchardat)

{

uchari,high4bits,low4bits;

ulonglcddat;

high4bits=dat&0xf0;

low4bits=dat&0x0f;

lcddat=((ulong)0xfa<<16)+((ulong)high4bits<<8)+((ulong)low4bits<<4);

CS_1;

SCLK_0;

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

{

SID_0;

if(lcddat&0x00800000)SID_1;

lcddat<<=1;

delay_ms

(1);

SCLK_1;

delay_ms

(1);

SCLK_0;

}

CS_0;

}

/***********************************************************

*名称:

LCD_pos()

*功能:

设置液晶的显示位置

*入口参数:

x:

第几行,1~4对应第1行~第4行

*y:

第几列,0~15对应第1列~第16列

*出口参数:

*范例:

LCD_pos(2,3)//第二行,第四列

***********************************************************/

voidlcd_pos(ucharx,uchary)

{

ucharpos;

switch(x)

{

case1:

pos=0x80;break;

case2:

pos=0x90;break;

case3:

pos=0x88;break;

case4:

pos=0x98;break;

default:

pos=0x80;

}

pos+=y;

write_cmd(pos);

}

/****************************************************/

//LCD12864初始化

voidLCD_init(void)

{

write_cmd(0x30);

write_cmd(0x0C);

write_cmd(0x01);

write_cmd(0x02);

}

voidIO_init(void)

{

P1DIR=0xff;

P1REN=0x00;

P1SEL=0X00;

P1OUT=0x00;

P2SEL&=~(BIT4+BIT3+BIT5);

P2DIR=BIT4+BIT3+BIT5;

/*P2DIR|=BIT0;//DAC单缓冲模式

P2SEL&=~BIT0;

P2REN&=~BIT0;

P2OUT|=BIT0;//关闭dac输入*/

P2DIR&=~(BIT0+BIT1+BIT2);//输入

P2REN|=BIT0+BIT1+BIT2;//用于按键接地型

P2IE|=BIT0+BIT1+BIT2;//允许中断

P2IES|=BIT0+BIT1+BIT2;//下升沿触发

P2IFG&=~(BIT0+BIT1+BIT2);//消除中断标志

}

voiddisplay(void)

{

lcd_pos(1,0);

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

{

write_dat(aa[i]);

}

lcd_pos(2,0);

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

{

write_dat(bb[i]);

}

lcd_pos(3,0);

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

{

write_dat(cc[i]);

}

lcd_pos(4,0);

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

{

write_dat(dd[i]);

}

}

voidDCO_init(void)

{

BCSCTL1=CALBC1_16MHZ;//设定cpu时钟DCO频率为16MHz

DCOCTL=CALDCO_16MHZ;

//BCSCTL2|=SELM_1+DIVM_0;//SMCLK选择16MHz,不分频

//BCSCTL2&=~SELS;

}

voidTimer_A0_init(void)

{

TA0CTL|=TASSEL_2+MC_2;//TA时钟源选择SMCLK,连续增计数模式

TA0CCR0=158;

TA0CCTL0|=CCIE;//打开比较模块0中断

_EINT();

}

/****************************************************/

//定时器中断服务程序

/****************************************************/

#pragmavector=TIMER0_A0_VECTOR

__interruptvoidTimer_A0(void)//CCIFG中断被响应后,该标志位自动清零

{

if(key==222)

{

if(j<200)

{

P1OUT=sindata[j];//正弦波产生

j++;

}

else

j=0;

TA0CCR0+=Tccr0;

}

if(key==221)

{

if(tcout<200)

{

P1OUT=tcout;//锯齿波产生

tcout++;

}

else

tcout=0;

TA0CCR0+=Tccr0;

}

if(key==220)

{

if(ttcout==0)

{

if(tcoutm<100)

{

P1OUT=tcoutm;//三角波产生上升段

tcoutm++;

}

else

ttcout=1;

TA0CCR0+=(Tccr0-1);

}

if(ttcout==1)

{

if(tcoutm>0)

{

P1OUT=tcoutm;//三角波产生下降段

tcoutm--;

}

else

ttcout=0;

TA0CCR0+=(Tccr0-1);

}

}

}

/***************************************************/

#pragmavector=PORT2_VECTOR

__interruptvoidPort2(void)

{

_DINT();//关中断

delay_ms(10);//延迟5ms,消抖延迟5ms10ms都行

if((P2IN&BIT2)==0)//如果为低,即按键真的按下了因为是下降沿触发中断,所以要检测是否为低(P2IN&BIT2)==0

{

//正弦波

key=222;

tt=1;

LCD_init();

lcd_pos(1,0);

for(i=4;i<10;i++)

{

write_dat(aa[i]);

}

lcd_pos(3,0);

for(k=0;k<6;k++)

{

write_dat(name[keynum][k]);

}

}

if((P2IN&BIT1)==0)

{

delay_ms(1000);

if((P2IN&BIT1)==0)

{

//锯齿波

key=221;

tt=1;

LCD_init();

lcd_pos(1,0);

for(i=4;i<10;i++)

{

write_dat(bb[i]);

}

lcd_pos(3,0);

for(k=0;k<6;k++)

{

write_dat(name[keynum][k]);

}

}

else

{

if(tt==1)

{

if(keynum<12)

keynum++;

else

keynum=0;

Tccr0=numt1[keynum]+numt2[keynum]+numt3[keynum]+numt4[keynum];

lcd_pos(3,0);

for(k=

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

当前位置:首页 > 小学教育 > 语文

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

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