3DSP28335AD采样 原理与程序讲解.docx
- 文档编号:25922819
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:17
- 大小:602.81KB
3DSP28335AD采样 原理与程序讲解.docx
《3DSP28335AD采样 原理与程序讲解.docx》由会员分享,可在线阅读,更多相关《3DSP28335AD采样 原理与程序讲解.docx(17页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 3DSP28335AD采样 原理与程序讲解 DSP28335AD 采样 原理 程序 讲解