28335的AD采样值异常跳动问题.
(1)我的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;
}
我之前也遇到过AD采样出来的数值跟模拟值有很大的偏差,不知是为什么,忘高手指教!
小编你好。
我也遇到了相同的问题,ad采样值的跳动范围达到百分之十以上,不知小编是否解决,还望告知一下。
非常感谢!
为什么没有人来回答呢
之前搞28335AD采样的时候也遇到过类似情况。当时是采集一温度传感器输出的模拟量,发现转换结果浮动很大,一直找不到问题出在哪里。后来看到一个帖子,有人说到28335内部的AD外设采集精度不高,所以我就做了一个实验,就是用外置的AD芯片采集同一个模拟量,再用28335读取AD芯片的转换值,发现得到的数据确实比原来使用28335内置AD外设稳定很多。你可以试试这个方法有没有效果。
我也在做这个,希望能得到你的帮助。QQ1061638736邹丽蓉