3DSP28335AD采样 原理与程序讲解.docx

上传人:b****6 文档编号:5883813 上传时间:2023-01-01 格式:DOCX 页数:15 大小:602.87KB
下载 相关 举报
3DSP28335AD采样 原理与程序讲解.docx_第1页
第1页 / 共15页
3DSP28335AD采样 原理与程序讲解.docx_第2页
第2页 / 共15页
3DSP28335AD采样 原理与程序讲解.docx_第3页
第3页 / 共15页
3DSP28335AD采样 原理与程序讲解.docx_第4页
第4页 / 共15页
3DSP28335AD采样 原理与程序讲解.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

3DSP28335AD采样 原理与程序讲解.docx

《3DSP28335AD采样 原理与程序讲解.docx》由会员分享,可在线阅读,更多相关《3DSP28335AD采样 原理与程序讲解.docx(15页珍藏版)》请在冰豆网上搜索。

3DSP28335AD采样 原理与程序讲解.docx

3DSP28335AD采样原理与程序讲解

1、ADC模块构成及原理

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

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

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

·ADCCLK最快可配置为12.5MHz;

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

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

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

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

结果寄存器=

当输入模拟电压大于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.1ADCTRL1

·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):

·SEQ_CASC(4):

写0:

双序列模式;写1:

级联模式。

4.2ADCTRL2

·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.3ADCTRL3

·ADCBGRFDN:

写00:

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

带隙和参考电路上电;

·ADCPWDN:

写0:

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

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

·ADCCLKPS:

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

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

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

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

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

 

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

·SMODE_SEL:

写0:

顺序采样模式;写1:

同步采样模式。

4.4ADCMAXCONV

·MAX_CONVn:

最大通道转换数。

FORSEQ1:

MAX_CONV1[2:

0]

FORSEQ2:

MAX_CONV2[2:

0]

FORSEQ:

MAX_CONV1[3:

0]

4.5ADCST

·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.6ADCREFSEL

4.7ADCCHSELSEQ1

4.8ADCRESULTn

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,inittheADC

//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,inittheADC

ADC_SETUP();

//Step5.Userspecificcode,enableinterrupts:

 

IER|=M_INT1;//EnableCPUInterrupt1

PieCtrlRegs.PIEIER1.bit.INTx7=1;

EINT;//EnableGlobalinterruptINTM

ERTM;//EnableGlobalrealtimeinterruptDBGM

ConversionCount=0;

AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//softwareenableSOCofADSEQ1

//WaitforADCinterrupt

for(;;)

{

for(i=0,sum=0;i

{

sum+=Vol[i]*Vol[i];

}

Vol_rms=sqrt(sum/ADC_LEN);

}

}

interruptvoidcpu_timer0_isr(void)//78.125us256pointsin20mscycle

{

Vol[ConversionCount]=((3*(float)(AdcRegs.ADCRESULT0>>4)/4096)-1.266)/0.26*12.222;//将采样的值转换为实际电压的有效值,该计算公式与硬件电路有关

if(ConversionCount==ADC_LEN)

{

ConversionCount=0;

}

else

ConversionCount++;

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//ClearINTSEQ1bit

PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;

//EDIS;

}

voidADC_SETUP(void)

{

AdcRegs.ADCTRL1.all;//RESETtheadccontrolregister1.

//setclockforADC

AdcRegs.ADCTRL1.bit.ACQ_PS=2;//ThewidthofSOCpulseisADCTRL1[11:

8]+1timestheADCLKperiod.

AdcRegs.ADCTRL3.bit.ADCCLKPS=1;//adcmoduleclkcoreclockdivider

//continousmodeorstart/stopmode

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

//configureADCTRL2

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

当前位置:首页 > 经管营销 > 企业管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1