ADICUP360:配置Σ-ΔADC的sinc2滤波器以加快转换速度

时间:2019-04-30 14:59:05

标签: c arm microcontroller cortex-m3 adc

在第25页的ADICUP360的数据手册中,解释了可以通过其sinc2滤波器配置ADC的转换速率为2 ms。

它说:

  

“在两个ADC上,Σ-Δ调制器的输出都被馈送到一个Sinc3或sinc4数字滤波器。但是,为了获得更快的响应时间,一个sinc2滤波器可以   可以选择与两个ADC的sinc3或sinc4滤波器并行工作,但sinc3和sinc4滤波器不能同时工作。   该sinc2滤波器具有可配置的更新速率,最快速度为2 ms,有效位分辨率为14。 sinc2的输出   过滤器被馈送到单独的结果寄存器STEPDAT。”

当我尝试此操作时,生成的代码如下:

初始化代码:

void ADC1INIT(void)

{
    //AdcMski(pADI_ADC1,ADCMSKI_RDY,1);              // Enable ADC ready interrupt source
    AdcFlt(pADI_ADC1,2,2,FLT_NORMAL|ADCFLT_SINC4EN| ADCFLT_NOTCH2); // for fast conversion mode -> see data sheet p. 28

    // enable SINC2 filter, set adc1 as source for sinc2, set conversion rate at 2 ms, ref-detection off
    AdcDetCon(pADI_ADCSTEP, DETCON_SINC2_EN, DETCON_ADCSEL,DETCON_RATE_2ms

    AdcRng(pADI_ADC1,ADCCON_ADCREF_INTREF,ADCMDE_PGA_G1,ADCCON_ADCCODE_INT); // Internal reference selected, Gain of 1, Signed integer output

    // Turn off input buffers to ADC and external reference 

AdcBuf(pADI_ADC1,ADCCFG_EXTBUF_OFF,ADCCON_BUFBYPN|ADCCON_BUFBYPP|ADCCON_BUFPOWP|ADCCON_BUFPOWN);

    // positive input -> AIN0, negative input -> AIN1
    AdcPin(pADI_ADC1,ADCCON_ADCCN_AIN1,ADCCON_ADCCP_AIN0);
}

执行转换的代码:


AdcGo(pADI_ADC1, ADCMDE_ADCMD_SINGLE);  // start single conversion
while(1)
{
    while (AdcDetSta(pADI_ADCSTEP) != DETSTA_STEPDATRDY)
    {
        // wait for ADC result  <- STUCK HERE !!!!!
    }
    int32_t sample = AdcStpRd(pADI_ADCSTEP);

    char str[8];
    sprintf(str, "%08lx", sample);  // convert int32_t to hex-string
    prinft(str);
    AdcGo(pADI_ADC1, ADCMDE_ADCMD_SINGLE);  // carry out a single conversion <- ready at next timer-interrupt

}

上面的代码无效。 “ AdcDetSta(pADI_ADCSTEP)”将不会变为“ DETSTA_STEPDATRDY”。

如果我不使用STEPDAT寄存器,而是使用普通的AdcSta-Register,那么我有以下代码,并且可以正常工作:


AdcGo(pADI_ADC1, ADCMDE_ADCMD_SINGLE);  // start single conversion
while(1)
{
    while (AdcSta(pADI_ADC1) != ADC1STA_RDY)
    {
            // wait for ADC result  <- WORKS FINE
    }
    int32_t sample = AdcRd(pADI_ADC1);*/

    char str[8];
    sprintf(str, "%08lx", sample);  // convert int32_t to hex-string
    prinft(str);
    AdcGo(pADI_ADC1, ADCMDE_ADCMD_SINGLE);  // carry out a single conversion <- ready at next timer-interrupt

}

那我在做什么错了?

0 个答案:

没有答案