DSP28335-AD采样原理与程序讲解.docx

上传人:聆听****声音 文档编号:704547 上传时间:2023-04-29 格式:DOCX 页数:12 大小:669.58KB
下载 相关 举报
DSP28335-AD采样原理与程序讲解.docx_第1页
第1页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第2页
第2页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第3页
第3页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第4页
第4页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第5页
第5页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第6页
第6页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第7页
第7页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第8页
第8页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第9页
第9页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第10页
第10页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第11页
第11页 / 共12页
DSP28335-AD采样原理与程序讲解.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DSP28335-AD采样原理与程序讲解.docx

《DSP28335-AD采样原理与程序讲解.docx》由会员分享,可在线阅读,更多相关《DSP28335-AD采样原理与程序讲解.docx(12页珍藏版)》请在冰点文库上搜索。

DSP28335-AD采样原理与程序讲解.docx

1、ADC模块构成及原理

·12为ADC转换核,2个采样保持器;

·同步采样模式和顺序采样模式;

·模拟输入电压为0~3V,

·ADCCLK最快可配置为12.5MHz;

·16通道,多路复用输入,ADCINA0~ADCINA7、ADCINB0~ADCINB7;

·排序器可工作在两个8状态的排序器或者级联为一个16状态的排序器;

·ADC转换结果储存在16位结果寄存器中(高12位,或者低12位);

结果寄存器=0, 当输入模拟电压为0V时;

结果寄存器=4096*InputAnalogVoltage-ADCLO3 当输入模拟电压大于0V、小于3V时;

结果寄存器=4095, 当输入模拟电压大于等于3V时;

·多触发源启动ADC转换

S/W-softwareimmediatestart

ePWM1-6

GPIOXINT2

·ADC中断请求可以在每一次ADC转换结束时,也可以每隔一次ADC转化结束时;

·ePWM触发可以独立的工作在双序列模式;

·采样保持时间的长度可以通过分频器控制。

·ADC模块结构图

Note:

·ADCENCLK使能以后,该ADCCLK才有效;

·结果寄存器0-15并非与A0-A7、B0-B7一一对应,具体的对应方式由排序器决定;

·ADC模块只有一个转换,所以在同一时刻只能有一个通道被送入到ADC转换模块中进行ADC转换;送入的先后顺序由排序器决定,采样的结果依次送入ResultREG0-15。

·当工作于双序列模式时,若ADC转换模块正在转换ADCB0-ADCB7中的某一通道时,ADCA0-ADCA7中的某一通道的转换信号送入ADC转换模块,则在转换结束ADCB0-ADCB7中的某一通道后再转换ADCA0-ADCA7中的某一通道;当ADCA0-ADCA7中的某一通道与ADCB0-ADCB7中的某一通道同时送入ADC转换模块,则先转换ADCA0-ADCA7中的某一通道,即A0-A7的优先级高于B0-B7;

2、ADC时钟及采样频率

一般将ADCCLK配置为25MHz。

3、自动转换排序器的工作原理

ADC排序器由两个独立的8状态排序器(SEQ1和SEQ2)组成,这两个排序器也可以被级联为1个16状态的排序器(状态的意思是排序器能够自动转换的个数)。

两种情况如下图所示:

Note:

·ADC可以工作在同步采样模式和顺序采样模式,对于每一次转换,CONVxx定义了当前哪一个通道被采样和转换;

·在顺序采样模式中,CONVxx的四位都被定义为输入引脚,最高位定义了通道A或通道B,低三位定义了偏移量,例如0101b表示ADCINA5,1001b表示ADCINB1;

·在同步采样模式中,CONVxx的最高位没有意义,第三位表示偏移量,例如0101b表示先对ADCINA5采样再对ADCINB5采样,1001b表示先对ADCINA1采样再对ADCINB1采样;

4、ADC相关寄存器介绍

4.1 ADCTRL1

·RESET(14):

写0无影响:

写1复位整个ADC模块。

(在系统复位时,ADC模块会被复位,当在其他时刻需要复位ADC模块时,可以向该位写1,但是在写1后需要等待至少两个ADC时钟周期后才可以继续对ADC控制寄存器1进行操作)

·SUSMOD(13:

12):

仿真悬挂模式位,通常向该位写入00:

忽略仿真悬挂;

·ACQ_PS(11:

8):

该位控制SOC脉冲的宽度,决定采样开关关闭持续多长时间。

SOC脉冲的宽度等于(ACQ_PS+1)个ADC时钟周期.

·CPS(7):

写0:

ADCCLK=Fclk/1;写1:

ADCCLK=Fclk/2。

(Fclk=PrescaledHSPCLK(adcclkps[3:

0])),参考上面ADC时钟及采样频率部分。

·CONT_RUN(6):

写0:

启动停止模式(在收到EOS信号后,排序器停止。

在下一个SOC信号到来时,排序器从上一次停止的地方开始。

);写1:

连续转换模式。

(当收到EOS信号后,排序器停止。

在下一个SOC信号到来时,排序器的行为取决于SEQ_OVRD位的状态,当SEQ_OVRD为0时,排序器从头开始排序;当SEQ_OVRD为1时,排序器从上一次停止的地方开始。

·SEQ_OVR(5):

设置:

采样模式为顺序采样的级联模式;

MAX_CONV.all=0x0001;//最大转换通道为2个

ADCCHSELSEQ1.bit.CONV00=0x0;//ADCINA0

ADCCHSELSEQ1.bit.CONV01=0x3;//ADCINA3

·若CONT_RUN=1;SEQ_OVR=0;则采样结果只在结果寄存器0和1中;

·若CONT_RUN=1;SEQ_OVR=1;则采样结果只在结果寄存器0--15中;

·若CONT_RUN=0;则采样结果只在结果寄存器0--15中。

·SEQ_CASC(4):

写0:

双序列模式;写1:

级联模式。

4.2 ADCTRL2

·ePWM_SOCB_SEQ(15):

写0:

无影响;写1:

通过Epwm_SOCB信号允许级联排序器开始。

·RST_SEQ1:

写0:

无影响;写1:

立即复位排序器到ONV00;

·SOC_SEQ1:

写0:

清除一个没被处理的SOC触发信号;写1:

软件触发,从当前停止为止启动SEQ1。

·INT_ENA_SEQ1:

写0:

通过INT_SEQ1的中断请求被禁止;写1:

通过INT_SEQ1的中断请求被使能;

·INT_MOD_SEQ1:

写0:

INT_SEQ1在每一次SEQ1排序器结束时产生;写1:

INT_SEQ1每隔一次SEQ1排序器结束时产生;

·ePWM_SOCA_SEQ1:

写0:

SEQ1不能通过ePWMxSOCA的触发开始;写1:

允许SEQ1、SEQ通过ePWMxSOCA的触发开始;

·EXT_SOC_SEQ1:

写0:

无影响;写1:

允许外部中断XINT2触发启动SEQ1;

4.3 ADCTRL3

·ADCBGRFDN:

写00:

带隙和参考电路掉电;写11:

带隙和参考电路上电;

·ADCPWDN:

写0:

除带隙和参考电路外,AD内部所有的模拟电路掉电;写1:

AD内部所有的模拟电路上电;

·ADCCLKPS:

结合ADC时钟及采样频率理解

0000 HSPCLK/[(ADCTRL1[7]+1)]

0001 HSPCLK/[2*(ADCTRL1[7]+1)]

0010 HSPCLK/[4*(ADCTRL1[7]+1)]

0011 HSPCLK/[6*(ADCTRL1[7]+1)]

1111 HSPCLK/[30*(ADCTRL1[7]+1)]

·SMODE_SEL:

写0:

顺序采样模式;写1:

同步采样模式。

4.4 ADCMAXCONV

·MAX_CONVn:

最大通道转换数。

FORSEQ1:

MAX_CONV1[2:

0]

FORSEQ2:

MAX_CONV2[2:

0]

FORSEQ:

MAX_CONV1[3:

0]

4.5 ADCST

·EOS_BUF2:

SEQ2的序列缓冲结束位;

·INT_SEQ2_CLR:

写0:

无影响;写1:

清除SEQ2中断标志INT_SEQ2.该位不会影响EOS_BUF2位

·SEQ2_BSY:

读0:

SEQ2空闲,等待触发;读1:

SEQ2正在工作;

·INT_SEQ2:

读0:

没有SEQ2中断事件发生;读1:

SEQ2中断事件发生。

4.6 ADCREFSEL

4.7 ADCCHSELSEQ1

4.8 ADCRESULTn

5、ADC采样例程

Example1:

配置ADC为顺序采样、级联模式,最大采样通道为1,对ADCINA0进行连续采样AVG次,并将采样的结果放在SampleTable[BUF_SIZE]中。

在本例中ADCLK=12.5MHz。

#include"DSP28x_Project.h"//DeviceHeaderfileandExamplesIncludeFile

#defineAVG1000//Averagesamplelimit

#defineZOFFSET0x00//AverageZerooffset

#defineBUF_SIZE2048//Samplebuffersize

//Globalvariableforthisexample

Uint16SampleTable[BUF_SIZE];

main()

{

Uint16i;

//Step1.InitializeSystemControl:

//PLL,WatchDog,enablePeripheralClocks

//ThisexamplefunctionisfoundintheDSP2833x_SysCtrl.cfile.

InitSysCtrl();

//Specificclocksettingforthisexample:

EALLOW;

SysCtrlRegs.HISPCP.all=0x3; //HSPCLK=SYSCLKOUT/ADC_MODCLK

EDIS;

//Step2.InitializeGPIO:

//ThisexamplefunctionisfoundintheDSP2833x_Gpio.cfileand

//illustrateshowtosettheGPIOtoit'sdefaultstate.

//InitGpio();//Skippedforthisexample

//Step3.ClearallinterruptsandinitializePIEvectortable:

//DisableCPUinterrupts

DINT;

//InitializethePIEcontrolregisterstotheirdefaultstate.

//ThedefaultstateisallPIEinterruptsdisabledandflags

//arecleared.

//ThisfunctionisfoundintheDSP2833x_PieCtrl.cfile.

InitPieCtrl();

//DisableCPUinterruptsandclearallCPUinterruptflags:

IER=0x0000;

IFR=0x0000;

//InitializethePIEvectortablewithpointerstotheshellInterrupt

//ServiceRoutines(ISR).

//Thiswillpopulatetheentiretable,eveniftheinterrupt

//isnotusedinthisexample.Thisisusefulfordebugpurposes.

//TheshellISRroutinesarefoundinDSP2833x_DefaultIsr.c.

//ThisfunctionisfoundinDSP2833x_PieVect.c.

InitPieVectTable();

//Step4.InitializealltheDevicePeripherals:

//ThisfunctionisfoundinDSP2833x_InitPeripherals.c

//InitPeripherals();//Notrequiredforthisexample

InitAdc();//Forthisexample,inittheADCvoidInitAdc(void)

{

externvoidDSP28x_usDelay(Uint32Count);

EALLOW;

SysCtrlRegs.PCLKCR0.bit.ADCENCLK=1;

ADC_cal();

EDIS;

AdcRegs.ADCTRL3.all=0x00E0;//Powerupbandgap/reference/ADCcircuits

DELAY_US(ADC_usDELAY);//DelaybeforeconvertingADCchannels

}

//SpecificADCsetupforthisexample:

AdcRegs.ADCTRL1.bit.ACQ_PS=0xf;

AdcRegs.ADCTRL3.bit.ADCCLKPS=0x1;

AdcRegs.ADCTRL1.bit.SEQ_CASC=1;//1Cascadedmode

AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0; //ADCINA0

AdcRegs.ADCTRL1.bit.CONT_RUN=1;//Setupcontinuousrun

//Step5.Userspecificcode,enableinterrupts:

//ClearSampleTable

for(i=0;i

{

SampleTable[i]=0;

}

//StartSEQ1

AdcRegs.ADCTRL2.all=0x2000;

//TakeADCdataandlogtheinSampleTablearray

for(;;)

{

for(i=0;i

{

while(AdcRegs.ADCST.bit.INT_SEQ1==0){}//Waitforinterrupt

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;

SampleTable[i]=((AdcRegs.ADCRESULT0>>4));

}

}

}

//===========================================================================

//Nomore.

//===========================================================================

Example2:

功能:

对采样周期为20ms的正弦电压的有效值。

通过将定时器定时78.125us,使得在20ms内读取ADC结果寄存器的值256次,并将该值放在建立的数组里面,通过对数组中的数据的计算,得出正弦电压的有效值。

配置:

定时器使用Timer0,定时时间为78.125us,每进一次定时器读取一次AD结果寄存器的值;AD配置为连续采样、级联模式、最大采样通道为1、采样ADCINA2通道。

Note:

一、在本例中,无需使用AD中断函数,本实施例的逻辑为:

1、达到定时器的定时时间;2、进入定时器中断函数;3、读取AD结果寄存器,并对读取的值作处理,清除AD中断标志位;4、返回主程序,继续计算有效值;5、重复步骤1-4.

二、定时器在定时时间达到以后会产生中断标志位,然后向PIE级发送中断请求;AD在完成一次AD采样后,会产生一个AD中断标志位,然后向PIE级发送中断请求。

#include"DSP28x_Project.h"//DeviceHeaderfileandExamplesIncludeFile

#include"math.h"

//Prototypestatementsforfunctionsfoundwithinthisfile.

interruptvoidcpu_timer0_isr(void);//timer1中断子程序,用于给AD--start信号确认采样周期,接入硬件锁相环时,该段子程序可以略去

voidADC_SETUP();

#defineADC_LEN256

floatVol[ADC_LEN];

floatVol_rms;

floatsum=0;

inti;

//Globalvariablesusedinthisexample:

Uint16ConversionCount;

voidmain(void)

{

//Step1.InitializeSystemControl:

//PLL,WatchDog,enablePeripheralClocks

//ThisexamplefunctionisfoundintheDSP2833x_SysCtrl.cfile.

InitSysCtrl();

//DefineADCCLKclockfrequency(lessthanorequalto25MHz)

//AssumingInitSysCtrl()hassetSYSCLKOUTto150MHz

/*EALLOW;

SysCtrlRegs.HISPCP.all=0x3;

EDIS;

*/

//Step2.InitializeGPIO:

//ThisexamplefunctionisfoundintheDSP2833x_Gpio.cfileand

//illustrateshowtosettheGPIOtoit'sdefaultstate.

//InitGpio();//Skippedforthisexample

//Step3.ClearallinterruptsandinitializePIEvectortable:

//DisableCPUinterrupts

DINT;

//InitializethePIEcontrolregisterstotheirdefaultstate.

//ThedefaultstateisallPIEinterruptsdisabledandflags

//arecleared.

//ThisfunctionisfoundintheDSP2833x_PieCtrl.cfile.

InitPieCtrl();

//DisableCPUinterruptsandclearallCPUinterruptflags:

IER=0x0000;

IFR=0x0000;

//InitializethePIEvectortablewithpointerstotheshellInterrupt

//ServiceRoutines(ISR).

//Thiswillpopulatetheentiretable,eveniftheinterrupt

//isnotusedinthisexample.Thisisusefulfordebugpurposes.

//TheshellISRroutinesarefoundinDSP2833x_DefaultIsr.c.

//ThisfunctionisfoundinDSP2833x_PieVect.c.

InitPieVectTable();

//Interruptsthatareusedinthisexamplearere-mappedto

//ISRfunctionsfoundwithinthisfile.

EALLOW;//ThisisneededtowritetoEALLOWprotectedregister

PieVectTable.TINT0=&cpu_timer0_isr;

EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters

InitCpuTimers();

ConfigCpuTimer(&CpuTimer0,150,78.125); //配置定时器0的定时时间为78.125us,即20ms内正好是256个整周期

CpuTimer0Regs.TCR.all=0x4001;//Usewrite-onlyinstructiontosetTSSbit=0

//Step4.InitializealltheDevicePeripherals:

//ThisfunctionisfoundinDSP2833x_InitPeripherals.c

//InitPeripherals();//Notrequiredforthisexample

InitAdc();//Forthisexample,inittheADCvoidInitAdc(void)

{

externvoidDSP28x_usDelay(Uint32Count);

EALLOW;

SysCtrlRegs.PCLKCR0.bit.ADCENCLK=1;

ADC_cal();

EDIS;

AdcRegs.ADCTRL3.all=0x00E0;//Powerupbandgap/reference/ADCcircuits

DELAY_US(ADC_usDELAY);//DelaybeforeconvertingADCchannels

}

ADC_SETUP();

//Step5.Userspecificcode,enableinterrupts:

IER|=M_INT1;//EnableCPUInterrupt1

PieCtrlRegs.PIEIER1.bit.INTx7=1;

EINT;//EnableGlobalinterruptINTM

ERTM;//EnableGl

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2