关于PSOC6 sar ADC 采样频率的疑问

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
zhji_4006061
Level 3
Level 3
25 replies posted 50 sign-ins First solution authored

Hi all :

     我在调试SAR-ADC的时候发现采样频率跟我实际测试结果存在差异。

    我的ADC配置如下:

     ADC clock rate : 16.667MHZ

     scan duration : 1.08 us

      采样频率 : 925926 sps

      通过函数Cy_SAR_StartConvert开始采样后,启动定时器,延时500 us后,通过函数Cy_SAR_StopConvert结束采样,我在ADC的ISR 函数中加入了全局变量来统计进入ISR的次数。

      延时800us ,ISR计数 371次 ,也就是采样了371次。按照scan duration =1.08 us,理论上应该1.08us就要采样一次,那正常应该是采样740次才对。

     为啥相差大呢?还是我对采样次数理解有问题?谢谢!

  

0 点赞
1 解答
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

我觉得您这里对于scan duration的理解有误,这里的scan duration是说他么转换时间需要这么长,根据手册描述,PSOC6 ADC转换时间最少需要18个clock,而您现在ADC 主时钟为16.667MHZ,那么他的转换时间就是=18/16.667 us,大约就是1.079us一次,所以这里的时间并不是采样周期,而是采样一次所需要的时间。

在原帖中查看解决方案

0 点赞
7 回复数
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

可以看下你的代码吗?这样,我们可以借着代码进行讨论。

0 点赞
zhji_4006061
Level 3
Level 3
25 replies posted 50 sign-ins First solution authored

下面是ADC  中断处理函数代码:

void ADC_ISR_Callback(void)
{
uint32_t intr_status;

intr_status = Cy_SAR_GetInterruptStatus(ADC_US_SAR__HW);

if ((intr_status & CY_SAR_INTR_EOS_MASK) == CY_SAR_INTR_EOS_MASK)
{
ADCresult = ADC_US_GetResult16(0);
Num_Adc++;
}

Cy_SAR_ClearInterrupt(ADC_US_SAR__HW, intr_status);
(void)Cy_SAR_GetInterruptStatus(ADC_US_SAR__HW);
}

0 点赞
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

我觉得您这里对于scan duration的理解有误,这里的scan duration是说他么转换时间需要这么长,根据手册描述,PSOC6 ADC转换时间最少需要18个clock,而您现在ADC 主时钟为16.667MHZ,那么他的转换时间就是=18/16.667 us,大约就是1.079us一次,所以这里的时间并不是采样周期,而是采样一次所需要的时间。

0 点赞
zhji_4006061
Level 3
Level 3
25 replies posted 50 sign-ins First solution authored

你的意思是  采样周期=转换时间+读取时间, 1.08 us 只是转换时间,没有包括读取时间?

0 点赞
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

应该是这样的,这个1.08us应该只是转换的时间,并不包括,读取的时间在里面,这个我去找人确认下,给你回复,但基于我现在的理解是这样的。

0 点赞
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

这样,你明天打电话给我,我跟你好好说一下,我们这个ADC-SAR的原理是什么样子的。我电话:13917979037

0 点赞
zhji_4006061
Level 3
Level 3
25 replies posted 50 sign-ins First solution authored

好的呀。刚才我做了个实验,把 ADC ISR里面读取数据的代码ADCresult = ADC_US_GetResult16(0);  注释掉后, 800us  采样次数是 740 ,与理论值是一样的

800 us  / 1.08us = 740,  代码如下:

void ADC_ISR_Callback(void)
{
uint32_t intr_status;

intr_status = Cy_SAR_GetInterruptStatus(ADC_US_SAR__HW);

if ((intr_status & CY_SAR_INTR_EOS_MASK) == CY_SAR_INTR_EOS_MASK)
{
//ADCresult = ADC_US_GetResult16(0);
Num_Adc++;
}

Cy_SAR_ClearInterrupt(ADC_US_SAR__HW, intr_status);
(void)Cy_SAR_GetInterruptStatus(ADC_US_SAR__HW);
}

0 点赞