北京邮电大学课设基于MSP430的简单信号发生器的设计.docx

上传人:s****u 文档编号:12743764 上传时间:2020-05-21 格式:DOCX 页数:29 大小:3.98MB
返回 下载 相关 举报
北京邮电大学课设基于MSP430的简单信号发生器的设计.docx_第1页
第1页 / 共29页
北京邮电大学课设基于MSP430的简单信号发生器的设计.docx_第2页
第2页 / 共29页
北京邮电大学课设基于MSP430的简单信号发生器的设计.docx_第3页
第3页 / 共29页
点击查看更多>>
资源描述
基于MSP430的信号发生器设计报告学院:电子工程学院班级:2013211212组员:唐卓浩(2012211069)王旭东(2013211134) 李务雨(2013211138)指导老师:尹露课程设计报告基于MSP430的信号发生器的设计学院:电子工程学院班级 :2013211212 小组成员: 唐卓浩(2012211069)王旭东(2013211134)李务雨(2013211138)一、摘要信号发生器是电子实验室的基本设备之一,目前各类学校广泛使用的是标准产品,虽然功能齐全、性能指标较高,但是价格较贵,且许多功能用不上。本设计介绍一款基于MSP430G2553单片机的信号发生器。该信号发生器虽然功能及性能指标赶不上标准信号发生器,但能满足一般的实验要求,且结构简单,成本较低。本次需要完成的任务是以MSP430 LaunchPad的单片机为控制核心、DAC模块作为转换与按键电路作为输入构成的一种电子产品。MSP430 LaunchPad单片机为控制核心,能实时的进行控制;按键输入调整输出状态,DAC0832将单片机输出的数字信号转化为模拟量,经运放放大后,在示波器上输出。在本次程序设计中充分利用了单片机内部资源,涉及到了中断系统、函数调用等。关键字:信号发生器 MSP430 单片机 数模转换二、设计要求以msp430单片机为核心,通过一个DA(数字模拟)转换芯片,将单片机输出的方波、三角波、正弦波(数字信号)转换为模拟信号输出。提供芯片:msp430G2553、DAC0832、REF102、LM384、OP07。参考框图如下:图1 硬件功能框图1、基本要求(1) 供电电压 VDD= 5V12V;()(2) 信号频率:5500Hz(可调);()(3) 输出信号电压可调范围:0.5*VDD,直流偏移可调:0.5*VDD;()(4) 完成输出信号切换;()(5) 方波占空比:平滑可调20%80%;()(6) 通带内正弦波峰峰值稳定度误差:10%(负载1K)。()2、发挥部分(1) 信号频率:52000Hz(可调);()(2) 多通道同时输出同频正弦波,方波,三角波。(频率可调);(3) 输出频率与幅度可调的正弦波与余弦波,相位误差5度;(4) 自由发挥。三、实验器材MSP430G2553单片机(Texas Instrument);DAC0832模数转换芯片;REF102高精度电压基准;OP07运算放大器;阻值不同的电阻及电位器若干;电容若干;导线若干。1、 MSP430G2553单片机TI的MSP430G2系列Launchpad开发板是一款适用于TI最新MSP430G2xx系列产品的完整开发解决方案。其基于USB 的集成型仿真器可提供为全系列MSP430G2xx器件开发应用所必需的所有软、硬件。LaunchPad具有集成的DIP插座,可支持多达20个引脚,从而使MSP430 Value Line器件能够简便地插入LaunchPad电路板中。此外,其还可提供板上Flash仿真工具,以直接连接至PC 轻松进行编程、调试和评估。此外,它还提供了从MSP430G2xx器件到主机PC或相连目标板的9600波特率的UART串行连接。MSP430G2系列Launchpad开发板的特性:(1)USB 调试与编程接口无需驱动即可安装使用,且具备高达9600波特的UART 串行通信速度;(2)支持所有采用PDIP14或PDIP20封装的MSP430G2xx和MSP430F20xx器件;(3)两个按钮可实现用户反馈和芯片复位;(4)器件引脚可通过插座引出,既可以方便的用于调试,也可用来添加定制的扩展板。(5)由此易知,MSP430单片机将用于系统的控制部分。2、 DAC0832模数转换芯片DAC模块主要由DAC0832和OPA227PA运算放大器组成。DAC0832是8分辨率的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。其主要参数如下:(1)分辨率为8位;(2)电流稳定时间1us;(3)可单缓冲、双缓冲或直接数字输入;(4)只需在满量程下调整其线性度;(5)单一电源供电(+5V+15V);(6)低功耗,20mW其引脚功能如下:(1)D0D7:8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);(2)ILE:数据锁存允许控制信号输入线,高电平有效;(3)CS:片选信号输入线(选通数据锁存器),低电平有效;(4)WR1:数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变化换,LE1的负跳变时将输入数据锁存;(5)XFER:数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;(6)WR2:DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。(7)IOUT1:电流输出端1,其值随DAC寄存器的内容线性变化;(8)IOUT2:电流输出端2,其值与IOUT1值之和为一常数;(9)Rfb:反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;(10)Vcc:电源输入端,Vcc的范围为+5V+15V;(11)VREF:基准电压输入线,VREF的范围为-10V+10V;(12)AGND:模拟信号地;(13)DGND:数字信号地3、 REF102高精度电压基准REF102是高精度10V电压基准集成电路。由于REF102无需外加恒温装置,因而功耗低、升温快、稳定性好、噪声低。REF102的输出电压几乎不随供电电源电压及负载变化。通过调整外接电阻,输出电压的稳定性及温度漂移可降至最校11.4V至36V的单电源供电电压及优异的全面性能使REF102成为仪器、A/D、D/A及高精度直流电源应用的理想选择。REF102的特点:(1)高精度输出:+10V 0.0025V(2)超低温度漂移:2.5ppm/(3)高稳定性:5ppm/1000小时(典型值)(4)高负载调整率:1ppm/V,10ppm/mA(5)宽供电电压范围:11.4VDC至36VDC(6)低噪声(7)低静态电流:1.4MaREF102的引脚:(2)为芯片电源脚,电压范围是11.4V36V;(4)为公共引脚;(5)为外接调整电阻脚,调整输出电压稳定度及温度漂移;(6)为输出引脚;(8)为输出噪声衰减。4、 OP07运算放大器OP07芯片是一种低噪声,非斩波稳零的双极性运算放大器集成电路。由于OP07具有非常低的输入失调电压(对于OP07A最大为25V),所以OP07在很多应用场合不需要额外的调零措施。OP07同时具有输入偏置电流低(OP07A为2nA)和开环增益高(对于OP07A为300V/mV)的特点,这种低失调、高开环增益的特性使得OP07特别适用于高增益的测量设备和放大传感器的微弱信号等方面。OP07芯片引脚功能说明:1和8为偏置平衡(调零端),2为反向输入端,3为正向输入端,4接地,5空脚 6为输出,7接电源。四、硬件电路设计1、 整体设计思路方案一:控制部分由MSP430G2553实现,波形产生采用单片压控函数发生器(MAX038等),可同时产生频率可控可变的正弦波、三角波、方波。优缺点:简单易行,采用专用芯片,系统体积大大减小;但频率步进的步长很难控制,并且整个设计中MSP430G2553仅完成简单的控制功能,资源没有充分利用。方案二:由MSP430G2553实现对专门的DDS芯片(如AD9850)的控制,产生各种波形。优缺点:此方案产生波形的频率稳定度高,易于程控。但DDS芯片价格高,系统成本高。方案三:由MSP430G2553结合DAC0832实现各种波形的产生。优缺点:此方案可以充分利用MSP430G2553上的资源,降低系统成本,但是产生波形频率较低。综上,方案三充分利用MSP430G2553的资源,外围电路简单、系统成本较低,可以满足信号发生器的要求,所以最终采用方案三。2、 硬件控制模块这次试验共有三个按键输入,分别作为切换波形,加频,减频。一个滑动变阻器作为占空比的调节,一个作为幅度的调节,一个作为直流偏置的调节。按键直接采用分压法给一个高电位,当按下去的时候相当于接地也就输出了低电平。占空比的调节在于分压法,让滑动变阻器所占电压在02.5伏,从而输给芯片产生相应的占空比,再输出。3、 DAC0832的模块其八位数据输入接MSP430的八位数据输出,通过Iout1端口输出。使能端与430相连,电源接12V。Iout2接地,f不接。4、 放大模块采用了反向放大电路,电源输入电压是12伏,放大了5倍左右。同时在放大电路前并联一个滑动变阻器100K,通过它来调节整个DAC对应的输出负载电阻,也就可以达到改变电压的幅度的目的。效果如下(由于该方波是2KHz的方波,频率较高因此边沿看上去不垂直):5、 直流偏置采用反向加法电路通过改变直流的接入电阻调节直流电压的大小。图如下,u1为放大之后的输入,u2为-12伏的电压。R1,3,6都是5K的电阻,R2位100k的电位器。则Uout1=12*5/R2-U1,这就达到了直流偏置的效果。效果见下图:五、 软件程序设计1、 设计指标与功能(1)波形产生和切换。正弦波、三角波和方波依次切换,采样点均为100个。(2)频率调节。从5Hz到2000Hz可调,步进5Hz,一共400个有效频率点。(3)占空比调节。从20%到83%平滑可调,使用ADC10连续采集滑动变阻输出电压实现。2、 软件模块介绍(1) 变量及宏定义#define SWITCH_SIG_TYPE(BIT0) /P1.0#define ADD_FREQ(BIT1) /P1.1#define SUB_FREQ(BIT2) /P1.2#define DAC_WR(BIT3) /P1.3#define ADC10_IN_PORT(BIT4) /P1.4#define P1_IN_PORTS (SWITCH_SIG_TYPE + ADD_FREQ + SUB_FREQ + ADC10_IN_PORT)#define P1_OUT_PORTSDAC_WR / 3:DAC WR#define P1_INTERRUPT (SWITCH_SIG_TYPE + ADD_FREQ + SUB_FREQ)#define P2_OUT_PORTS (0xff) / DAC data in#define TOTAL_SAMPLING_POINTS100#define MAX_FREQ_STEPS400#define ENABLE_WR_PORTP1OUT &= DAC_WR / WR-0#define DISABLE_WR_PORTP1OUT |= DAC_WR / WR-1#define write_dac(data)P2OUT = data/ write to DACuintcurr_signal_type;/当前的波形,0表示正弦波,1是三角波,2是方波inttccr0_now; /表示当前的计数初值uintccr0_idx; /表示当前计数初值在表中的索引号ucharpoint_now; /表示现在采用点的索引值intduty_circle; /表示当前的方波高电平的点数,用于表示占空比。const long tccr0_tableMAX_FREQ_STEPS=32000, .,78, 75 ;/5-2000Hz每隔5Hz频率对应的计数器初值表,一个400个频点。const uchar sin_dataTOTAL_SAMPLING_POINTS=.;/正弦值表,100点。const uchar tria_dataTOTAL_SAMPLING_POINTS=.;/三角波值表,100点。(2) 基本时钟系统MSP430x2xx家族的单片机的基本时钟系统模块如下图所示:MSP430有四个时钟源:LFXT1CLK、XT2CLK、DCOCLK和VLOVLK,系统时钟使用BCSCTL1寄存器设置。下面的初始化代码将系统的时钟时钟源设置为16MHz,DCO的频率设置为16MHz。void init_DCO() BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ; 上述的每一个时钟源都可以驱动时钟信号电路产生周期时钟信号,一共有三种独立的时钟信号,分别是MCLK、SMCLK和ACLK,其时钟源可以任意指定。这些时钟由寄存器BCSCTL2设置。BCSCTL2 = SELM_1 + DIVM_0;/ SELMx位置SELM_1,选择MCLK的时钟源为DCOCLK,DIVM_0分频比为1 BCSCTL2 &=SELS;/ SELS位为0表示将SMCLK的时钟源设置为DCOCLK(3) 定时器A定时器A是一个16位的计时器,有三种计数模式,可配置任意时钟源驱动,多种capture/compares模式和寄存器。定时器A的工作模式如下表所示MCx模式工作方式00Stop停止计时01Up mode从0到TACCR0循环计数10Continous mode从0到0FFFFH循环计数11Up/down mode从0计时到TACCR0再回到0循环定时器的计数模式和时钟源的选择由寄存器TACTL设置。定时器的中断的产生主要依赖capture/compare寄存器的设置。MSP430x2xx家族一共有三套独立的capture/compare寄存器,可以独立产生中断。本程序使用的是连续计数模式,计数和中断产生方式如下图所示。本程序只是用了capture/compare寄存器TACCR0和TACTL0产生中断。void init_timer_A0(void)TACTL |= TASSEL_2 + MC_2;/ TASSELx置TASSEL_2选择SMCLK作为时钟源,/ MC_2设置技术模式为连续模式TACCR0 = tccr0_now;/设置捕获/比较寄存器0的初值TACCTL0 |= CCIE;/ 捕获/比较寄存器0的中断使能(4) 单片机ADC10MSP430的ADC是一个十位的模数转换模块,转换出的数字范围为01023。转换值的计算公式为:ADC10一共有两大类工作方式,第一种是直接转换方式,该模式主要的特点是转换后的数据直接存放在ADC10MEM寄存器中。第二种是数据传输方式,主要特点是会将数据自动存放在内存中用户定义好数组中。在直接转换方式中又有四种模式:CONSEGx模式工作方式00单通道单次转换一个通道输入,只转换一次,下一次转换的触发需要用户手动设置。01多通道顺序转换多通道输入,每个通道依次转换一次,下一次转换的触发需要用户手动设置。10单通道循环转换一个通道输入,下一次转换的触发自动触发。11多通道顺序循环多个通道输入,每个通道依次转换,下一次转换自动触发。ADC10的中断可选择在数据在ADC10MEM里准备好后触发。本程序使用的是单通道单次转换,并且不设置ADC10中断,而是在主函数的while(1)循环中手动处理采集数据的时序。之所以不采用中断模式是因为在MSP430中默认不能中断嵌套,当ADC10中断进入时,定时器中断就无法进入,从而影响定时器的精度,另外如果开启中断嵌套,那么中断处理将会更复杂,因此权衡考虑后选择该工作方式。这种方式下ADC10在主程序中执行转换和处理,而定时器中断可以按时进入,保证了定时器的精度。转换的流程如下图所示:ADC10的参考电平可以有多种选择,如下所示:本程序选择的是第二种参考电平设置。其中VREF+是ADC10内置的参考电平,将ADC10CTL0寄存器的REF2_5V位置1,表示该电平为2.5V。Vss是MSP430的20号引脚,将其接地,表示最低参考电平为0。因此转换值的计算公式为NADC=1023*Vin/2.5。初始化函数如下:void init_ADC10(void)ADC10CTL1 |= INCH_4;/ A4通道,P1.4输入模拟值。ADC10CTL1 |= SHS_0;/ Sample-and-hold source select ADC10SCADC10CTL1 |= ADC10SSEL_3;/ 时钟源为SMCLKADC10CTL1 &=ADC10DF;/ 数据存储格式,表示使用ADC10MEM的低十位存储数据ADC10CTL1 |= CONSEQ_0;/ 单通道单转换模式ADC10AE0 = ADC10_IN_PORT;/P1.4输入模拟值ADC10CTL0 &=ADC10IE;/ 屏蔽中断ADC10CTL0 |= SREF_1 + ADC10SHT_0 + REF2_5V + REFON;/ VR+ = 2.5V, VR- = Vss = 0/REFON开启内部参考电平ADC10CTL0 &=REFOUT;/ REFOUT位置1会将参考电压输出到P1.3和P1.4上,不需要因此置0.ADC10CTL0 |= ADC10ON;/打开ADC10主程序循环如下,采集数据到占空比的转换算法为右移4位再加20:while(1)ADC10CTL0 &=ENC;/关闭采样使能while(ADC10CTL1 & ADC10BUSY);/检测是否忙ADC10CTL0 |= ENC + ADC10SC;/打开采样使能,开始转换while(ADC10CTL1 & ADC10BUSY);/检测是否忙int adc_data = ADC10MEM;/读取数据duty_circle =(adc_data 4)+20;/占空比限制在 20(20%)83(83%)之间/采集到的数据是01023/右移四位就是063/加20就是2083/总采样点数是100点/占空比就是20/100=20% 83/100=83% 之间(5) 端口I/O与中断MSP430有P1、P2一共十六个通用IO口。其功能分配如下端口功能I/O方向P2.0 P2.7输出8位数据到DAC输出P1.0按键中断,切换波形输入P1.1按键中断,增加频率输入P1.2按键中断,减小频率输入P1.3DAC的WR信号输出P1.4ADC10的模拟输入口输入主要初始化端口方向、功能以及中断,程序如下:void init_port_io(void)P2DIR= P2_OUT_PORTS;/ 设置输出端口P2.0P2.7P2REN=0x00;/ 不使用上/下拉电阻P2SEL=0x00;/ 端口的功能为IOP2SEL2=0x00;/ 端口的功能为IOP1DIR&= P1_IN_PORTS;/ P1.0 P1.1 p1.2 p1.4输入P1DIR|= P1_OUT_PORTS;/ P1.3输出给DAC WRP1REN=0x00;P1SEL=0x00;P1SEL2=0x00;void init_port_interrupt(void)P1IES|= P1_INTERRUPT;/相应位置1表示下降沿触发P1IE|= P1_INTERRUPT;/输入位中断使能P1IFG&=P1_INTERRUPT;/清除标志位五、功能实现1、 波形输出及切换波形的输出主要靠定时器周期性触发中断,然后将波形值数组中的值依次循环写到P2上。流程图如下:波形切换靠按键中断以及改变波形类型标志变量curr_signal_type实现,流程图如下:获得如下结果:2、 频率调节波形的频率调节通过改变计时器初值TACCR0来实现,所需的频率计算公式为波频率 = CPU时钟频率/(采样点数*定时器初值)流程图如下:为了能够使得频率可达到2000Hz,需要适当减小采样点数。在没有实现最大2000Hz时,采样电视为200点,将点数减少到100点,并适当减小DAC的WR信号的宽度,以达到在更高速的情况下能够将数据写入DAC。结果如下。产生5Hz的正弦波:产生2.145KHz的正弦波3、 占空比调节占空比的调节主要靠ADC10采集电位器输入电压并按照一定的算法算出高电平持续的点数duty_circle来表示占空比。采集转换的流程图如下相应的产生方波的逻辑为:20%占空比:80%占空比:六、问题及解决方案1、 三角波和方波没有波形最开始三角波的每一个采样点的值是由程序计算出来的,程序如下所示:case 1:/triangleif (point_now triangle_rising_edge_sampling_points) P1OUT = (uchar) (point_now); else P1OUT = (uchar) (TOTAL_SAMPLING_POINTS - point_now - 1);break;case 2:/boxif (point_now box_highlevel_sampling_points) P1OUT = (uchar) (1); else P1OUT = (uchar) (0);break;观察到的方波和三角波的频率非常低,几乎无法形成波形,可能的原因是是由于在中断服务程序里进行计算以及类型转换比较耗时,将三角波的采样点值写入一个数组即可解决问题。2、 方波波形输出效果欠佳示波器在AC档时方波不水平,将示波器的调到DC档即解决问题。3、 波形有大量白噪声LM384放大器的热噪声严重,换用OP07后得以解决。4、 三角波和正弦波输出波形不够美观未能解决。首先排除了程序采样点误差的可能性。其次可能是因为REF102的电压不稳,REF102的接法采样电流转电压的方案,而这种方案可能有一定的缺陷,但是并未证实。最后可能是DAC本身的输出不够稳定,在最后几天焊板子之前并没有换DAC来证实这一猜想,因此也无法确实是否是DAC本身的原因导致这一现象。七、结束语可以说,本次课程设计是三年以来最困难的一个综合实验性任务。在理论知识方面,用到了包括模拟电子电路,微机原理与接口技术,C语言等诸多课程中所学到的知识;在动手操作方面,电路连接需要仔细而耐心,需要先从面包板上分模块拼搭电路进行调试,再将电路焊接到PCB板上并确保其工作正常。在最初的电路设计上小组就已经举步维艰,需要阅读全英文版本的漫长的包括MSP430,REF102和DAC0832这三个器件的数据手册。经过两个下午的努力研读,才有了大概的思路,设计出了第一个版本的电路,软件部分也有了雏形。然而在测试之后果然如我们所料,并不能输出波形。接下来就是漫长而艰涩的调试和改进的过程。期间多次遇到波形不能正常输出的问题,以及输出效果不理想的问题。波形能够输出之后,又加上了输出幅度可调,方波占空比可调,频率向上向下连续可调等功能,并将频率范围提升至52000Hz。整个过程持续的时间最长,占到大约5天时间,虽然这个过程漫长而艰涩,但是每天都能让电路有所改进,都能为整个系统添加上一些前一天所没有的功能,也让我们保持着对于整个课程的信心,在不断进步的喜悦中继续努力实现更多功能,改进输出波形。由于调试过程占用时间较多,我们决定冒险将面包板各个模块一次性焊接到PCB板上以节约时间。为避免转移至PCB板之后出现问题,我们特意事先详细画出了电路的布线图。用不到一个下午的时间,整个电路全部焊接到PCB板上。但是出乎我们意料的是,再次出现了波形不能成功输出的问题。经过仔细检查,发现是电路部分导线和元件(电阻)与各引脚之间的连接出现了问题。最终,我们加班两个小时,除正弦波三角波显示效果略有缺陷之外,终于完美实现了所有功能。奈何验收当天还是出现了一些小插曲,前一天傍晚明明能稳定输出的波形,验收时突然就出现了轻微抖动的情况。排查了一段时间之后,依然没能找出问题所在,最终还是选择放弃,成为整个课程设计最后结果中的小小遗憾。附:程序全部代码#include #define SWITCH_SIG_TYPE(BIT0) /P1.0#define ADD_FREQ(BIT1) /P1.1#define SUB_FREQ(BIT2) /P1.2#define DAC_WR(BIT3) /P1.3#define ADC10_IN_PORT(BIT4) /P1.4#define P1_IN_PORTS (SWITCH_SIG_TYPE + ADD_FREQ + SUB_FREQ + ADC10_IN_PORT)#define P1_OUT_PORTSDAC_WR / 3:DAC WR#define P1_INTERRUPT (SWITCH_SIG_TYPE + ADD_FREQ + SUB_FREQ)#define P2_OUT_PORTS (0xff) / DAC data in#define TOTAL_SAMPLING_POINTS100#define MAX_FREQ_STEPS400#define ENABLE_WR_PORTP1OUT &= DAC_WR / WR-0#define DISABLE_WR_PORTP1OUT |= DAC_WR / WR-1#define write_dac(data)P2OUT = data / write to DAC#define uchar unsigned char#define uint unsigned intuintcurr_signal_type;inttccr0_now;uintccr0_idx;ucharpoint_now;intpush_key;intduty_circle;const long tccr0_tableMAX_FREQ_STEPS=32000,16000,10666,8000,6400,5333,4571,4000,3555,3200,2909, 2666,2461,2285,2133,2000,1882,1777,1684,1600,1523,1454,1391,1333,1280,1230,1185,1142,1103,1066,1032,1000,969,941,914,888,864,842,820,800,780,761,744,727,711,695,680,666,653,640,627,615,603,592,581,571,561,551,542,533,524,516,507,500,492,484,477,470,463,457,450,444,438,432,426,421,415,410,405,400,395,390,385,380,376,372,367,363,359,355,351,347,344,340,336,333,329,326,323,320,316,313,310,307,304,301,299,296,293,290,288,285,283,280,278,275,273,271,268,266,264,262,260,258,256,253,251,250,248,246,244,242,240,238,237,235,233,231,230,228,226,225,223,222,220,219,217,216,214,213,211,210,209,207,206,205,203,202,201,200,198,197,196,195,193,192,191,190,189,188,187,186,184,183,182,181,180,179,178,177,176,175,174,173,172,172,171,170,169,168,167,166,165,164,164,163,162,161,160,160,159,158,157,156,156,155,154,153,153,152,151,150,150,149,148,148,147,146,146,145,144,144,143,142,142,141,140,140,139,139,138,137,137,136,136,135,135,134,133,133,132,132,131,131,130,130,129,129,128,128,127,126,126,125,125,125,124,124,123,123,122,122,121,121,120,120,119,119,118,118,118,117,117,116,116,115,115,115,114,114,113,113,113,112,112,111,111,111,110,110,109,109,109,108,108,108,107,107,107,106,106,105,105,105,104,104,104,103,103,103,102,102,102,101,101,101,100,100,100,100,99,99,99,98,98,98,97,97,97,96,96,96,96,95,95,95,94,94,94,94,93,93,93,93,92,92,92,91,91,91,91,90,90,90,90,89,89,89,89,88,88,88,88,87,87,87,87,86,86,86,86,86,85,85,85,85,84,84,84,84,83,83,83,83,83,82,82,82,82,82,81,81,81,81,81,80,80,80,78,75;/ cpu_freq/ ccr0 = -/ sig_freq * total_sampling_pointsconst ucharsin_dataTOTAL_SAMPLING_POINTS=127,135,143,151,159,167,174,182,189,196,203,209,215,221,226,231,235,239,243,246,249,251,253,254,254,254,254,253,252,250,247,245,241,237,233,228,223,218,212,206,199,192,185,178,171,163,155,147,139,131,123,115,107,99,91,83,76,69,62,55,48,42,36,31,26,21,17,13,9,7,4,2,1,0,0,0,0,1,3,5,8,11,15,19,23,28,33,39,45,51,58,65,72,80,87,95,103,111,119,127;const uchartria_dataTOTAL_SAMPLING_POINTS=0,5,10,15,20,26,31,36,41,46,52,57,62,67,72,78,83,88,93,98,104,109,114,119,124,130,135,140, 145,150,156,161,166,171,176,182,187,192,197,202,208,213,218,223,228,234,239,244,249,255,255,249,244,239,234,228,223,218,213,208,202,197,192,187,182,176,171,166,161,156,150,145,140,135,130,124,119,114,109,104,98,93,88,83,78,72,67,62,57,52,46,41,36,31,26,20,15,10,5,0;#pragma vector = TIMER0_A0_VECTOR_interrupt void timer_A0(void)if(point_now = TOTAL_SAMPLING_POINTS)point_now =0;switch(curr_signal_type)case0:/ sin;write_dac(sin_datapoint_now);break;case1:/ trianglewrite_dac(tria_datapoint_now);break;case2:/ boxif(point_now =3)curr_signal_type =0;elseif(push_key & ADD_FREQ)/调节频率增加ccr0_idx+;if(ccr0_idx = MAX_FREQ_STEPS)ccr0_idx =0;tccr0_now = tccr0_tableccr0_idx;elseif(push_key & SUB_FREQ)/调节频率减小ccr0_idx-;if(ccr0_idx = MAX_FREQ_STEPS)ccr0_idx = MAX_FREQ_STEPS -1;tccr0_now = tccr0_tableccr0_idx;P1IFG &=P1_INTERRUPT;/清除标志位void init_vars()curr_signal_type =0;point_now =0;ccr0_idx = MAX_FREQ_STEPS /2-1;/初始 1kHztccr0_now = tccr0_tableccr0_idx;duty_circle = TOTAL_SAMPLING_POINTS /2;/初始50% 占空比void init_DCO()BCSCTL1= CALBC1_16MHZ;DCOCTL= CALDCO_16MHZ;BCSCTL2= SELM_1 + DIVM_0;/ select DCO as the source of MCLKBCSCTL2 &=SELS;/ select DCO as the source of SMCLKvoid init_timer_A0(void)TACTL|= TASSEL_2 + MC_2;/ SMCLK source and Mode continousTACCR0= tccr0_now;TACCTL0 |= CCIE;/ interrupt enable_EINT();void init_port_io(void)P2DIR= P2_OUT_PORTS;/ P2 11111111b all outP2REN=0x00;/ disable pull up/down resistorP2SEL=0x00;/ io function is selectedP2SEL2 =0x00;P1DIR &= P1_IN_PORTS;/ P1.0 P1.1 p1.2 p1.4 inP1DIR |= P1_OUT_PORTS;/ P1.3 for DAC WRP1REN=0x00;P1SEL=0x00;P1SEL2 =0x00;void init_port_interrupt(void)P1IES|=P1_INTERRUPT;/置1,下降沿触发P1IE|=P1_INTERRUPT;/中断使能P1IFG&=P1_INTERRUPT;/清除标志位void init_ADC10(void)ADC10CTL1 |= INCH_4;/ A4 channel for convertion, P1.4 inADC10CTL1 |= SHS_0;/ Sample-and-hold source select ADC10SCADC10CTL1 |= ADC10SSEL_3;/ SMCLK 16MADC10CTL1 &=ADC10DF;/ straght binary formatADC10CTL1 |= CONSEQ_0;/ Single channel single convertionADC10AE0= ADC10_IN_PORT;/ P1.4 inADC10CTL0 &=ADC10IE;/ disable interruptADC10CTL0 |= SREF_1 + ADC10SHT_0 + REF2_5V + REFON;/ V+ = 2.5V, V- = Vss = 0ADC10CTL0 &=REFOUT;/ diasable refout to p1.3 p1.4ADC10CTL0 |= ADC10ON;/ enable adcvoid main(void)WDTCTL = WDTPW | WDTHOLD;/ Stop watchdog timerinit_vars();init_port_io();init_port_interrupt();init_DCO();init_timer_A0();init_ADC10();_bis_SR_register(GIE);/全局中断使能while(1)ADC10CTL0 &=ENC;/关闭采样使能while(ADC10CTL1 & ADC10BUSY);/检测是否忙ADC10CTL0 |= ENC + ADC10SC;/打开采样使能,开始转换while(ADC10CTL1 & ADC10BUSY);/检测是否忙int adc_data= ADC10MEM;/读取数据duty_circle=(adc_data 4)+20;/占空比限制在 20(20%)83(83%)之间/采集到的数据是01023/右移四位就是063/加20就是2083/总点数是100点/占空比就是20/100=20% 83/100=83% 之间28 / 29
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!