TI中文支持网
TI专业的中文技术问题搜集分享网站

F28335 AD 如果采用软件触发AD转换的话,如何控制采样频率呢?

F28335 AD 如果采用软件触发AD转换的话,如何控制采样频率呢?

是否有例程可以参考呢?

sunny Cui:

回复 Eric Ma:

请问是否有参考的例程呢?

F28335 AD 如果采用软件触发AD转换的话,如何控制采样频率呢?

是否有例程可以参考呢?

Eric Ma:

回复 sunny Cui:

没有这么一致的,不过我建议你可以用下面两个工程进行修改:

C:\ti\controlSUITE\device_support\f2833x\v141\DSP2833x_examples_ccsv5\adc_soc

C:\ti\controlSUITE\device_support\f2833x\v141\DSP2833x_examples_ccsv5\epwm_timer_interrupts

ERIC

F28335 AD 如果采用软件触发AD转换的话,如何控制采样频率呢?

是否有例程可以参考呢?

jinli pan:

回复 Eric Ma:

我也遇到同样的问题,如果开了中断,中断影响到PWM工作,有些特殊的数字电源PWM不能受到AD中断的影响,看了TI提供的例程,没有找到类似的

F28335 AD 如果采用软件触发AD转换的话,如何控制采样频率呢?

是否有例程可以参考呢?

sunny Cui:

回复 Eric Ma:

我改了个工程,试了下断点,可以重复的进timer的中断和ADC的中断,但是采样出来的结果特别奇怪,您能帮忙看看程序吗?

main(){ // Uint16 i; Uint16 array_index;

InitSysCtrl();

EALLOW; SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK EDIS;

DINT;

InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;

InitPieVectTable(); // EALLOW; // PieVectTable.TINT0 = &TINT0_ISR; // PieVectTable.ADCINT = &adc_isr; // EDIS;

InitCpuTimers(); ConfigCpuTimer(&CpuTimer0, 150, 100);

StartCpuTimer0(); InitAdc();

// IER |= M_INT1; IER |= M_INT1; // Enable CPU Interrupt 1 PieCtrlRegs.PIECTRL.bit.ENPIE = 1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; PieCtrlRegs.PIEIER1.bit.INTx6 = 1;

EINT; ERTM;

// For this example, init the ADC // EALLOW;// Specific ADC setup for this example: AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode: Sample rate = 1/[(2+ACQ_PS)*ADC clock in ns] // = 1/(3*40ns) =8.3MHz (for 150 MHz SYSCLKOUT) // = 1/(3*80ns) =4.17MHz (for 100 MHz SYSCLKOUT) // If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns] AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 级联 AdcRegs.ADCTRL3.bit.SMODE_SEL = 1; //同步采样 AdcRegs.ADCTRL1.bit.CONT_RUN = 0; // 启停模式 AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0; // 设置1对转换通道 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //设置ADC A0/B0为第一个变换 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; //使能SEQ1中断

// wait for adc interrupt for(;;) { LoopCount++; }}

interrupt void ADCINT_ISR(void) // ADC{ // SampleCount++; adc[0]= AdcRegs.ADCRESULT0 >>4; adc[1]= AdcRegs.ADCRESULT1 >>4; if (count<500) { abc1[count]= adc[0]; abc2[count]= adc[1]; count ++;} else{ count=0;} EALLOW; AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // PieCtrlRegs.PIEACK.bit.ACK1=1; //响应PIE同组中断 AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除AD中断的标志位 // EINT; //使能全局中断 // Insert ISR Code here

// To receive more interrupts from this PIE group, acknowledge this interrupt // PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Next two lines for debug only to halt the processor here // Remove after inserting ISR Code// asm (" ESTOP0"); // for(;;); PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

return;}

// INT1.7interrupt void TINT0_ISR(void) // CPU-Timer 0{ CpuTimer0.InterruptCount++;

// Acknowledge this interrupt to receive more interrupts from group 1 //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断 CpuTimer0Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志 CpuTimer0Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据 AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

return; // Insert ISR Code here

// To receive more interrupts from this PIE group, acknowledge this interrupt // PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Next two lines for debug only to halt the processor here // Remove after inserting ISR Code// asm (" ESTOP0");// for(;;);}

主函数以及两个中断函数

F28335 AD 如果采用软件触发AD转换的话,如何控制采样频率呢?

是否有例程可以参考呢?

ziting wang:

回复 Eric Ma:

能帮忙看看为什么这转化后不正常吗

void InitAdc(void){ extern void DSP28x_usDelay(Uint32 Count);

// *IMPORTANT* // The ADC_cal function, which copies the ADC calibration values from TI reserved // OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the // Boot ROM. If the boot ROM code is bypassed during the debug process, the // following function MUST be called for the ADC to function according // to specification. The clocks to the ADC MUST be enabled before calling this // function. // See the device data manual and/or the ADC Reference // Manual for more information.

EALLOW; SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // 使能ADC时钟 ADC_cal(); EDIS;

// To powerup the ADC the ADCENCLK bit should be set first to enable // clocks, followed by powering up the bandgap, reference circuitry, and ADC core. // Before the first conversion is performed a 5ms delay must be observed // after power up to give all analog circuits time to power up and settle

// Please note that for the delay function below to operate correctly the // CPU_RATE define statement in the DSP2833x_Examples.h file must // contain the correct CPU clock period in nanoseconds.

AdcRegs.ADCTRL3.all = 0x00E0; // Power up bandgap/reference/ADC circuits DELAY_US(ADC_usDELAY); // Delay before converting ADC channels

EALLOW; DSP28x_usDelay(50); AdcRegs.ADCTRL1.bit.RESET = 0; //0:无效,1:复位整个ADC模块 AdcRegs.ADCTRL1.bit.CPS = 0; //转换时间预标定器 0:f=CLK/1 1:f=CLK/2 AdcRegs.ADCTRL1.bit.ACQ_PS=4; //window ACQ_PS*Tclk(采样时间选择) AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //0:非连续运行,1:连续运行 AdcRegs.ADCTRL3.bit.ADCCLKPS = 1; //ADC内核时钟分频器:ADCLK = HSPCLK–75M/[2xnx(CPS+1)] AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //0:双排序器模式,1:级联排序器模式 AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //0:顺序采样,1:同步采样 AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0; //最大转换通道数 = MAXCONVn +1

/**********************输入通道选择排序*************************************/ AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; //ADC_A0–Udc // AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 1; //ADC_A1–Idc // AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 2; //ADC_A2–Ic // AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 3; //ADC_A3–Ib // AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 4; //ADC_A4–Ia // AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 5; //ADC_A5–Uc // AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 6; //ADC_A6–Ub // AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 7; //ADC_A7–Ua // AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 8; // // AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 9; //// AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 10; //// AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 11; ///**********************输入通道选择排序*************************************/

EDIS; AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //复位排序器:0=无效;1=复位排序器到CONV00状态 AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; //SEQ1的启动转换触发 AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; //级联排序器使能ePWM_SOCA}

然后是主函数,

while(1) { while(AdcRegs.ADCST.bit.INT_SEQ1==0);

AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; a=AdcRegs.ADCRESULT0>>4; b=a*1.0/4096*3; Oled_Print_5_6x8(2,2,b); }}

赞(0)
未经允许不得转载:TI中文支持网 » F28335 AD 如果采用软件触发AD转换的话,如何控制采样频率呢?
分享到: 更多 (0)