28335的AD采样值异常跳动问题
我的28335在AD采用时出现了一个非常奇怪的异常跳动问题,我现在把具体现象描述一下:在AD口输入模拟电压不变(比如我是用1.65V)的情况下,我进行程序编译,下载,运行等,这个时候我观察ADmirror结果寄存器的值为2250, 2245, 2235, 2260, 2247, 2257, 2255等等,总之是围绕大约2250左右波动,因为我的1.65V毕竟也会有微小的波动。然而,当我disconnect后再connect,再进行第二次编译,下载,运行等,此时我观察ADmirror结果寄存器的值却变为2271, 2264, 2256, 2282, 2269, 2278, 2277等等,也就是说围绕2270左右波动。这样如此反复,发现在1.65V的模拟量输入不变的情况下,ADmirror结果寄存器的值却有两个基准,即这次调试时为2250左右,下次调试时为2270左右,很奇怪的现象。这个感觉很不正常,它不是说程序在运行中AD采样值的波动范围大小问题,而是说每当重新下载程序运行时AD采样值的基准跳动问题。这样给我带来的问题就是,我在调试三相并网逆变器时,对三相输入电压采样并生成SPWM时波形会变得一次编译下载运行时平衡的,另一次重新编译下载运行时却不平衡,见附件波形图。顺便说一下,基准值的跳动就这两种情况,没有第三种情况了。 (2)另外,我跟我的导师已经确认过了:进入AD口的模拟量没问题,而从处理AD结果寄存器的第一条指令开始往后也都没问题(因为我们用理想正弦波验证了)。 (3)我的AD配置如下: #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#define ADC_usDELAY 5000L void InitAdc(void) { extern void DSP28x_usDelay(Uint32 Count); EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
ADC_cal();
EDIS; AdcRegs.ADCTRL3.all = 0x00E0; DELAY_US(ADC_usDELAY); } void ConfigAdc(void) { AdcRegs.ADCTRL1.all = 0x0;
AdcRegs.ADCTRL1.bit.ACQ_PS = 0x3;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0x1;
AdcRegs.ADCTRL1.bit.CPS = 0x0;
AdcRegs.ADCTRL1.bit.CONT_RUN = 0x0; AdcRegs.ADCTRL2.all = 0x0; AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x3; AdcRegs.ADCTRL3.bit.SMODE_SEL = 0x0; AdcRegs.ADCMAXCONV.all = 0x000F;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x3;
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x4;
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x1;
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x2;
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x7;
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x8;
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x9;
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xA;
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0xB;
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0xC;
AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xD;
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xE;
AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0xF; AdcRegs.ADCST.all = 0; //clear all flag AdcMirror.ADCRESULT0 = 0x0;
AdcMirror.ADCRESULT1 = 0x0;
AdcMirror.ADCRESULT2 = 0x0;
AdcMirror.ADCRESULT3 = 0x0;
AdcMirror.ADCRESULT4 = 0x0;
AdcMirror.ADCRESULT5 = 0x0;
AdcMirror.ADCRESULT6 = 0x0;
AdcMirror.ADCRESULT7 = 0x0;
AdcMirror.ADCRESULT8 = 0x0;
AdcMirror.ADCRESULT9 = 0x0;
AdcMirror.ADCRESULT10 = 0x0;
AdcMirror.ADCRESULT11 = 0x0;
AdcMirror.ADCRESULT12 = 0x0;
AdcMirror.ADCRESULT13 = 0x0;
AdcMirror.ADCRESULT14 = 0x0;
AdcMirror.ADCRESULT15 = 0x0; DELAY_US(ADC_usDELAY); } (3)我的AD是放在ePWM中断里进行开启,转换以及读取的: interrupt void ePWM1A_compare_isr(void)
{ AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0x1;
while (AdcRegs.ADCST.bit.SEQ1_BSY != 0)
{
asm(" NOP");
} Ugab_AD = AdcMirror.ADCRESULT3;
Ugbc_AD = AdcMirror.ADCRESULT4; 略。。。。。。。。。。。。。。。。。。。。 EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; }
|