搜索
您的当前位置:首页DSP课程设计:AD+SCI

DSP课程设计:AD+SCI

时间:2024-05-21 来源:飒榕旅游知识分享网


深圳大学考试答题纸

(以论文、报告等形式考核专用) 二○一四~二○一五学年度第 1 学期 课程

编号

名称

/DSP技术实践

专业

学号

姓名

年级

教师

课程

单片机/ARM

主讲

教师评语: 题

基于DSP2812的课程设计

目:

一、实验要求

由外接的信号发生器产生一正弦信号(电压范围:0~3V),通过DSP的AD功能对此正弦信号进行采集,通过DSP的SCI功能与PC机之间进行通信,把所采集的AD信号发送至PC机端,在超级终端上进行实时显示。

二、实验原理 2.1 ADC概述

ADC,即模/数转换器,将模拟量转换成数字量,提供给控制器使用。TMS320F2812片上有一个12位分辨率、具有流水线结构的模/数转换器,其机构框图如图1所示。其前端为2个8选1多路切换器和2路同时采样/保持器,构成16个模拟输入通道,模拟通道的切换由硬件自动控制,并将各模拟通道的转换结果顺序存入16个结果寄存器中。

图1 ADC机构框图

2.2 ADC模块特点

(1)带2个8选1多路切换器和双采样/保持器的12位的ADC,共有16个模拟输入通道;

(2)模拟量输入范围:0.0V-3.0V;

(3)转换率:在25MHZ的ADC时钟下为80ns; (4)转换结果存储在16个结果存储器中;

(5)转换结果=4095*(输入的模拟信号-ADCLO)/3; (6)多种A/D触发方式:软件启动、EVA和EVB;

(7)灵活中断方式:可以在每次转换结束或每隔一次转换结束触发中断; 3.ADC转换步骤 (1)初始化DSP系统; (2)设置PIE中断矢量表; (3)初始化ADC模块;

(4)将ADC中断的入口地址装入PIE中断矢量表中,开中断; (5)软件启动ADC转换; (6)等待ADC中断;

(7)在ADC中断中读取ADC转换结果,软件启动下一次ADC中断。

三、实验实现 3.1硬件方案设计

本实验以TMS320F2812为核心控制部件,利用软件编程,通过ADC模块对试验箱上的信号发生器发出的正弦信号进行采集,由于试验箱上的信号发生器只能调节到2V,所以此次实验只针对2V的正弦信号,再通过串口线与PC机连接,将采集转换的数字信号传送到PC机端的串口助手,并还原成采集时的电压值。硬件框架图如图2所示。本次ADC采用SEED-DEC2812的AD接口的ADCINA6通道。

图2 硬件框架图

3.2软件设计

程序主体沿用AD采样例程,用定时器产生中断,在中断程序中对电压信号进行AD转换并将转换值通过串口发送到电脑,在电脑上用串口助手对采样值进行实时显示。

主要工作:是在AD程序的基础上初始化串口、修改中断程序及更改采样率、波特率参数 。程序要解决问题:

1、 采样值的转换

2、 采样率及波特率的设置

串口初始化程序可以直接使用SCI例程中的初始化程序,下面只介绍中断程序设计及采样率、波特率参数设置 中断程序设计

在中断程序中对电压信号进行采集,然后将采集到的12位有效值转换成实际电压值,取电压值的三位有效数字以字符形式用串口发送,这里要注意的是AD采集的12位有效数字在寄存器中是靠左放置的,需要右移四位后才能对其转换。

图3 中断程序图

SCI波特率设置

SCI波特率的大小决定串口能每秒传送的数据多少,若太小则会限制采样率,本实验选择串口助手的最大波特率115200b/s,则:

1、每秒理论上能传送的字节数:115200/10=11520B 2、波特值BRR由公式

SCI波特率LSPCLK(37.5M)(BRR1)8可得BRR=40,在串口初始化程序中设置SciaRegs.SCILBAUD = 0x28,可以把波特率设置成115200 b/s。

图4 串口初始化程序图

采样率设置

采样率受波特率和信号频率两方面控制

11520B23041、115200b/s波特率下最大采样率为 52、信号频率为100HZ,根据采样定理采样率要大于2 fs综合考虑设采样率为1000HZ在单位周期内采样十次,采样率可以通过在主程序中ConfigCpuTimer(&CpuTimer2, 150, 1000) 设置,通过设置周期值(1000us)可以确定采样率1000。

图4 部分主程序程序图

3.3软件调试

软件调试是通过对程序的编译、连接、执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。本设计的软件调试使用CCS3.3测试软件进行调试,即可看到正确的测试结果,从而最终实现利用ADC采集正弦信号。

四、实验结果分析

1.实验箱的信号发生器上的设置如图5所示。

图5 信号发生器设置

2.PC端上串口助手显示接收的数据,如图6所示。

图6 串口调试助手界面

3.采用matlab对上图的数据进行绘图,如图7所示,横坐标为时间/s,y轴为幅值,图中可以较直观的显示出经AD采集到的正弦信号发送到PC机上也是正弦信号的数据。

图7 MATLAB绘制图

五、实验结论

通过本次实验我们掌握DSP芯片功能及其在实际中的应用方法,对于DSP基础知识的了解。学习到了很过关于DSPAD模块和SCI的知识,并且更加巩固和掌握了课堂上所学的课本知识,是自己对DSP技术有了更进一步的认识和了解。本实验是由实验箱的信号发生器产生一正弦信号(电压范围:0~2V),通过DSP的AD功能对此正弦信号进行采集,通过DSP的SCI功能与PC机之间进行通信,把所采集的AD信号发送至PC机端,在超级终端上进行实时显示。本实验最终达到了实验要求,实现了电压值的实时显示。

附录

实验代码如下所示: #include #include \"DSP28_Device.h\" #include \"comm.h\"

/////////////////////////////////////////////////////////////////// #define SAMPLERATE 1

unsignedintuart_sendtype ; unsignedintSampleRate; unsignedintSampleLong=1024; /////////////////// unsignedinti,j;

unsignedintAd_data[10]={0}; char send[5]={0}; float results=0; float temp=0; //////////////////

unsignedintconvcount = 0; volatile unsigned intadconvover =0;

// Prototype statements for functions found within this file. interrupt void ISRTimer2(void); interrupt void ad(void); void main(void) {

/*初始化系统*/ InitSysCtrl();

#if SAMPLERATE==1

SampleRate =ADSAMPL8K;

#endif /*关中断*/ DINT; IER = 0x0000; IFR = 0x0000; /*初始化PIE中断*/ InitPieCtrl();

/*初始化PIE中断矢量表*/ InitPieVectTable();

//初始化cputimer InitCpuTimers(); InitSci();

/*设置中断服务程序入口地址*/ EALLOW;

// This is needed to write to EALLOW protected registers

PieVectTable.TINT2 = &ISRTimer2; PieVectTable.ADCINT = &ad;

EDIS; // This is needed to disable write to EALLOW protected registers /*开中断*/

IER |= M_INT1;//ADC中断

EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM /*启动AD采样*/ /*AD采样率*/ adconvover=0; switch(SampleRate){ }

case ADSAMPL8K: //采样率为1k

DINT;

/*设置CPU*/

ConfigCpuTimer(&CpuTimer2, 150, 1000); StartCpuTimer2(); /*开中断*/ IER |= M_INT14; EINT; InitAdc(); SampleRate = 0; break;

default:

break;

for(;;) { }

}

interrupt void ad(void) {

IFR=0x0000;

PieCtrl.PIEACK.all=0xffff; Ad_data[0] = AdcRegs.RESULT0; temp=Ad_data[0]>>4; results=(temp/4095.0)*3.0;

results=results*100;

send[3]=(int)results%10+0x30;

results=results/10;

send[2]=(int)results%10+0x30; send[1]='.';

results=results/10; }

interrupt void ISRTimer2(void) {

send[0]=(int)results+0x30; send[4]='\\n'; for(i=0;i<5;i++) {

SciaRegs.SCITXBUF =send[i]; while(!SciaTx_Ready()); }

AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;

}

串口初始化子程序 void InitSci(void) {

// Initialize SCI-A: *UART_MODE = 0x44; EALLOW;

GpioMuxRegs.GPFMUX.all = 0x0030; EDIS;

/* loopback 8 bit data */ SciaRegs.SCICCR.all = 0x07;

SciaRegs.SCICTL1.all = 0x03; SciaRegs.SCICTL2.all = 0x03;

SciaRegs.SCIHBAUD = 0x00;

SciaRegs.SCILBAUD = 0x28;//波特率为115200b/s

SciaRegs.SCICTL1.all = 0x23; PieCtrl.PIEIER9.bit.INTx1 = 1; // PieCtrl.PIEIER9.bit.INTx2 = 1; //tbd...

// Initialize SCI-B: //tbd... }

因篇幅问题不能全部显示,请点此查看更多更全内容

热门图文

Top