在第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
}
那我在做什么错了?