当前位置:首页 > TMS320F2812 - AD转换程序
TMS320F2812 AD转换程序(已调试通过) /*
==================================================================================
File name: F28XADC04U.C
Originator: Digital Control Systems Group Texas Instruments
Description: This file contains source for the F28X general purpose 4 conversions ADC driver for unipolar signals
===================================================================================== History:
-------------------------------------------------------------------------------------
11-04-2003 Release Rev 1.0 ----------------------------------------------------------------------------------*/ #include \#include \#include \#include \
#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(\ asm(\
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; //IU
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x4; //地 AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x8; //IV AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0xC; //VREF1.5V
EvaRegs.EXTCON.bit.EVSOCE = 1; //Enable SOC
EvaRegs.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-tempz4 tempz2 = (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个周期后,该位自动清0 for(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))=25MHZ
AdcRegs.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启动SEQ1 AdcRegs.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的采样频率
=
共分享92篇相关文档