lajilaji110 发表于 2015-4-23 22:57:31

DSP之信号采集

信号采集类的外设包括采集模拟信号的模/数转换器和提供数字信号输入、输出功能的通用输入/输出接口。模/数转换器为DSP提供了多通道模拟/数字转换能力,通用输入、输出接口可以完成数字信号的采集,当其被设置为输出模式时,可以通过这些接口对其他设备进行控制。


1 模数转换器(ADC)

TMS320C5509内部集成了一个10位的连续逼近式ADC.
1.1 模数转换器结构和时序
      在数字信号处理器的具体应用中往往需要采集一些模拟信号量,如电池电压、面板旋钮输入值等,模数转换器就是用来将这些模拟量转化为数字量来供DSP使用。DSP所提供的模数转换器一次转换可以在四路输入中任选一路进行采样,采样结果为十位,最高采样速率为21.5kHz。
http://my.csdn.net/uploads/201208/15/1345022196_5797.jpg
      模数转换器采用连续逼近式结构,在模数转换器内部用了三个可编程分频器来灵活地产生用户需要的采样率。
      整个模数转换过程分为两个周期——采样/保持周期及转换周期,如下图所示。
http://my.csdn.net/uploads/201208/15/1345022259_2859.jpg
采样/保持周期是采样/保持电路采集模拟信号的时间,这个周期大于或等于40μs;
转换周期是阻容比较网络在一次采样中完成逼近处理并输出A/D转换结果的时间,这需要13个转换时钟周期。内部转换时钟的最大频率为2MHz。


模数转换主时钟:
ADC Clock = (System Clock) / (SystemClkDiv + 1) ;
模数转换时钟:
ADC Conversion Clock =
      (ADC Clock) / (2× (ConvRateDiv + 1))

模数转换时钟必须等于或小于2 MHz;
         模数采样/保持周期:
ADC Sample and Hold Period =
(1 / (ADC Clock)) / (2× (ConvRateDiv+ 1 + SampTimeDiv))

模数采样/保持周期必须大于等于 40μs      整个转化周期:
ADC Total Conversion Time =       (ADC Sample and Hold Period) + (13× (1 / (ADC Conversion   Clock)))      应当注意的是模数转换器不能工作于连续模式下,每次开始转换前,DSP必须将模数转换控制寄存器(ADCR)的ADCStart位置1,来命令模数转换器开始转换。当开始转换后,DSP必须通过查询模数转换数据寄存器(ADDR)的ADCBusy位来确定采样是否结束。当ADCBusy位从1变为0时标志转换完成,采样数据已经被存放在数模转换器的数据寄存器中。1.2 模数转换器的寄存器
模数转换器的寄存器包括控制寄存器(ADCR)、数据寄存器(ADDR)、时钟分频寄存器(ADCDR)和时钟控制寄存器(ADCCR)

在模数转换开始之前需要对模数转换控制寄存器进行设置,选择所要采集的通道,并通过将ADCStart位设置为1命令转换开始。

接下来给出一个设置模数转换器的例子,在该例子中DSP系统主时钟为144MHz。
(1)首先对系统主时钟分频,产生模数转换器时钟,该时钟应尽量运行在较低频率下,以降低功率消耗,在本例中模数转换器时钟是通过对系统主时钟36分频产生的,则此时模数转换时钟=144MHz/36=4MHz,根据公式
            ADC Clock= (System Clock) / (SystemClkDiv+ 1)
            得出SystemClkDiv=35;
(2)对模数转换器时钟分频产生模数转换时钟,该时钟最大值为2MHz,为了获得2MHz的模数转换时钟,则需要对模数转换器时钟2分频,由
         ADC转换时钟= (ADC Clock) / (2×(ConvRateDiv+ 1))
          得出ConvRateDiv=0
          ADC 转换时间= 13 ×(1 /ADC Conversion Clock)
          ADC 转换时间 = 13 × (1 / (2 MHz)) = 6.5μs;

(3)对采样和保持时间进行设置,这个值必须大于40μs
                     ADC采样和保持时间=
                     (1 / (ADC Clock)) / (2×(ConvRateDiv + 1 + SampTimeDiv))
                     = (1 / (4 MHz)) / (2×(0 + 1 + SampTimeDiv))
                     = 250 ns× (2×(0 + 1 + 79)) = 40μs
                     SampTimeDiv=79;
(4)整个转换时间为40μs的采样和保持时间加上6.5μs的转换时间等于46.5μs,采样率=1/46.5μs =21.5 kHz。


1.3使用方法及实例
          C55x芯片支持库为模数转换器提供了相应的函数,应用这些函数可以对模数转换器进行配置、读取采样数据。使用片支持函数与直接用汇编语言对外设操作相比,片支持函数采用标准模式对外围设备进行编程,而汇编语言对外设操作没有统一的模式,需要对不同的外设采用不同的编程方式;片支持函数可以用open和close函数控制外设资源,这样对操作多通道外设更加有利;片支持函数采用完整的符号描述所有外设寄存器和寄存器字段,而不是只针对特定的器件,更加有利于硬件升级时代码的继承性。        使用模数转换器片支持库首先要在头文件中包含csl_adc.h文件,接下来就可以调用模数转换库函数了。用片支持库配置模数转换器有两种方式——以寄存器为基础的配置和以参数为基础的配置方式,首先介绍以寄存器为基础的配置方式:
      以寄存器为基础的配置方式首先要声明ADC配置结构,具体声明如下:

ADC_Config Config = {
0x0000, /* ADCR ,对0通道采样*/
0x0023, /* ADCCR ,SystemClkDiv=35 */
0x4F00/* ADCDR ,SampTimeDiv=79,ConvRateDiv=0*/
}


接下来运行配置函数:

ADC_config(&Config);
以参数为基础的配置方式通过ADC_setFreq函数进行,该函数定义如下:
void ADC_setFreq(int cpuclkdiv, //数值范围0-255int convratediv, //数值范围0-16int sampletimediv); //数值范围0-255
接着给出调用的例子:
int i=35,j=0,k=79;ADC_setFreq(i,j,k);配置好模数转换器后就可以用ADC_read函数完成采样过程,下面给出例子:

int channel=0,samplenumber=3;
Uint16 samplestorage={0,0,0};
ADC_read(channel,samplestorage,samplenumber);
/* 对模拟输入0通道进行3次采样, */
/* 采样的结果放在samplestorage数组中 */


2 通用输入/输出端口GPIO


1 GPIO口概述
      TMS320VC5510提供了8个专门的通用输入/输出引脚IO0~IO7,每个引脚的方向可以由I/O方向寄存器IODIR独立地配置,引脚上的输入/输出逻辑状态由I/O数据寄存器IODATA反映,见下表。
GPIO方向寄存器IODIR
位字    段数    值说    明15~8Reserved
保留位7~0IOxDIR*
0
1
IOx方向控制位
IOx配置为输入
IOx配置为输出
GPIO数据寄存器IODATA
位 字    段数    值说    明15~8Reserved
保留位7~0IOxD*
0
1
IOx逻辑状态位
IOx引脚上的信号为低电平
IOx引脚上的信号为高电平

2 上电模式设定

C55x系列DSP通用输入/输出端口的另一个作用是在DSP上电时通过测试这些端口的高低电平来决定上电引导模式。      以TMS320VC5510为例,其IO1~IO3引脚的另一个功能是BOOTM0~BOOTM2,它们和BOOTM3引脚通过上下拉方式决定如何引导,接下来给出了C5510的引导方式。
C5510的引导方式BOOTM引导方式0000无0001从McBSP0口用24位地址采用SPI模式引导(串行EEROM)0010~0111保留1000无1001从McBSP0口用16位地址采用SPI模式引导(串行EEROM)1010通过并行EMIF接口从外部8比特异步存储器引导1011通过并行EMIF接口从外部16比特异步存储器引导1100通过并行EMIF接口从外部32比特异步存储器引导1101EHPI口引导1110从McBSP0口采用16比特标准串行模式引导1111从McBSP0口采用8比特标准串行模式引导下面给出了通过GPIO口设置上电方式的示意图。http://my.csdn.net/uploads/201208/16/1345078980_5234.jpg
3 驱动程序开发
应用通用输入/输出口(GPIO)芯片支持函数需要在头文件包含csl_gpio.h文件。
      输入/输出口(GPIO)芯片支持函数包括读GPIO寄存器函数和写GPIO寄存器函数,首先介绍读GPIO寄存器函数GPIO_RGET()。该函数有一个输入参数,这个参数是IODIR时读取GPIO方向寄存器,参数为IODATA读取GPIO数据寄存器。下面给出读取GPIO数据寄存器的例子:
int iodata;
iodata = GPIO_RGET(IODATA);
GPIO_RSET()的功能是设置GPIO寄存器,该函数有两个参数,第一个参数决定设置的那个寄存器,第二个参数为寄存器值。举例如下:

GPIO_RSET(IODIR, iodata);

4通用输入/输出GPIO的测试
GPIO作为通用的输入/输出端口,其方向通过I/O方向寄存器IODIR可以设置,并且引脚上的电平通过I/O数据寄存器IODATA来反映,CPU和DMA控制器可以在I/O空间访问这两个寄存器。
       GPIO的测试分为输入口测试和输出口测试两种。
1.输入口测试

输入口测试步骤如下:(1)通过I/O方向寄存器IODIR设置某一个引脚为输入方向;
(2)在已设置为输入方向的引脚上外加LVTTL信号;(3)DSP访问I/O数据寄存器IODATA,查看引脚上的逻辑电平,与外加LVTTL电平进行比较,来检测输入口是否工作正常。
2.输出口测试

输出口测试步骤如下:(1)通过I/O方向寄存器IODIR设置某一个引脚为输出方向;
(2)在I/O数据寄存器IODATA上设置这个引脚的逻辑电平;(3)测量引脚的电平,与设置的逻辑电平相比较来检测输出口是否正常工作。

tom_man2008 发表于 2015-7-21 06:27:56

LZ辛苦了,分析得这么全面清晰,赞!
页: [1]
查看完整版本: DSP之信号采集