基于MSP430G2553的简易信号发生器DOCWord文档格式.docx
- 文档编号:22035868
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:21
- 大小:341.08KB
基于MSP430G2553的简易信号发生器DOCWord文档格式.docx
《基于MSP430G2553的简易信号发生器DOCWord文档格式.docx》由会员分享,可在线阅读,更多相关《基于MSP430G2553的简易信号发生器DOCWord文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
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
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<
msp430g2553.h>
in430.h>
#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;
}
CS_0;
}
LCD_Write_Byte()
向LCD12864写入一个字节数据
byte:
待写入的字符,无符号形式
*范例:
LCD_Write_Byte('
F'
)//写入字符'
voidwrite_dat(uchardat)
ulonglcddat;
high4bits=dat&
low4bits=dat&
lcddat=((ulong)0xfa<
if(lcddat&
lcddat<
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;
case3:
pos=0x88;
case4:
pos=0x98;
default:
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单缓冲模式
=~BIT0;
P2REN&
P2OUT|=BIT0;
//关闭dac输入*/
P2DIR&
=~(BIT0+BIT1+BIT2);
//输入
P2REN|=BIT0+BIT1+BIT2;
//用于按键接地型
P2IE|=BIT0+BIT1+BIT2;
//允许中断
P2IES|=BIT0+BIT1+BIT2;
//下升沿触发
P2IFG&
//消除中断标志
voiddisplay(void)
lcd_pos(1,0);
16;
write_dat(aa[i]);
lcd_pos(2,0);
{
write_dat(bb[i]);
}
lcd_pos(3,0);
10;
write_dat(cc[i]);
lcd_pos(4,0);
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<
P1OUT=tcout;
//锯齿波产生
tcout++;
}
tcout=0;
if(key==220)
if(ttcout==0)
if(tcoutm<
100)
P1OUT=tcoutm;
//三角波产生上升段
tcoutm++;
else
ttcout=1;
TA0CCR0+=(Tccr0-1);
if(ttcout==1)
if(tcoutm>
0)
//三角波产生下降段
tcoutm--;
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;
write_dat(aa[i]);
lcd_pos(3,0);
for(k=0;
k<
6;
k++)
write_dat(name[keynum][k]);
BIT1)==0)
delay_ms(1000);
if((P2IN&
//锯齿波
key=221;
write_dat(bb[i]);
if(tt==1)
if(keynum<
12)
keynum++;
else
keynum=0;
Tccr0=numt1[keynum]+numt2[keynum]+numt3[keynum]+numt4[keynum];
for
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 MSP430G2553 简易 信号发生器 DOC