DSP控制器及其应用课程设计-温度采集与显示 (2).doc_第1页
DSP控制器及其应用课程设计-温度采集与显示 (2).doc_第2页
DSP控制器及其应用课程设计-温度采集与显示 (2).doc_第3页
DSP控制器及其应用课程设计-温度采集与显示 (2).doc_第4页
DSP控制器及其应用课程设计-温度采集与显示 (2).doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

键盘输入分频发声装置课程设计说明书(2010/2011学年第一学期)课程名称 : dsp控制器及其应用 题 目 : 温度采集与显示 专业班级 : 学生姓名 : 学 号 : 指导教师 : 设计周数 : 2周 设计成绩 : 2011 年 7月7日22温度采集与显示 1 课程设计目的通过我们对dsp控制器及其应用课程的学习和理解,综合运用课本中所学到的理论知识完成一个温度采集与显示的课程设计。通过这次实践锻炼我们查阅资料、方案比较、团结合作的能力。在这个过程我们必须掌握温度采集技术的硬件设计、熟悉a/d转换技术和dsp液晶显示功能的软件设计。学会采用简单电路的实验调试和整机指标测试方法,增强我们的动手能力,为以后学习和工作打下坚实基础2 课程设计正文2.1 系统分析2.1.1 设计的任务及步骤(1)熟悉mc1403芯片的应用; (2)根据实验测得热敏电阻和温度的一些数据,设计温度电阻公式; (3)设计外部硬件电路; (4)软件完成程序流程图设计和编程,其中包括a/d转换和液晶显示部分;(5)编写上位机程序 (6)软硬件联合调试;(7)书写设计说明书。2.1.2 技术要求 此系统利用热敏电阻测得电阻温度之间的关系,找到电阻和温度之间的代数关系,从而检测温度,设计硬件外扩电路,同时设计软件程序,包括a/d程序设计,进行软硬件联系调试,能在液晶显示屏上显示温度。2.1.3 设计思路 首先设计温度采集电路,由于考虑到使用的是非线性负温度系数的热敏电阻,因此采用了桥式电路尽量减小因外接不必要因素导致的误差,通过多次试验测得几个点,并拟合出一条合适的线性函数关系。其次进行软件设计,主要包括ad转换模块、液晶显示模块、算法转换模块、主函数模块以及上位机模块。最后进行软硬件联系调试,并能在液晶上正常显示温度值。2.2 总体设计2.2.1 硬件设计tms320f2812作为本次课设使用的dsp芯片。它包含33个电源引脚(为使器件正常运行,所有电源引脚必须正确连接且不能悬空)时钟源模块,dsp有六种信号可以使dsp控制器复位,即电源复位、复位引脚rs、软件复位、非法地址复位、看门狗定时器溢出、欠压复位六种复位信号。所以在设计的初期,把它分成了五个模块。其中复位采用电源复位的方式,由引脚pcreset引起。为了可靠复位,其中低电平的有效时间至少6个cpu时钟周期。dsp最小系统组成框图如图1所示。图1 dsp最小系统其中:开关sw-pb、电容以及电阻构成一个简单的抚慰电路;晶振与两个并联电容接在xtal1与xtal2为2812提供外部时钟;ht7133芯片将5v直流电源转换为3.3v直流电源构成电源模块为2812供电。2.2.2系统框图设计该系统包括温度采集模块、f2812芯片、ad转换模块以及液晶显示模块,首先通过热敏电阻对外界温度的变化,从而改变其电位的变化,f2812芯片等待中断并接收数据,然后送入ad转换模块,ad对模拟信号进行转换,并将转换结果存放在结果寄存器的高12位,为保证数据精确多次采样求平均值,最后通过算法转换,将结果显示在lcd液晶上。系统设计流程如图2所示。图2 系统设计流程图2.3 单元电路的设计2.3.1 温度采集电路考虑到此次使用的是非线性负温度系数的热敏电阻,因此采用桥式电路尽量确保其精度,并使用低压基准芯片mc1403为电路提供基准电压,确保其尽量减少外界不必要因素的影响。温度采集电路如图4所示。图3 温度采集电路2.3.2 单元模块的分析(1)mc1403低压基准芯片引脚如图4所示。图4 mc1403低压基准芯片引脚图vin端口输入一个4.540v的模拟电压值(接p2口的1引脚),在vout端输出了一个稳定的电压值(接p2口的1引脚,为ad模块提供参考模拟高电平),gnd端接模拟地(接p2口的33引脚)为ad提供参考模拟低电平,并与数字地短接。(2)ad转换模块当模/数转换完成后,读取结果寄存器前,最好先读取模/数转换控制寄存器adcrl2的adcresult0或adcresult1,以确定当前结果寄存器的状态,保证读取的结果是正确。另外,要注意12位的转换结果放在结果寄存器中的高12位上,要进行位移转换,该12位数据与外部模拟输入电压的关系为:12位数字结果=4095*(输入电压/基准电压)基准电压:3v输入电压:a/d采集的电压12位数字结果:12位的转换结果是放在结果寄存器的高12位上。(3)lcd液晶显示模块dsp经常会对读写周期较慢的输入/输出设备(如液晶显示模块、打印机、键盘等)进行访问,通常以下两种方法来解决dsp与这些慢速设备之间的输入/输出时序匹配问题。直接访问方式是将dsp的读写信号限于慢速设备接口控制板引出的读写信号线直接相连,时序由dsp内部读写逻辑控制。由于慢速外设的读写周期相对dsp较慢,是两者的时序匹配,还必须进行一些时序方面的控制处理。一中处理方法是软件编程等待状态发生器,将外部总线周期扩展到数个机器周期。由于受硬件条件的限制,这种扩展通常也是有限的。液晶显示为128行和64列的矩阵,它分左右两个平面,而一个字是16行和16列的矩阵,在按页的显示中每一页是一个8行和128列的矩阵,所以每一行字是分两页显示的系统设计总电路图如图5所示。图.5 系统设计总电路图(4)单片机与pc机串口通信dsp有一个全双工的串行通讯口,所以dsp和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是rs232电平的,而dsp的串口是ttl电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片max232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的gnd、第2脚的rxd、第3脚的txd。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,rs232dsp 控 制 器pc机mc1489mc1488txdtxdrxdrxdgndgnd图 6 异步串行通讯原理图dsp控制器串行通信接口(sci)是一个标准的通用异步接收/发送(uart)通信接口。它的接收器和发送器都是双缓冲的。dsp控制器串行通信接口(sci)有自已的使能和中断位,它们可以半双工或全双工方式工作。为了保证数据的完整性,串行通信接口对接收的数据进行间断检测、奇偶性、超时和帧错误的检查。位速率(波特率)可通过一个16位的比特率选择寄存器进行编程,因此,可以有超过65000种不同的速率。sci模块是一个8位片内外设,通过dsp的16位外部数据总线的低8位与外部设备通信。sci的物理描述:(1)两个i/o引脚。*scirxd(sci接收数据输入)*scitxd(sci发送数据输出)(2)通过一个16位波特率选择寄存器的编程,可得到超过65000种不同的可编程位速率。(3)18的可编程数据字长。(4)长度为1位或2位的可编程停止位。(5)内部产生的串行时钟。(6)四个错误检测标志。*奇偶性错误 *超限错误*帧错误 *间断检验(7)两种唤醒多处理器模式,可与任意通信格式一起使用。*空闲线路唤醒 *位寻址唤醒(8)半双工或全双工操作。(9)双缓冲接收和发送功能。(10)接收和发送操作均可通过中断或查询操作进行,相应的状态标志如下:发送器:txrdy标志(发送器缓冲寄存器准备好接收另一个字符)和txempty标志(发送移位寄存器空)。接收器:rxrdy标志(准备从接收缓冲寄存器中读出一个新字符)、brkdt标志(间断条件发生)和rxerror,可用来监视四个中断条件。(11)发送器和接收器中断的分立的使能位(间断除外)。(12)sci数据,不管是接收的、还是发送的,都是nrz(非归零)格式的。2.4 软件程序设计2.4.1 软件系统流程图软件系统流程如图6 所示。图7 软件系统流程图2.4.2 软件程序设计程序主要包括主程序、中断、延时、a/d转换、算法转换、液晶显示等子程序,实现温度采集与显示的功能,程序详见附录。此次课设我主要负责ad转换、算法转换和主程序部分。ad转换部分我采用单通道采样方式对温度采集电路发送的值进行转换,并使用了第一组的6号中断对电路进行定时采样,由于考虑到热敏电阻比较灵敏,我采用了多次采样求平均值的方法确保数据精确。算法转换部分主要是对ad采集并转换的值进行进一步的转换,主要是将桥式电路的电压与热敏电阻的关系和拟合的温度与电阻的关系整合在一起,使其转换为我们能看懂的温度,并将其一位一位拆分开来复制到lcd液晶显示子程序,将结果显示字液晶屏上。(1)ntc热敏电阻原理及应用ntc热敏电阻器在室温下的变化范围在10o1000000欧姆,温度系数-2%-6.5%。ntc热敏电阻器可广泛应用于温度测量、温度补偿、抑制浪涌电流等场合。ntc热敏电阻为负温度系数热敏电阻。零功率电阻值 rt():rt指在规定温度 t 时,采用引起电阻值变化相对于总的测量误差来说可以忽略不计的测量功率测得的电阻值。电阻值和温度变化的关系式为:rt = rn expb(1/t 1/tn)rt :在温度 t ( k )时的 ntc 热敏电阻阻值。 rn :在额定温度 tn ( k )时的 ntc 热敏电阻阻值。 t :规定温度( k )。 b : ntc 热敏电阻的材料常数,又叫热敏指数。 exp :以自然数 e 为底的指数( e = 2.71828 )。该关系式是经验公式,只在额定温度 tn 或额定电阻阻值 rn 的有限范围内才具有一定的精确度,因为材料常数 b 本身也是温度 t 的函数。额定零功率电阻值 r25 ():根据国标规定,额定零功率电阻值是 ntc 热敏电阻在基准温度 25 时测得的电阻值 r25,这个电阻值就是 ntc 热敏电阻的标称电阻值。通常所说 ntc 热敏电阻多少阻值,亦指该值。材料常数(热敏指数) b 值( k )rt1 :温度 t1 ( k )时的零功率电阻值。 rt2 :温度 t2 ( k )时的零功率电阻值。 t1, t2 :两个被指定的温度( k )。对于常用的 ntc 热敏电阻, b 值范围一般在 2000k 6000k 之间。已知150时为25,即r25 = 150,120时为45,经计算,b约为2121.7k。代入得:r=150*exp(2121.7*(1/t)-1/298)取曲线上的任意几点,再用matlab进行曲线拟合,得到几条直线,经筛选后得到如图7的图形。经变换单位后,得到温度与电阻值之间的关系式:t = 125 2/3*r图8 拟合后的直线其中横坐标为温度,单位为k;纵坐标为电阻值。由硬件部分(电桥电路)得到电压与电阻值之间的关系:v = 2.5*r1/(r1+r),其中r1=200,与上式相结合并经调试修改后,得到温度值与电压之间的关系:t=140.0-0.67*(500.0/v-200.0)/温度计算子程序void wendu(float c) temperature=140.0-0.67*(500.0/c-200.0); t_tempe=(int)temperature; t_tempe1=t_tempe/10; t_tempe0=t_tempe%10; d_tempe=(int)(10*(temperature-t_tempe);(2)上位机sci波特率的设置:16位的波特率数值用brr表示。sci使用16位的波特率选择寄存器值来选择64k种不同的串行时钟频率中的一种。选择可以通过以下方法来确定:当 brr =165535时(brr=波特率选择寄存器中的16位值):波特率是按位计算的,而每位需要8个sciclk周期。当 brr = 0 时串行通信过程: 在进行串行通信之前,先对 sci 通信控制寄存器 sciccr 进行设置。信息块的起始位始终是1位,停止位可选择1位或2位。数据位的长度是可编程的,可设置18位,由sciccr的scichar2:0设置。数据位长度小于8位时,写到发送缓冲寄存器scitxbuf的数据只有低l位被发送(这些数据位必须右对齐,因为对于少于8位的字符,左边的位是被忽略的)。校验位可设,由sciccr的parity enable(5位)设置。校验方式有两种,奇、偶校验,由sciccr的parity(6位)设置。空闲线方式与地址位方式的选择,由sciccr的addr/idle mode(3位)设置。sciccr的sciena(4位)是一个总开关位。 在信息块的格式确定后就要确定串行通信的波特率。串行通信的时钟sciclk是由时钟源模块的sysclk按照sci波特率寄存器规定的分频系数分频后得到的。16位的波特率寄存器scihbaud和scilbaud分别决定了波特率寄存器的高、低8位,二者共同构成了16位的波特率数值。 设置好串行通信的波特率后,就要确定接收、发送部分的控制位,这些由sci控制寄存器scictl1、2来完成, 当数据写入scitxbuf时,scictl2的txrdy(7位)被清0;当scitxbuf的数据全部移出后,则scictl2的txrdy被置1,并且产生发送中断txint。(3)sci下位机程序#include”dsp281x_device.h”/使用的函数原型声明void gpio_select(void);void speedupreva(void);void sci_init(void);interrupt void sci_tx_isr(void);interrupt void sci_rx_isr(void);/全局变量char message=temperature;void main(void)initsystem();/初始化dsp内核寄存器gpio_select();/配置gpio复用功能寄存器initpiectrl();/调用外设中断扩展初始化单元pie-unit/(代码:dsp281x_piectrl.c)initpievecttable();/初始化pie vector向量表/ (代码:dsp281x_piectrl.c)eallow;/解除寄存器保护pievecttable.txaint=& sci_tx_isr;pievecttable.rxaint=& sci_rx_isr;edis;/ 使能寄存器保护/使能pie中的sci_a_tx_int中断piectrlregs.pieier9.bit.intx2=1;/使能pie中的sci_a_rx_int中断piectrlregs.pieier9.bit.intx1=1;/使能cpu int 9ier |=ox100;/全局中断使能和更高优先级的实时调试事件eint;/ 全局中断使能intmertm;/ 使能实时调试中断dbgmsci_init();while(1)piectrlregs.wdkey=ox55;/看门狗控制piectrlregs.wdkey=oxaa;edis;/ 使能寄存器保护void gpio_select(void)eallow;/解除寄存器保护gpiomuxregs.gpamux.all=ox0;/所有gpio端口配置为i/ogpiomuxregs.gpbmux.all=ox0;gpiomuxregs.gpfmux.all=ox0;gpiomuxregs.gpdmux.all=ox0;gpiomuxregs.gpamux.bit.scirxda_gpiof5=1;/配置sci_rxgpiomuxregs.gpamux.bit.scixtda_gpiof4=1;/配置sci_txgpiomuxregs.gpemux.all=ox0;gpiomuxregs.gpgmux.all=ox0;gpiomuxregs.gpadir.all=ox0;/gpio port 配置为输入gpiomuxregs.gpbdir.all=ox0; /gpio port 配置为输入gpiomuxregs.gpddir.all=ox0; /gpio port 配置为输入gpiomuxregs.gpedir.all=ox0; /gpio port 配置为输入gpiomuxregs.gpfdir.all=ox0; /gpio port 配置为输入gpiomuxregs.gpgdir.all=ox0; /gpio port 配置为输入/设置所有gpio输入的量化值等于0gpiomuxregs.gpaqual.all=ox0;gpiomuxregs.gpbqual.all=ox0;gpiomuxregs.gpdqual.all=ox0;gpiomuxregs.gpequal.all=ox0;edis;/ 使能寄存器保护void initsystem(void) /初始化dsp内核寄存器eallow;/解除寄存器保护sysctrlregs.wdcr=ox00af;/配置看门狗/ox00e8 禁止看门狗,预定标系数prescaler=1 /ox00af 不禁止看门狗,预定标系数prescaler=64sysctrlregs.scsr=0;/看门狗产生复位sysctrlregs.pllcr.bit.div=10;/配置处理器锁相环,倍频系数为5sysctrlregs.hispcp.all=ox1;/ 配置高速外设时钟分频系数为2sysctrlregs.lospcp.all=ox2;/ 配置低速外设时钟分频系数为4/设置使用的外设时钟/一般不使用的外设时钟禁止,降低系统功能sysctrlregs.pclkcr.bit.evaenclk=0;sysctrlregs.pclkcr.bit.evbenclk=0;sysctrlregs.pclkcr.bit.sciaenclk=1;/使能sci模块的时钟sysctrlregs.pclkcr.bit.scibenclk=1;sysctrlregs.pclkcr.bit.mcbspenclk=0;sysctrlregs.pclkcr.bit.spienclk=1;sysctrlregs.pclkcr.bit.ecanenclk=0;sysctrlregs.pclkcr.bit.adcenclk=0;edis;/ 使能寄存器保护void sci_init(void)sciaregs.sciccr.all=ox0007;/1bit停止位 无循环模式/无极性,字符长度:8bit/异步模式,空闲线协议sciaregs.scictl1.all=ox0003;/使能tx、rx、内部sciclk/rx err、sleep、txwakesciaregs.scihbaud=4878;/波特率:9600(lspclk=37.5mhz)sciaregs.scilbaud=487&ox00ff;sciaregs.scictl2.bit.txintena=1;/使能sci发送中断sciaregs.scictl2.bit.rxbkintena=1;/使能sci接收中断sciaregs.scifftx.all=oxe060; /bit15=1:退出复位/bit14=1:使fifo增强模式/bit13=1:使能tx fifo操作/bit6=1:clr txefint-标志/bit5=1:使能tx fifo 匹配/bit40:如果tx fifo=0,产生tx_isr中断sciaregs.sciffrx.all=oxe065;/rx中断级设置为5sciaregs.scictli.all=ox0023;/使sci退出复位/sci_a发送中断服务程序/发送字符串messageinterrupt void sci_tx_isr(void)int i;for(i=0;i16;i+)sciaregs.scitxbuf= messagei;/重新初始化pie,为sci_a tx准备接收下一次中断piectrlregs.pieack.all=ox0100;/响应中断(4)上位机程序如下:using system;using system.collections.generic;using system.componentmodel;using system.data;using system.drawing;using system.text;using system.windows.forms;using system.io;using system.io.ports;namespace weuduceliang public partial class form1 : form string serialreadstring, ss, cc, string1; int i = 0; public form1() initializecomponent(); timer1.interval =1;/设置timer控件时间间隔 timer1.enabled = false; serialport1.databits = 8; serialport1.stopbits = system.io.ports.stopbits.one; serialport1.readbuffersize = 500000; serialport1.rtsenable = true; /如果是rs232转rs485,此句必须要,否则不能通讯 serialport1.newline = rn; private void button1_click(object sender, eventargs e) if (button1.text = 打开串口) if (!serialport1.isopen) /如果串口是关闭的 /设定串口信息和波特率 serialport1.portname = bobox1.selecteditem.tostring(); serialport1.baudrate = convert.toint32(bobox2.selecteditem.tostring(); serialport1.parity = parity.none; serialport1.databits = convert.toint16(bobox4.selecteditem.tostring(); serialport1.stopbits = stopbits.one; try serialport1.open(); /打开串口 button1.text = 关闭串口; /改变按钮上的字符 combobox1.enabled = false; combobox2.enabled = false; combobox3.enabled = false; combobox4.enabled = false; combobox5.enabled = false; catch messagebox.show(串口打开失败!n可能是串口已被占用!); else /如果串口是打开的 serialport1.close(); /关闭串口 button1.text = 打开串口; /改变按钮上的字符 combobox1.enabled = true; combobox2.enabled = true; combobox3.enabled = true; combobox4.enabled = true; combobox5.enabled = true; else serialport1.close(); serialport1.dispose(); /关闭串口 button1.text = 打开串口; /改变按钮上的字符 combobox1.enabled = true; combobox2.enabled = true; combobox3.enabled = true; combobox4.enabled = true; combobox5.enabled = true; btncj.enabled = true; button4.enabled = false; private void btncj_click(object sender, eventargs e) try if (serialport1.isopen) btncj.enabled = false; button4.enabled = true; serialreadstring = serialport1_datareceived1(); if (serialreadstring != &(serialreadstring != cc| textbox1.text = ) textbox1.appendtext(时间: + datetime.now.tostring() + 温度: + serialreadstring + + rn); cc = serialreadstring; timer1.start(); else messagebox.show(串口未打开请先打开串口!); catch/抛出异常 messagebox.show(没找到设备); serialport1.close(); serialport1.dispose(); private void button4_click1(object sender, eventargs e) timer1.stop(); button4.enabled = false; btncj.enabled = true; string1 = ; /serialport1.close(); /serialport1.dispose(); private void button2_click(object sender, eventargs e) /清除listbox控件中的内容 textbox1.text = ; private void button3_click(object sender, eventargs e) /保存温度数据 system.io.filestream objfile; savefiledialog1.showdialog(); if (savefiledialog1.filename != null) objfile = system.io.file.create(savefiledialog1.filename); objfile.close(); objfile.close(); objfile.dispose(); system.io.streamwriter objfiles = new streamwriter(savefiledialog1.filename); objfiles.write(textbox1.text); objfiles.close(); objfiles.dispose(); else messagebox.show(路径不可为空!); private void timer1_tick(object sender, eventargs e) serialreadstring = serialport1_datareceived1(); if (serialreadstring != & (serialreadstring != cc | textbox1.text = ) textbox1.appendtext(时间: + datetime.now.tostring() + 温度: + serialreadstring + + rn); cc = serialreadstring; serialreadstring = ; else /textbox1.appendtext(时间: + datetime.now.tostring() + 温度: + cc + + rn); / / 接收信息 / / 存储接收的信息 / 缓冲区数组中开始写入的偏移量 / 要读取的字节数 / 串行口 / public bool receivedata(byte data, int offset, int count, serialport serialport) if (serialport1.isopen) try serialport1.read(data, offset, count); return true; catch return false; else return false; private void combobox1_selectedindexchanged(object sender, eventargs e) this.serialport1.portname = bobox1.selecteditem.tostring(); private void combobox2_selectedindexchanged(object sender, eventargs e) this.serialport1.baudrate = convert.toint32(bobox2.selecteditem); private void combobox3_selectedindexchanged(object sender, eventargs e) switch (bobox3.selecteditem.tostring() case none: this.serialport1.parity = parity.none; break; case even: this.serialport1.parity = parity.even; break; case odd: this.serialport1.p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论