This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

f28035例程 adc采样结果不正确

Other Parts Discussed in Thread: CONTROLSUITE

使用的开发板:

我下载的28035例程关于adc采样的,DSP2803x_examples\adc_soc,我在程序中跑时,从AdcResult.ADCRESULT0得到的采样数字量与实际电压值经过

4096*(input  Analog -0)/3.3运算得到的值不对,要小的多这是为什呢,我程序都没动,基准电压是用的内部参考:

AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power ADC BG
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power reference
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Select interal BG

  • 你好,

    AdcResult.ADCRESULT0寄存器数据时高12位有效,所以需要先右移四位,然后这个值/4093*3(ADC的输入是0~3V,不是DSP引脚电压3.3V)得到DSP引脚电压,这个电压是经过电路处理得到的,通常是经过比例和增益等到的结果,所以一般要减去一个偏置值,乘以一个系数,得到真实的电流值。

  • 要进行偏置校准。

    在adc.c中有一个函数void AdcOffsetSelfCal()

    Eric

  • 你好,我想问一个关于AdcOffsetSelfCal函数的一个问题。我根据例程写的ADC程序,然后在RAM里面运行好好的,但是我一烧录到flash里面运行后,程序就在这个函数里面的一个标志位判断上面死循环了。而且在flash里面执行InitAdc中的延时函数DALAYUS时会出错
  • 当程序跑在flash的时候,你需要调用memcpy函数,将有些运行在RAM的函数复制到RAM中运行,如DELAY US,如initlfash。

    参考历程

    C:\ti\controlSUITE\device_support\f2803x\v130\DSP2803x_examples_ccsv5\flash_f28035

    Eric

  • 你好,这个例程我看了,试过了把DELAY_US弄到RAM里面运行。可是为什么我又写了一个小小的程序,在主函数直接调用DELAY_US函数闪烁LED,烧录到flash后没有调用memcpy函数也可以运行,貌似周期也没变大。

    然后,ADC的程序烧录到flash时,运行到AdcOffsetSelfCal()就会卡在下面那判断ADC转换是否完成的地方,可是在RAM调试时就没有这样。

    下面是在flash运行时AdcOffsetSelfCal()函数里面调用到的AdcConversion()函数,程序在判断标志位时进入死循环

    //ADC Conversion

    AdcRegs.ADCSOCFRC1.all = 0x00FF; // Force Start SOC0-7 to begin ping-pong sampling

    while( index < SampleSize ){

    //Wait for ADCINT1 to trigger, then add ADCRESULT0-7 registers to sum
    while (AdcRegs.ADCINTFLG.bit.ADCINT1 == 0){}
    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //Must clear ADCINT1 flag since INT1CONT = 0
    Sum += AdcResult.ADCRESULT0;
    Sum += AdcResult.ADCRESULT1;
    Sum += AdcResult.ADCRESULT2;
    Sum += AdcResult.ADCRESULT3;
    Sum += AdcResult.ADCRESULT4;
    Sum += AdcResult.ADCRESULT5;
    Sum += AdcResult.ADCRESULT6;
    // Wait for SOC9 conversion to start, which gives time for SOC7 conversion result
    while( AdcRegs.ADCSOCFLG1.bit.SOC9 == 1 ){}
    Sum += AdcResult.ADCRESULT7;

    //Wait for ADCINT2 to trigger, then add ADCRESULT8-15 registers to sum
    while (AdcRegs.ADCINTFLG.bit.ADCINT2 == 0){}
    AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1; //Must clear ADCINT2 flag since INT2CONT = 0
    Sum += AdcResult.ADCRESULT8;
    Sum += AdcResult.ADCRESULT9;
    Sum += AdcResult.ADCRESULT10;
    Sum += AdcResult.ADCRESULT11;
    Sum += AdcResult.ADCRESULT12;
    Sum += AdcResult.ADCRESULT13;
    Sum += AdcResult.ADCRESULT14;
    // Wait for SOC1 conversion to start, which gives time for SOC15 conversion result
    while( AdcRegs.ADCSOCFLG1.bit.SOC1 == 1 ){}
    Sum += AdcResult.ADCRESULT15;

    index+=16;

    } // end data collection

  • 对了,还有一个问题对memcpy的,是不是如果要把某个函数放到RAM里面运行,应该在那个函数所在的C文件开头使用#pragma CODE_SECTION(InitFlash, "ramfuncs");?

    然后main函数里面的memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize);是不是只要出现在移动到RAM里执行的函数执行之前,它就自动把所有要移动到RAM里的函数转移过去?

    谢谢解答!

  • #pragma语句是预编译指令,不管出现在程序的后面还是前面都会在预编译的时候就固定他所放的位置