首页 基于msp430g2553的简易正弦波发生器设计

基于msp430g2553的简易正弦波发生器设计

举报
开通vip

基于msp430g2553的简易正弦波发生器设计电子工程学院2015年大学生电子设计竞赛设计报告学院:电子工程学院姓名:马晨迪(2012210987)(硬件)宋明洁(2012210991)(软件)完成任务1.基本要求(1)振荡频率:≥10KHz;(2)输出信号电压范围(峰-峰值):≥2V;(负载1K欧,500欧,50欧)(3)测量振荡信号参数:峰峰值、有效值、频率;测量精度要求:满足(2)的负载下测量误差≤±5%。(以外接示波器测试为参考)2.发挥部分指定发挥要求:振荡频率:≥100KHz;测量精度提高:误差≤±1%;(以外接示波器测试为参考)显示并绘制输入信号...

基于msp430g2553的简易正弦波发生器设计
电子工程学院2015年大学生电子 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 竞赛设计报告学院:电子工程学院姓名:马晨迪(2012210987)(硬件)宋明洁(2012210991)(软件)完成任务1.基本要求(1)振荡频率:≥10KHz;(2)输出信号电压范围(峰-峰值):≥2V;(负载1K欧,500欧,50欧)(3)测量振荡信号参数:峰峰值、有效值、频率;测量精度要求:满足(2)的负载下测量误差≤±5%。(以外接示波器测试为参考)2.发挥部分指定发挥要求:振荡频率:≥100KHz;测量精度提高:误差≤±1%;(以外接示波器测试为参考)显示并绘制输入信号波形(绘制要求有坐标轴及刻度,单位)VDD<=3.3V;提交设计论文设计思路硬件原理利用产生自激振荡的条件去构成正反馈电路,以产生正弦波振荡。原理图如下:自激振荡的平衡条件:1)振幅条件:2)相位条件:=要产生自激震荡可以采用LC、RC或者石英晶体振荡电路。但是在产生较低频率的正弦波是时,若采用LC电路,所需电感很大,实际中往往很难找到,而石英晶体震荡频率虽然稳定,但是可调节范围较小。所以我们最终采用了RC文氏桥电路。模型文氏桥电路的原始模型:改进后的模型:上图中,在回路串联两个反向并联的二极管,利用电流增大时,二极管动态电阻减小的特点,加入非线性环节,使输出电压稳定。用两个电位器R,调节震荡频率,使得满足起振条件和满足所要求的震荡频率。仿真过程实际操作实际操作过程中我们发现,仿真出来的效果很好,但是严格按照仿真结果出来的效果却并不是很好,甚至无法出现波形。开始时还以为是电路链接有问题,插了好几次,不见效果,后来试着不断调节电位器R的值,突然出现了波形。这说明理论和实际还真是有不小的差距。在实现大于10kHz的功能时,电容值C本来用的参考资料里的223但是发先频率可调范围较小,而且电压最高为2.1V左右,刚刚能够满足要求,所以,改选了102,效果比较好不仅频率达到了要求,而且电压最大值可达到2.7V。再加入负载之后,我们能实现电压仍大于2V的负载值最小只能是68欧。未接负载前:接1000欧负载接500欧负载接68欧拓展功能实现在实现100kHz时,我们更换电容C为容值更小的101(1000pF),实现了频率要求,但是电压的要求难以实现,要实现仍是正弦波的要求,电压幅度最大只能是几百毫伏。在使用电压3.3V供电时,频率上可以满足大于10k的要求(33k),但是电压只能达到1.74V。如下图软件软件设计主要包括测量正弦波频率、测量正弦波幅度、lcd显示模块测量正弦波频率模块测量正弦波频率采用测频法,使用两个定时器A、B,定时器A的使用采用正弦波作为外部输入时钟,每输入一个正弦波的上升沿,TRA的值加一,这样可以使用定时器A的值记录输入的正弦波的周期数。定时器B的时钟采用SMCLK,用来计时,当计时到1s时触发中断,利用此时定时器A的值计算得到正弦波的频率。测量正弦波幅度模块将正弦波输入A1引脚,利用单片机内集成的ADC进行AD转换,对一定时间内采集的到的幅度值进行比较,最大值作为正弦波的幅度输出。Lcd显示模块由于msp430g2553单片机的IO管脚比较少,所以LCD12864采用串行通信模式,只用连接SID,CS,SCLK三个控制引脚,对LCD12864写入的每一个字节的数据或者命令采用三字节的数据格式写入,第一个字节为控制命令,第二个字节的高4位为数据的高4位,第三个字节的高4位为数据的低4位。因为LCD12864内部含有字库,所以只需要写入显示符号的ASCII码或者汉字,LCD会利用字库映射为对应的符号并显示出来。程序源代码/**measure.c**Createdon:2015-4-6*Author:Elan*P1.0输入正弦波作为外部时钟*P1.1输入正弦波进行adc采样*/#include"msp430g2553.h"#defineuintunsignedint#defineucharunsignedchar#defineulintunsignedlongintunsignedlongdata;//频率doubleTA_OverflowCnt=0;//溢出次数floatadc_sample=0;floatadc_max=0;floateffective_value=0;voidinit_TA();voidinit_adc();voidcal_max();voiddelay(uintt);voiddelay1(void);voidint_430(void);voidsendbyte(ucharzdata);voidwrite_com(ucharcmdcode);voidwrite_data(ucharDispdata);voidlcdinit();voidprint_string(char*s);voiddisplay_fre(void);voiddisplay_range(void);voiddisplay_effective_value(void);voidmain(){init_TA();init_adc();int_430();lcdinit();while(1){cal_max();display_fre();display_range();display_effective_value();delay1();}}voidinit_TA(){P1SEL|=BIT0;//选取管脚第二功能P1DIR&=~BIT0;//p1.0置为输入TA1CCR0=65535;//定时1sTACCR0=65535;TA1CTL|=TASSEL_2+ID_3+MC_1+TAIE+TACLR;//P1.1SMCLK作为时钟,8分频,增计数,中断使能,初始置0TA0CTL=TASSEL_0+TACLR+TAIE+MC_2;//P1.0外部输入时钟,中断使能,初始清零,连续计数TA0CCTL0|=CCIE;//使能捕获TA1CCTL0|=CCIE;_EINT();//打开全局中断}voidinit_adc(){ADC10CTL1|=CONSEQ_2;//单通道重复采样模式//ADC10CTL0|=SREF_0+REFON+REF2_5V;//选择内部参考电源,打开基准源,参考电压设置为VCC3.3VADC10CTL0|=SREF_0;ADC10CTL0|=ADC10SHT_0+MSC;//过采样率设置为4个采样周期ADC10CTL1|=ADC10SSEL_3+ADC10DIV_1+SHS_0;//采样时钟为SMCLK,二分频ADC10CTL1|=INCH_1;//选择采样通道A1ADC10CTL0|=ADC10ON;//开启ADC10ADC10AE0|=0x02;//开启外部采样通道}voidcal_max(){unsignedinti;for(i=0;i<65635;i++){ADC10CTL0|=ENC+ADC10SC;//开始转换while((ADC10CTL0&ADC10IFG)==0);//等待ADC10IFG标志变高(转换完成)adc_sample=(((float)ADC10MEM)*4.2583)/1023-2;//读取采样结果if(adc_max>1;//准备发送下一位数据}}/*************写命令函数************/voidwrite_com(ucharcmdcode){//串口控制格式(11111AB0)//A数据方向控制,A=H时读,A=L时写//B数据类型选择,B=H时为显示数据,B=L时为命令sendbyte(0xf8);//MCU向LCD发命令sendbyte(cmdcode&0xf0);//发高四位数据(数据格式D7D6D5D4_0000)sendbyte((cmdcode<<4)&0xf0);//发低四位数据(数据格式D3D2D1D0_0000)delay(2);//延时等待}/*************写数据函数************/voidwrite_data(ucharDispdata){sendbyte(0xfa);//MCU向LCD发数据sendbyte(Dispdata&0xf0);//发高四位数据sendbyte((Dispdata<<4)&0xf0);//发低四位数据delay(2);}/*************LCD初始化函数************/voidlcdinit(){delay(20000);//复位等待(内部自带上电复位电路),时间较长write_com(0x30);//功能设定:基本指令集操作delay(50);//延时等待write_com(0x04);//光标右移一位write_com(0x0c);//整体显示,关游标delay(50);write_com(0x01);//清屏}/*************送字符串函数************/voidprint_string(char*s){while(*s>0)//C语言里字符串末尾自动加“\0”(ASCII码值为0){delay(50);write_data(*s);//发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址s++;}}/***********显示频率*****************/voiddisplay_fre(){uintd1,d2,d3,d4,d5,d6;write_com(0x01);if(data>99999)//6位数的频率{d1=data/100000;d2=data%100000/10000;d3=data%100000%10000/1000;d4=data%100000%10000%1000/100;d5=data%100000%10000%1000%100/10;d6=data%100000%10000%1000%100%10;write_com(0x03);write_com(0x80);//频率显示在第一行print_string("频率:");write_com(0x83);write_data(d1+0x30);write_data(d2+0x30);write_data(d3+0x30);write_data(d4+0x30);write_data(d5+0x30);write_data(d6+0x30);}else//5位数频率{d1=data/10000;d2=data%10000/1000;d3=data%10000%1000/100;d4=data%10000%1000%100/10;d5=data%10000%1000%100%10;write_com(0x03);write_com(0x80);//频率显示在第一行print_string("频率:");write_com(0x83);write_data(d1+0x30);write_data(d2+0x30);write_data(d3+0x30);write_data(d4+0x30);write_data(d5+0x30);}write_com(0x86);write_data('H');write_data('z');}/***********显示幅度****************/voiddisplay_range(){uintr1,r2,r3;if(adc_max>9.9){r1=(uint)adc_max/10;r2=(uint)adc_max%10;r3=(uint)(adc_max*10)%100%10;write_com(0x03);write_com(0x90);//第二行print_string("幅度:");write_com(0x93);write_data(r1+0x30);write_data(r2+0x30);write_data(46);write_data(r3+0x30);}else{r1=(uint)adc_max/1;r2=(uint)(adc_max*10)%10;write_com(0x03);write_com(0x90);//第二行print_string("幅度:");write_com(0x93);write_data(r1+0x30);write_data(46);write_data(r2+0x30);}write_com(0x95);write_data('V');}/**********显示有效值*****************/voiddisplay_effective_value(){uinte1,e2,e3;//effective_value=adc_max/1.414;if(effective_value>9.9){e1=(uint)effective_value/10;e2=(uint)effective_value%10;e3=(uint)(effective_value*10)%100%10;write_com(0x03);write_com(0x88);//第s三行print_string("有效值:");write_com(0x8c);write_data(e1+0x30);write_data(e2+0x30);write_data(46);write_data(e3+0x30);}else{e1=(uint)effective_value/1;e2=(uint)(effective_value*10)%10;write_com(0x03);write_com(0x88);//第三行print_string("有效值:");write_com(0x8c);write_data(e1+0x30);write_data(46);write_data(e2+0x30);}write_com(0x8e);write_data('V');}//TAinterruptserviceroutine计数器A0溢出中断#pragmavector=TIMER0_A0_VECTOR__interruptvoidTimer_R0(void){_disable_interrupts();TA_OverflowCnt++;//TA每次溢出,溢出次数变量+1TA0CTL=TASSEL_0+TACLR+TAIE+MC_2;//连续计数模式,选择外部时钟TA0CTL&=~TAIFG;_enable_interrupts();}//定时器A1中断#pragmavector=TIMER1_A0_VECTOR__interruptvoidTimer_R1(void){_disable_interrupts();data=(TA_OverflowCnt*65535+TAR)*2.231;//读取上次TA计数值及溢出次数,计算频率TA_OverflowCnt=0;//将溢出次数置零TA1CTL=TASSEL_2+ID_3+TACLR+MC_1+TAIE;//选择子系统时钟SMCLK四分频增计数模式TA0CTL=TASSEL_0+TACLR+TAIE+MC_2;//选用外部时钟连续计数模式_enable_interrupts();}
本文档为【基于msp430g2553的简易正弦波发生器设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
旋律
几年的财务工作经验,现认财务主管一职!精通各种财务管理软件
格式:doc
大小:3MB
软件:Word
页数:0
分类:
上传时间:2018-05-13
浏览量:8