3.2 F2812主要功能简介-AD转换器
- 格式:ppt
- 大小:1.37 MB
- 文档页数:38
CPU片上外设功能及接口由于F2812芯片集成了很多内科可以访问和控制外部设备,2812内核需要通过某种方式来读/写外设,为此处理器将所有的外设都映射到了数据存储空间。
每个外设被分配一段相应的地址空间,主要包括配置寄存器、输入寄存器、输出寄存器和状态寄存器。
每个外设只要通过简单的访问寄存器就可以使用该设备。
本章内容主要讨论的是对SCI、SPI、CAN、ADC进行硬件设计。
3.1 A/D转换电路的设计A/D转换是嵌入式控制器一个非常重要的单元,它提供了控制器与现实世界的连接通道,通过ADC可以检测诸如温度、湿度、压力、电流、电压、速度、加速度等模拟量。
这些信号都可以采用介于0~3V的正比于原始信号的电压信号来表示,ADC转换的目的是将这些模拟信号转换成数字信号。
A/D转换电路是数据采集模块的主要部分。
它的核心任务是完成信号的数据采集。
A/D转换电路的设计完全遵循参考文献的严格规定。
本系统的设计中选用TMS320F2812芯片的片内A/D接口实现信号的数据采集。
F2812芯片的内部ADC模块是一个12位带流水线的模数转化器。
模数转换单元的模拟电路包括前向模拟多路复用开关(MUXs)、采样/保持(S/H)电路、变换内核、电压参考和其它模拟辅助电路。
模数转化单元的数字电路包括可编程转换序列、结果寄存器、与模拟电路的接口等电路。
为满足绝大多数系统多传感器的需要,F2812的模数有16个通道,可配置为2个独立的8通道模块F2812芯片的A/D转换器是一个12位分辨率转换器,内含2个采样/保持电路,25MHz的ADC时钟频率,单通道转换时间为80ns,采样率高达12.5MHz,16个采集通道,可配置成两个独立的8通道,模拟输入范围0V~3V,4种触发方式可以启动A/D转换,具有灵活的中断控制。
输入模拟电压与采样结果的关系为:数字结果=4095×(输入模拟电压-ADCLO)/3,其中,ADCLO是提供普通的低边模拟输入管脚,接模拟地。
TMS320F2812 AD转换程序(已调试通过)/*=============================================================================== ===File name: F28XADC04U.COriginator: Digital Control Systems GroupTexas InstrumentsDescription: This file contains source for the F28X general purpose4 conversions ADC driver for unipolar signalsJoyshang=============================================================================== ======History:-------------------------------------------------------------------------------------27-02-2012 Release Rev 1.0----------------------------------------------------------------------------------*/#include "IQmathLib.h"#include "DSP28_Device.h"#include "f28xadc04u.h"#include "f28xbmsk.h"#define CPU_CLOCK_SPEED 6.6667L // for a 150MHz CPU clock speed#define ADC_usDELAY 5000L#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L)extern void DSP28x_usDelay(unsigned long Count);void F28X_adc04u_drv_init(ADCVALS *p){DELAY_US(ADC_usDELAY);AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; /* Reset the ADC Module */asm(" NOP ");asm(" NOP ");AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; /* Power up bandgap/reference circuitry */DELAY_US(ADC_usDELAY); /* Delay before powering up rest of ADC */AdcRegs.ADCTRL3.bit.ADCPWDN = 1; /* Power up rest of ADC */AdcRegs.ADCTRL3.bit.ADCCLKPS = 6; //ADCCLK=HSPCLK/[(ADCCTRL1[7]+1)]/* Set up ADCTRL3 register */DELAY_US(ADC_usDELAY);AdcRegs.ADCTRL1.all = 0x0110; /* Set up ADCTRL1 register 0x0110 级联模式*/AdcRegs.ADCTRL2.all = 0x0100; /* Set up ADCTRL2 register 0x0100 EVA 启动转换*/AdcRegs.ADCMAXCONV.bit.MAX_CONV = 3; /* Specify four conversions */AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //IUAdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x4; //地AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x8; //IVAdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0xC; //VREF1.5VEvaRegs.EXTCON.bit.EVSOCE = 1; //Enable SOCEvaRegs.GPTCONA.bit.T1TOADC = 1; /* Set up EV Trigger with Timer1 UF */}unsigned int tempz1;_iq tempz2;_iq tempz3;_iq tempz4;_iq tempz5;void F28X_adc04u_drv_read(ADCVALS *p){//int offset;//long tmp;/* Wait until ADC conversion is completed */while (AdcRegs.ADCST.bit.SEQ1_BSY == 1){};//offset = (int)(p->c1_out - 32767);tempz3 = AdcRegs.ADCRESULT0-AdcRegs.ADCRESULT1; //IU-地tempz4 = AdcRegs.ADCRESULT3-AdcRegs.ADCRESULT1; //VREF1.5V-地tempz5 = AdcRegs.ADCRESULT3-tempz4; //IU-tempz4tempz2 = (AdcRegs.ADCRESULT1 + 0x8000);/*Ibase=4,IQ14*/tempz2 = _IQmpy(_IQ(20),tempz2);tempz1 = (int)((tempz2 & 0x8000)>>15);if (tempz1==1){p->c1_out = ((long)( tempz2 + 0xFFFF0000));p->c1_out = _IQmpy(_IQ(32),p->c1_out);}else{p->c1_out = ((long)( tempz2 + 0x00000000));p->c1_out = _IQmpy(_IQ(32),p->c1_out);//IQ20}// tempz3 = AdcRegs.ADCRESULT0;//temp3 = _IQmpy(temp2,_IQ(10));/* IQ15 *///tempz3 = ((long)(AdcRegs.ADCRESULT1 - 0x5652 + 0x8022)<<16)>>10;//dat_q15 = (>>1)&0x7FFF; /* Convert result to Q15 (unipolar signal) *///tmp = (long)p->c1_gain*(long)dat_q15;// p->c1_out =AdcRegs.ADCRESULT0 - offset; //(int)(tmp>>13);//dat_q15 = (AdcRegs.ADCRESULT1>>1)&0x7FFF; /* Convert result to Q15 (unipolar signal) */// tmp = (long)p->c2_gain*(long)dat_q15;// p->c2_out = AdcRegs.ADCRESULT1 - offset;//dat_q15 = (AdcRegs.ADCRESULT2>>1)&0x7FFF; /* Convert result to Q15 (unipolar signal) *///tmp = (long)p->c3_gain*(long)dat_q15;// p->c3_out = AdcRegs.ADCRESULT2;AdcRegs.ADCTRL2.all |= 0x4040; /* reset the seq */}TMS320F2812的ADC模块用于采样过程的初始化代码void InitAdc(void) //初始化ADC模块{unsigned int i;AdcRegs.ADCTRL1.bit.RESET = 1; //ADC模块软复位,3个周期后,该位自动清0for(i=0;i<12;i++) NOP; //等待ADC寄存器硬件复位完备>AdcRegs.ADCTRL1.bit.SUSMOD = 3; //仿真挂起模式,0为忽略仿真挂起AdcRegs.ADCTRL1.bit.ACQ_PS = 1; //采样保持脉冲个数,即SH为1+1=2个ADCCLK AdcRegs.ADCTRL1.bit.CPS = 0; //是否再对送给ADC的时钟进行二分频AdcRegs.ADCTRL1.bit.CONT_RUN = 0; //1:进入连续运行; 0:开始停止模式AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; //0:独立模式; 1:级联序列器模式AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3; //带隙参考电路上电for(i=0;i<10000;i++) NOP;>AdcRegs.ADCTRL3.bit.ADCPWDN = 1; //除带隙参考电路外的其他ADC模块上电for(i=0;i<5000;i++) NOP;>AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; //设置ADC的转换时钟ADCCLK = HSPCLK/(2*(ADCCLKPS+CPS))=25MHZAdcRegs.ADCTRL3.bit.SMODE_SEL = 0; //0:顺序采用模式,1:同步采样模式AdcRegs.MAX_CONV.all = 0x0000; //设置ADC的转换通道数AdcRegs.CHSELSEQ1.bit.CONV00 = 0; //设置ADCINA0为SEQ1的第一个转换通道AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR=1; //清除SEQ1中断标志AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; //使能EVASOC启动SEQ1AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //使能SEQ1中断AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ = 0;AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0;AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0;AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1 = 0;AdcRegs.ADCTRL2.bit.RST_SEQ2=0;AdcRegs.ADCTRL2.bit.SOC_SEQ2=0;AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0;AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0;AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0;AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0; //为1时,软件启动ADC转换}void InitEv(void){EvaRegs.T1CMPR = 0x0000;EvaRegs.T1PR = 75; //2MHZ的采样频率EvaRegs.GPTCONA.bit.T1TOADC = 2; //使能事情管理器A,周期中断启动ADC EvaRegs.T1CON.all = 0x1042;}interrupt void ADInterrupt(void){IFR = 0x0000;//-------------------------------------ADTemp[ADTempIndex] = (unsigned char)((AdcRegs.RESULT0)>>8); ADTempIndex = (ADTempIndex+1)&0x01;Value = ADTemp[0] + ADTemp[1];if(++aa > 1000000){aa = 0;LED3 = ~LED3;}//-------------------------------------AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR = 1; //清除INT_SEQ1中断标志AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //复位SEQ1序列PieCtrl.PIEACK.all = 0xFFFF; //允许再次响应中断}void main(void){InitSysCtrl(); //初始化系统DINT; //屏蔽全局中断IER = 0x0000; //禁止所有中断IFR = 0x0000; //清除所有中断标志InitPieCtrl(); //初始化PIE中断InitPieVectTable(); //初始化PIE中断矢量表InitGpio(); //初始化通用IO口InitSci(); //初始化SCIA寄存器,即初始化串口EALLOW; //允许操作寄存器PieVectTable.ADCINT = &ADInterrupt; //设置ADC中断入口地址EDIS; //禁止操作寄存器InitAdc(); //初始化ADC寄存器IER |= M_INT1; //使能CPU中断1,即第一组PIE中断,共12组PIE中断InitEv(); //初始化事件触发器A,用于定时采样EINT; //使能全局中断ERTM; //Enable Global realtime interrupt DBGMwhile(1){SendToPC(ASCIIBuffer,100,'U'); Delay();}}。
TMS320F2812中文手册第1章芯片结构及性能概述TMS320C2000系列是美国TI公司推出的最佳测控应用的定点DSP芯片,其主流产品分为四个系列:C20x、C24x、C27x和C28x。
C20x可用于通信设备、数字相机、嵌入式家电设备等;C24x主要用于数字马达控制、电机控制、工业自动化、电力转换系统等。
近年来,TI公司又推出了具有更高性能的改进型C27x和C28x系列芯片,进一步增强了芯片的接口能力和嵌入功能,从而拓宽了数字信号处理器的应用领域。
TMS320C28x系列是TI公司最新推出的DSP芯片,是目前国际市场上最先进、功能最强大的32位定点DSP芯片。
它既具有数字信号处理能力,又具有强大的事件管理能力和嵌入式控制功能,特别适用于有大批量数据处理的测控场合,如工业自动化控制、电力电子技术应用、智能化仪器仪表及电机、马达伺服控制系统等。
本章将介绍TMS320C28x系列芯片的结构、性能及特点,并给出该系列芯片的引脚分布及引脚功能。
1.1 TMS320C28x 系列芯片的结构及性能C28x系列的主要片种为TMS320F2810和TMS320F2812。
两种芯片的差别是:F2812内含128K×16位的片内Flash存储器,有外部存储器接口,而F2810仅有64K×16位的片内Flash存储器,且无外部存储器接口。
其硬件特征如表1-1所示。
表1-1 硬件特征特征 F2810 F2812 指令周期(150MHz) 6.67ns 6.67ns SRAM(16位/字)18K 18K 3.3V片内Flash(16位/字) 64K 128K 片内Flash/SRAM的密钥有有有有 Boot ROM掩膜ROM 有有外部存储器接口无有事件管理器A和B(EVA和EVB)EVA、EVB EVA、EVB*通用定时器 4 4*比较寄存器/脉宽调制 16 16*捕获/正交解码脉冲电路 6/2 6/2 看门狗定时器有有 12位的ADC 有有*通道数 16 16TMS320C28x系列DSP的CPU与外设(上) ?2?续表特征 F2810 F2812 32位的CPU定时器 3 3 串行外围接口有有串行通信接口(SCI)A和B SCIA、SCIB SCIA、SCIB 控制器局域网络有有多通道缓冲串行接口有有数字输入/输出引脚(共享)有有外部中断源 3 3 核心电压1.8V 核心电压1.8V 供电电压 I/O电压3.3V I/O电压3.3V 封装128针PBK 179针GHH,176针PGF 温度选择‡ A:-40? ~ +85? PGF和GHH PBK S:-40? ~ +125? 仅适用于TMS 仅适用于TMS 产品状况‡‡产品预览(PP) AI AI 高级信息(AI)(TMP)‡‡‡ (TMP)‡‡‡ 产品数据(PD)注:‡ “S”是温度选择(-40? ~ +125?)的特征化数据,仅对TMS是适用的。
TMS320F2812的ADC模块是一个12位分辨率的、具有流水线结构的模数转换器。
它具有16个通道,可以配置为2个独立的8通道模块,也可以级联成一个16通道的模块。
有两个序列发生器,可以配置为双序列和级联模式,即两个独立的8状态序列发生器和一个16状态的序列发生器。
2812的ADC输入电压为0~3V,如果超出了这个范围,有可能将片子烧掉。
顺序采样和并发采样是对16个通道的配置,如果为顺序采样,则一次一个通道;如果为并发采样,则一次采集两个通道,对于电压和电流同时采集非常方便。
通过设置AdcRegs.ADCTR L3.bit.SMODE_SEL = 0/1;来选择,此位为0则是顺序采样,为1则是并发采样。
双序列和级联模式主要是区分序列发生器的使用,可选择两个序列发生器或者是一个序列发生器。
通过设置AdcRegs.ADCTRL1.bit.SEQ_CASC= 0/1;0为双序列发生器,1为级联模式即只有一个序列发生器。
对于启动ADC的触发源主要是有:软件触发,EVA或EVB触发,外部引脚触发。
软件触发是通过设置AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;即可启动AD采样。
EVA或EVB触发是通过事件管理器的多种定时方式来启动,包括定时器启动、CAPTURE3或CAPTURE6、PWM等启动方式,在EV的初始化中设置相应的启动位。
例如EvbRegs.GPT CONA.bit.T4TOADC = 1;或EvbRegs.CAPCONB.bit.CAP6TOADC = 1;对于EVA或EVB触发ADC,值得注意的是:对于单序列发生器可以通过EVA或者EVB 触发,ADCTRL2寄存器的第一位EVB SOC SEQ只有在单序列发生器时才激活。
而且单序列发生器模式下,SEQ和SEQ1的设置时重合的,即设置SEQ1即使用SEQ;而在双序列发生器模式下,ADCTRL2寄存器后面的关于SEQ2的位才起作用。
TMS320F2812芯片ADC模数转换精度的分析TMS320F2812是高精度的,其运算速度快,工作时钟频率达150 MHz,命令周期可达6.67 ns以内,低功耗(核心1.8 V,I/O口电压3.3 V)。
采纳哈佛结构,具有强大的操作能力、快速的中断响应和处理能力以及统一的寄存器编程模式。
并且在片上集成了Flash存储器,可实现外部存储器的扩展。
外部扩展模块(PIE)可支持96个外部中断,45个可用。
两个增加的大事管理器模块(EVA、EVB),提供了一整套用于运动控制和电机控制的功能和特性。
每个大事管理模块包括通用定时器(GP)、比较单元、捕捉单元以及正交编码脉冲。
外围设备包括3个32 bit的CPU 定时器,16通道12 bit (单个转换时光为200 ns,单路转换时光为60 ns),它不仅具有串行外围接口(SPI)和两个串行通信接口(SCI),还有改进的局域网络(eCAN)、多通道缓冲串行接口(McBSP)和串行外围接口模式。
28X核提供了高达400 的计算带宽,它能够满足大多数经典实时控制算法,在工业、光传输网络和自动控制等领域拥有应用前景。
但是,在获得其较高工作时钟频率150 MHz、低功耗的I/O口3.3 V电压的同时,对其在电磁兼容和ADC模数转换单元等实际应用提出了更高的要求。
特殊是ADC模数转换单元,受到了众多用法者的诟病,称其实测的精度甚至低于TMS320F2407的10 bit ADC模数转换精度。
有人疑惑TMS320F2812核内数字地和模拟地衔接设计有缺陷,但尚未得到TI公司的证明。
TI公司发布了SPRA989的ADC校准文档,仅修正了模数转换的增益和偏移,与彻低有用的要求尚有一定差距。
本文从实际应用的角度动身,考虑其外围设计因素,提高ADC模数转换精度。
1 ADC模数转换精度分析以及测试办法影响ADC模数转换终于结果精度的缘由无数,诸如芯片内部模数转换、模数转换的增益和偏移引起的误差,这些都是生产厂商控制和讨论的领域,本文不作研究。
TMS320F2812内部集成了ADC转换模块,该模块具有如下的功能:1.12位ADC核,内置了双采样-保持器(S/H);2.顺序采样模式或者同步采样模式;3.模拟输入:0V~3V;4.快速转换时间运行在25MHz,ADC时钟,或12.5MSPS;5.16通道,多路选择输入;6.自动序列化,在单一时间段内最大能提供16个自动A/D转换,每个转换可编程对16个输入通道中的任何一个进行选择。
7.序列发生器可按2个独立的8状态序列发生器或1个16状态序列发生器。
我们在项目实际研发过程中采用的AD采样的硬件电路如下图所示:图1为电流信号检测与调理电路,电压信号的检测与调理电路与此相类似。
从电流传感器输出的信号CT1首先经过了由R1、C1组成的低通滤波电路,滤除高频干扰信号,然后通过U1构成的电压跟随器,实现了电路前后两级的隔离。
由于2812的I/O口输入电平必须低于3.3V,因此在芯片引脚的输入前端加了一个稳压管Z1,使AD口输入的电压幅值不超过3V。
TMS320F2812虽然有12位精度,但在实际的使用过程中,我们发现,ADC的转换结果误差较大,如果直接将此转换结果用于控制回路,必然会降低控制精度,最大的转换误差可以达到9%。
那么如何来提高AD采样的精度呢,下面列出了几种常见的方法:1.硬件角度(1)硬件滤波,滤除干扰信号;(2)电路板布线时需要注意不要让ADCINxx引脚运行在靠近数字信号通路的地方,这样能使耦合到ADC输入端的数字信号开关噪声大大降低;(3)采用适当的隔离技术,将ADC模块电源引脚和数字电源隔离;(4)如果采样电路部分是经过多路开关切换的,可以在多路开关输出上接下拉电阻到地;(5)采样通道上的电容效应也可能会导致AD采样误差,因为采样通道上的等效电容可能还在保持有上一个采样数据的数值的时候,就对当前数据进行采样,会造成当前数据不准确。
如果条件允许,可以在每次转化完成后现将输入切换到参考地,然后在对信号进行下一次采样。
TMS320F2812中⽂资料介绍TMS320F2812中⽂资料介绍简介:德州仪器所⽣产的TMS320F2812数字讯号处理器是针对数字控制所设计的电机控制(digital motor control, DMC)、资料撷取及I/O控制(data acquisition and control, DAQ)等领域。
针对应⽤最佳化,并有效缩短产品开发周期,F28x核⼼⽀持全新CCS环境的C compiler,提供C语⾔中直接嵌⼊汇编语⾔的程序开发介⾯,可在C语⾔的环境中搭配汇编语⾔来撰写程序。
值得⼀提的是,F28x DSP核⼼⽀持特殊的IQ-math函式库,系统开发⼈员可以使⽤便宜的定点数DSP来发展所需的浮点运算算法。
F28x系列DSP预计发展⾄400MHz,⽬前已发展⾄150MHz的Flash型式。
1.⾼性能静态CMOS制成技术(1)150MHz(6.67ns周期时间)(2)省电设计(1.8VCore,3.3VI/O)(3)3.3V快取可程序电压2.JTAG扫描⽀持3.⾼效能32BitCPU(1)16x16和32x32MAC Operations(2)16x16Dual MAC(3)哈佛总线结构(4)快速中断响应(5)4M线性程序寻址空间(LinearProgramAddressReach)(6)4M线性数据寻址空间(LinearDataAddressReach)(7)TMS320F24X/LF240X程序核⼼兼容4.芯⽚上(On-Chip)的内存(1)128Kx16 Flash(4个8Kx16,6个16Kx16)(2)1Kx16OTPROM(单次可程序只读存储器)(3)L0和L1:2组4Kx16 SARAM(4)H0:1组8Kx16SARAM(5)M0和M1:2组1Kx16 SARAM共128Kx16 Flash,18Kx16 SARAM5.外部内存接⼝(1)⽀持1M的外部内存(2)可程序的Wait States(3)可程序的Read/Write StrobeTi最⼩g(4)三个独⽴的芯⽚选择(Chip Selects)6.频率与系统控制(1)⽀持动态的相位锁定模块(PLL)⽐率变更(2)On-Chip振荡器(3)看门狗定时器模块7.三个外部中断8.外围中断扩展⽅块(PIE),⽀持45个外围中断9.128位保护密码(1)保护Flash/ROM/OTP及L0/L1SARAM(2)防⽌韧体逆向⼯程10.三个32位CPU Timer11.电动机控制外围(1)两个事件管理模块(EVA,EVB)(2)与240xADSP相容12. (1)同步串⾏外围接⼝SPI模块(2)两个异步串⾏通讯接⼝SCI模块,标准UART(3)eCAN(Enhanced Controller Area Network)(4)McBSP With SPI Mode13.16个信道12位模拟-数字转换模块(ADC)(1)2x8通道的输⼊多任务(2)两个独⽴的取样-保持(Sample-and-Hold)电路(3)可单⼀或同步转换(4)快速的转换率:80ns/12.5MSPS2.2TMS320F2812硬件结构介绍2.2.1OSC与PLL⽅块F2812芯⽚上设计了⼀个相位锁定模块(PLL),这个模块将会提供整个芯⽚所需频率源。
1 TMS320F2812简介TMS320F2812是TI公司的一款用于控制的高性能、多功能、高性价比的32位定点DSP芯片。
该芯片兼容TMS320LF2407指令系统最高可在150MHz主频下工作,并带有18k×16位0等待周期片上SRAM和128k×16位片上FLASH(存取时间36ns)。
其片上外设主要包括2×8路12位ADC(最快80ns转换时间)、2路SCI、1路SPI、1路McBSP、1路eCAN等,并带有两个事件管理模块(EVA、EVB),分别包括6路PWM/CMP、2路QEP、3路CAP、2路16位定时器(或TxPWM/TxCMP)。
另外,该器件还有3个独立的32位CPU定时器,以及多达56个独立编程的GPIO引脚,可外扩大于1M×16位程序和数据存储器。
TMS320F2812采用哈佛总线结构,具有密码保护机制,可进行双16×16乘加和32×32乘加操作,因而可兼顾控制和快速运算的双重功能。
通过对TMS320F2812定点DSP芯片合理的系统配置和编程可实现快速运算,本文着重对此加以说明。
2 TMS320F2812基本系统配置2.1TMS320F2812时钟TMS320F2812的片上外设按输入时钟可分为如下4个组:(1)SYSOUTCLK组:包括CPU定时器和eCAN总线,可由PLLCR寄存器动态地修改;(2)OSCCLK组:主要是看门狗电路,由WDCR寄存器设置分频系数;(3)低速组:有SCI、SPI、McBSP,可由LOSPCP寄存器设置分频系数;(4)高速组:包括EVA/B、ADC,可由HISPCP寄存器设置分频系数。
为了使系统具有较快的工作速度,除了定时器和SCI等少数需要低速时钟的地方,其它外设均可以150MHz时钟工作。
图12.2存储空间图1所示是TMS320F2812的内部存储空间映射图。
TMS320F2812为哈佛(Harvard)结构的DSP,即在同一个时钟周期内可同时进行一次取指令、读数据和写数据的操作。
F2812 ADC转换时间与采样频率F2812 ADC有多种灵活的启动方式:软件直接启动S/W,EVA的事件源,EVB的事件源和外部引脚启动。
如果采用触发方式,ADC的采样频率就是触发的频率,如果是连续自动的采样,那就是采样窗口+转换时间,这个很好理解。
需要注意的是,如果采用EV的事件启动ADC,必须保证两次启动时间的间隔大于ADC固有的转换时间。
下面给出ADC转换时间的具体计算方式,由于我采用的是序列方式,本文中只探讨这种方式,同时采样方式的转换时间可以类似求解。
图1. 序列采样时序图图1中是采样两个通道的时序图,根据这个原理,可以求解MAX_CONV为N时的转换时间。
从图中可以看到,ADC SOC tigger信号有效后,2.5个ADCCLK后开始第一次转换,Acquisition window的长度由寄存器AdcRegs.ADCTRL1.bit.ACQ_PS决定,Acquisition window=(ACQ_PS+1)*ADCCLK,而随后的寄存器更新时间为4ADCCLK,也就是说第一个寄存器出现采样结果共耗时:T1=(2.5+(ACQ_PS+1)+4)ADCCLK,同理可以推得第二个寄存器出现采样结果共耗时:T2=(2.5+(ACQ_PS+1)+4+(ACQ_PS+2))ADCCLK,类推可以得出N+1通道全部得到结果共耗时:T=(2.5+(ACQ_PS+1)+4+N*(ACQ_PS+2))ADCCLK = (7.5+2*N+(ACQ_PS+1)*N)ADCCLK PS:上图中有个问题,两个C1的长度并不相同,考虑到边沿有限,我认为两个C1都应该是4*ADCCLK,下面的实验也证明了这一点。
在试验程序中,DSP工作在150MHz,ADCCLK为7.5MHz,ACQ_PS设为1,序列采样方式,N为15(采样16通道),完成一次ADC所需的时间为:T=(7.5+2*15+(1+1)*15)/7.5us = 7us试验程序采用EVA的周期中断启动ADC,完成后产生ADC完成中断,在中断中设置信号量,观察者两个信号量的关系,就可以计算这个时间是否正确,定时周期为100us,EVA 设置如下:// Initialize EVA Timer 1:// Setup Timer 1 Registers (EV A)EvaRegs.GPTCONA.all = 0;// Set the Period for the GP timer 1 to 0x0200;EvaRegs.T1PR = T1PR_VALUE; // PeriodEvaRegs.T1CMPR = 0x0000; // Compare Reg// Enable Period interrupt bits for GP timer 1// Count up, x128, internal clk, enable compare, use own period EvaRegs.EVAIMRA.bit.T1PINT = 1;EvaRegs.EVAIFRA.bit.T1PINT = 1;// Clear the counter for GP timer 1EvaRegs.T1CNT = 0x0000;EvaRegs.T1CON.all = 0x1742;// Start EVA ADC Conversion on timer 1 Period interruptEvaRegs.GPTCONA.bit.T1TOADC = 2;EVA周期中断代码如下:interrupt void T1PINT_ISR(void) // EV-A{// Insert ISR Code hereif (i == 0){i = 1;GpioDataRegs.GPASET.bit.GPIOA0 = 1;}else{i = 0;GpioDataRegs.GPACLEAR.bit.GPIOA0 = 1;}// Enable more interrupts from this timerEvaRegs.EVAIMRA.bit.T1PINT = 1;EvaRegs.EVAIFRA.all = BIT7;// Acknowledge interrupt to receive more interrupts from PIE group 2PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;}ADC中断代码如下:interrupt void ADCINT_ISR(void) // ADC{// Insert ISR Code hereif (i == 1){GpioDataRegs.GPASET.bit.GPIOA1 = 1;}else{GpioDataRegs.GPACLEAR.bit.GPIOA1 = 1;}AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE}用示波器观察A0与A1的波形,可以观察到时间间隔约为7.0400us,与计算结果基本一致。