ADICUP360: настройка sinc2-фильтра Σ-Δ АЦП для более быстрых преобразований - PullRequest
0 голосов
/ 30 апреля 2019

В таблице данных ADICUP360 на стр. 25 объясняется, что можно настроить АЦП с помощью фильтра sinc2 для коэффициентов преобразования 2 мс.

В нем говорится:

«На обоих АЦП выход модулятора Σ-Δ подается в цифровой фильтр sinc3 или sinc4. Однако для более быстрого времени отклика можно выбрать фильтр sinc2 для работы параллельно с фильтром sinc3 или sinc4 обоих АЦП., но фильтры sinc3 и sinc4 не могут работать одновременно. Этот фильтр sinc2 имеет настраиваемую частоту обновления с максимальной скоростью 2 мс и разрешением 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, то у меня есть следующий код, и это прекрасно работает:


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

}

Так что я делаю не так?

...