В таблице данных 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
}
Так что я делаю не так?