基于DSP的输出电压范围可调的高精度毫伏信号发生器设计内附完整程序解读文档格式.docx
《基于DSP的输出电压范围可调的高精度毫伏信号发生器设计内附完整程序解读文档格式.docx》由会员分享,可在线阅读,更多相关《基于DSP的输出电压范围可调的高精度毫伏信号发生器设计内附完整程序解读文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
![基于DSP的输出电压范围可调的高精度毫伏信号发生器设计内附完整程序解读文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/29/85fa1f23-0aab-4e5f-86eb-e5154cc7f8c6/85fa1f23-0aab-4e5f-86eb-e5154cc7f8c61.gif)
1.2基本要求
(1)输出电压:
范围0~+1V,步进0.5mV;
具有输出电压值(测量值)显示功能;
由“+”、
“-”两键分别控制输出电压步进增减;
(2)具备485通讯能力,波特率可设置,即4800、9600、19200、38400、56000、57600、
115200bps可设置;
(3)能显示设定值与实际值及其误差。
1.3发挥部分
范围0~+2V,步进0.1mV;
指定输出范围内任意电压值;
(2)能提高精度模拟J型热电偶分度简表(见附表)输出(输入温度后,自动输出电压值);
(3)检测部分可单独成为电压测量模块,测量范围、精度参考电压输出部分;
2、系统方案论证
用DSP作为核心芯片,输出的数字信号由D/A转换成模拟信号,再经由A/D采回芯片内部形成反馈。
利用LM4050提供基准电压,7809稳定基准电压源的输出电压,UA741做电压跟随器使其工作稳定。
为了使其工作更加精确,需要再加一个AD820作为比较器来减小非线性误差。
而与单片机相比,DSP器件具有较高的集成度。
DSP具有更快的CPU,更大容量的存储器,内置有波特率发生器和FIFO缓冲器。
提供高速、同步串口和标准异步串口。
有的片内集成了A/D和采样/保持电路,可提供PWM输出。
DSP器件采用改进的哈佛结构,具有独立的程序和数据空间,允许同时存取程序和数据。
内置高速的硬件乘法器,增强的多级流水线,使DSP器件具有高速的数据运算能力。
DSP器件比16位单片机单指令执行时间快8~10倍,完成一次乘加运算快16~30倍。
3、系统设计与理论分析
3.1核心模块TMS320DSP芯片
DSP是一种独特的微处理器,是以数字信号来处理大量信息的器件。
其工作原理是接收模拟信号,转换为0或1的数字信号。
再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。
DSP微处理器一般具有如下主要特点:
(1)在一个指令周期内可完成一次乘法和一次加法;
(2)程序和数据空间分开,可以同时访问指令和数据;
(3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;
(4)具有低开销或无开销循环及跳转的硬件支持;
(5)快速的中断处理和硬件I/O支持;
(6)具有在单周期内操作的多个硬件地址产生器;
(7)可以并行执行多个操作;
(8)支持流水线操作,使取指、译码和执行等操作可以重叠执行。
3.2数模转换模块
3.2.1D/A转换电路如图所示,通过AD5541芯片实现将数字量转换为模拟量,送给电压比较器。
该电路通过LM4050提供基准电压源,UA741做电压跟随器,使电压稳定。
AD820作为比较器,正端接D/A输出,负端接地,反馈输出接AD采样,失调电压调零,输出形成闭环回路,减少由运放产生的非线性误差,由DSP进行运算。
算法:
输出值=(D/65535)*REF,其中D为载入DAC代码。
D/A转换电路
3.2.2AD5541芯片
AD5541为单通道、16位、串行输入、电压输出数模转换器(DAC),采用5V±
10%单电源供电。
AD5541采用多功能三线式接口,并且与SPI、QSPI™、MICROWIRE™、DSP接口标准兼容。
这些DAC可提供16位性能,无需进行任何调整。
DAC输出不经过缓冲,可降低功耗,并减少输出缓冲所造成的失调误差。
3.3基准电压源模块
3.3.1LM4050芯片
LM4050/是精密的二端、并联模式、带隙电压基准,具有多种固定反向击穿电压:
1.225V、2.048V、2.500V、3.000V、3.3V、4.096V和5.000V。
LM4050/LM4051采用超小型、3引脚SC70表贴封装(1.8mmx1.8mm),比采用SOT23表贴封装的同类器件缩小了50%。
如图所示电路,即为基准电压电路,它为A/D模块,D/A模块提供稳定的基准电压。
对电路稳定性起着至关重要的作用。
基准电压模块电路
3.3.2UA741芯片
如图所示,UA741是高增益运算放大器这类单片硅集成电路器。
件提供输出短路保护和闭锁自由运作。
这些类型还具有广泛的共同模式,差模信号范围和低失调电压调零能力与使用适当的电位。
1和5为偏置(调零端),2为正向输入端,3为反向输入端,4接地,6为输出,7接电源8空脚
3.4模数转换模块
3.4.1ADS8320芯片
AD8320其特点及功能:
ADS8320是Burr-Brown公司生产的逐次逼近式串行16位微功耗CMOS型高速A/D转换器,它的线性度为±
0.05%,工作电源在2.7V~5.25V范围内,采样频率最高可达100kHz;
在2.7V供电和100kHz采样速率下,其功耗仅为1.8mW,而在10kHz低速采样时的功耗仅为0.3mW;
在非转换状态时可处于关闭模式,此时功耗可低至100μW;
ADS8320具有同步串行SPI/SSI接口,因而占用微处理器的端口较少;
其差动输入信号范围为500mV~VCC(工作电源);
采用8引脚MSOP小体积封装
送入DSP芯片的数值=(输入的模拟值/REF)*65535
A/D转换电路
3.4.2AD820芯片
AD820是一款精密、低功耗、FET输入运算放大器,可以采用5V至36V单电源或±
2.5V至±
18V双电源供电。
该放大器具有单电源供电能力,输入电压范围可扩展至负供电轨以下,因此在单电源模式下可以处理地电压以下的输入信号。
输出电压摆幅可扩展至各供电轨10mV以内,以提供最大的输出动态范围。
直流精度性能包括最大800μV的失调电压、2μV/°
C的失调电压漂移、小于25pA的典型输入偏置电流以及低输入电压噪声,源阻抗最高可达1GΩ。
单位增益带宽为1.8MHz,10kHz时总谐波失真(THD)为−93dB,压摆率为3V/μs,电源电流低至800μA。
AD820可直接驱动最高350pF的容性负载,并可提供最低15mA的输出电流。
因此,该放大器能够处理各种负载情况。
AD820在A/D转换电路中有电压跟随器的作用。
3.5485通信模块
3.5.1max485芯片
MAX485是用于RS-485与RS-422通信的低功耗收发器。
MAX485的驱动器摆率不受限制,可以实现最高2.5Mbps的传输速率。
这些收发器在驱动器禁用的空载或满载状态下,吸取的电源电流在120μA至500μA之间。
所有器件都工作在5V单电源下。
驱动器具有短路电流限制,并可以通过热关断电路将驱动器输出置为高阻状态。
接收器输入具有失效保护特性,当输入开路时,可以确保逻辑高电平输出。
具有较高的抗干扰性能。
MAX485是市面上最为常见的RS422芯片,亦是用量最大的RS422芯片,性价比高,优质,供货稳定是大部分厂家采用 MAX485接口芯片是Maxim公司的一种RS-485芯片。
MAX485芯片的结构和引脚都非常简单,内部含有一个驱动器和接收器。
RO和DI端分别为接收器的输出和驱动器的输入端,与单片机连接时只需分别与单片机的RXD和TXD相连即可;
/RE和DE端分别为接收和发送的使能端,当/RE为逻辑0时,器件处于接收状态;
当DE为逻辑1时,器件处于发送状态,因为MAX485工作在半双工状态,所以只需用单片机的一个管脚控制这两个引脚即可;
A端和B端分别为接收和发送的差分信号端,当A引脚的电平高于B时,代表发送的数据为1;
当A的电平低于B端时,代表发送的数据为0。
在与单片机连接时接线非常简单。
只需要一个信号控制MAX485的接收和发送即可。
同时将A和B端之间加匹配电阻,一般可选100Ω的电阻。
MAX引脚(管脚)图及工作电路
3.5.2MAX232芯片
第一部分是电荷泵电路。
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;
DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
第三部分是供电。
15脚GND、16脚VCC(+5v)。
3.5.3485串口通信电路
串口电路
3.6显示模块
显示电路采用12864液晶屏,该点阵的屏显成本相对较低,适用于各类仪器,小型设备的
显示领域。
液晶屏连线方式
4、系统调试
4.1调试仪器仪表
仪器名称
型号
数量
双通道示波器
RIG—OL
1
数字万用表
UT52
4.2调试及分析
首先,把DA和AD的基准电压源调到两伏,然后满量程输出的值就应该是2伏,而实际上我们得到的是1.89伏,原因是因为DA的输出有漂移,DSP把数字信号送给DA5541,DA输出模拟信号,经过ADS8320输出模拟信号,整个过程,为了使输出的电压更加稳定,加入了AD820作为电压跟随器,利用它的输入阻抗高,输出阻抗低的特点,同时通过减法器使实测电压缓慢的接近输入电压值,通过验证,AD采回的数值偏高,这样我们又加入ua741电压跟随器来调整基准电压的输出,最后调整到输入电压值和实测电压值偏差接近0.2毫伏之内,最后把基准电压确定在2.0伏,然后通过万用表和示波器测量出AD样值和AD的输出值通过LCD12864液晶屏将输入电压和实测电压显示出来,误差接近0.1毫伏,通过按键调整波特率,同时使输入电压步进0.1毫伏,这样反复通过AD820减法器使实测电压值接近输入值,这样就达到了本实验的要求和目的。
4.3误差分析
造成误差的原因有
(1)零点漂移:
由于运算放大器的零点漂移,温度漂移等带来的误差,可以通过温度补偿措施来解决此误差。
(2)A/D,D/A转换误差:
受AD转换器精度及基准源稳定程度的限制,不可避免地带来一定的误差。
为了更精确的输出电源电压,选用更多位数的AD,DA芯片。
(3)因外界突发干扰或仪表显示值等引起的随机误差或粗大误差。
(4)采样电阻自热效应引起的误差:
由于电阻在温度上升时阻值会发生变化,因此会引起温
度飘移,给系统带来测量的误差。
5、设计总结
直流毫伏信号发生器可以实现如下功能:
由“+”、“-”两键分别控制输出电压步进增减;
(2)具备485通讯能力,波特率可设置,即4800、9600、19200、38400、56000、57600、115200bps可设置;
本设计制作完成了题目要求的基本部分的全部要求和发挥部分的大部分要求,而且部分功能大大高于发挥部分的要求。
目前,在电子仪器,设备中经常要用到直流毫伏信号发生器,有时要求应具有良好的稳定性,而且精度较高。
该设计完全符合了这些要求,如果再经过结构优化,将具有良好的市场前景。
通过本次电子设计大赛的学习,对DSP的应用有了基本的了解,对DSP软件编程及调试有了基本的掌握。
这对我们来说是一个质的提高。
在本次设计大赛的过程中,我们的团队精神体现了重要的作用。
6、元件清单
TMS320F2812PGF芯片一片
AD5541芯片一片
12864液晶屏一块
LM4050芯片一片
AD820芯片二片
ADS8320芯片一片
UA741芯片一片
MAX485芯片一片
MAX232芯片一片
胆电容一个
开关四个
三端稳压器7805,AS2830各一片
电阻,电容,导线若干
7、参考文献:
[1]全国大学生电子设计设计竞赛组委员会.全国大学生电子设计竞赛训练教程[M].北京电子工业出版社,2005年
[2]全国大学生电子设计设计竞赛组委员会.全国大学生电子设计竞赛获奖作品汇编(第一届~第五届)[M].北京理工大学出版社,2004年
[3]模拟电子技术基础.童诗白,华成英主编
[4]现代电力电子器件原理与应用.机械工业出版社
[5]TMS320x28xxx原理与开发.苏奎峰编
8、程序清单
//BUSLCD
#include"
DSP281x_Device.h"
//DSP281xHeaderfileIncludeFile
DSP281x_Examples.h"
//DSP281xExamplesIncludeFile
LED.C"
//****************************************************
//定义区
unsignedintvalue;
unsignedcharADVAL[8]={'
x'
'
.'
\0'
};
unsignedcharADVAL_err[8]={'
0'
'
unsignedintkey=0x4E20;
unsignedcharkey_baud=0x00;
unsignedintkey_value=0x0000;
charkey_false=0x00;
#defineAVG10//Averagesamplelimit
#defineBUF_SIZE10//Samplebuffersize
Uint16Sample_AD=0x0000;
Uint16SampleTable[BUF_SIZE];
Uint32Sample=0,Sample_AVG=0;
//SCI发送接收数据中间变量
Uint16sdataB[16];
//SenddataforSCI-A
Uint16rdataB[8];
//ReceiveddataforSCI-A
Uint16rdata_pointB;
//Usedforcheckingthereceiveddata
unsignedcharbaud_disp[8]={'
4'
8'
unsignedcharbaud_disp1[8]={'
9'
6'
unsignedcharbaud_disp2[8]={'
1'
2'
unsignedcharbaud_disp3[8]={'
3'
unsignedcharbaud_disp4[8]={'
5'
unsignedcharbaud_disp5[8]={'
7'
unsignedcharbaud_disp6[8]={'
unsignedcharnumber_tab[]={'
//***********************************************
//波特率设定首位高字节,二位低字节
//SCI_PRD[14]={4800,9600,19200,38400,56000,57600,115200};
unsignedcharSCI_PRD[14]={0x03,0xCF,0x01,0xE7,0x00,0xF3,0x00,0x79,0x00,0x52,0x00,0x50,0x00,0x27};
voidinitlcm(void);
//初始化LCM
voidsendCMD(chardat);
//写控制指令
voidsendDAT(chardat);
//写显示数据;
也可以写一个单字节字符
voiddisplay(charx_add,chardat,chardat1);
//写汉字到LCD屏指定位置
voiddelay(unsignedintt);
//SCI函数声明FIFO模式
interruptvoidscibTxFifoIsr(void);
interruptvoidscibRxFifoIsr(void);
interruptvoidcpu_timer0_isr(void);
voidscib_fifo_init(void);
voiddelay_ad(void);
Uint16spi_data=0x0000;
//senddata
voiddelay_loop(void);
voidspi_xmit(Uint16a);
voidspi_fifo_init(void);
voidspi_init(void);
voiderror(void);
//发送半角数字和字母字符串
//*p为字符串指针
//amount所发送字符串的最大数量
voidchar_string(unsignedchar*p,unsignedcharamount);
unsignedchartitle[]={"
输入电压"
//标题
unsignedchartitle1[]={"
实测电压"
unsignedchartitle2[]={"
输入波特率"
unsignedchartitle3[]={"
实际偏差"
///////////////////////////////////////////////
voiddelay(unsignedintt)
{
while(t>
0)
t--;
}
//**************************************************
voidsendBYTE(chardat)//串行传送一字节数据
{
chari;
GpioMuxRegs.GPBDIR.all|=SID;
for(i=0;
i<
8;
i++)
{
delay(1000);
GpioDataRegs.GPBDAT.all&
=~SCK;
//SCK=0
if((dat&
0x80)!
=0)
GpioDataRegs.GPBDAT.all|=SID;
//SID=1