搜索
bottom↓
回复: 26

【经验分享】KL25 16位ADC最高转换率代码效率测试及采样测试

[复制链接]

出0入0汤圆

发表于 2014-7-10 17:21:13 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_Robin 于 2014-7-18 14:30 编辑

【经验分享】KL25 16位单端ADC最高转换频率下代码效率测试及被采波形复现
一,        KL25 16位ADC最高转换率基本知识
  要将16位ADC的转换率配置为最高,首先需要选择最高的ADC模块转换时钟频率,16位ADC模块转换时钟范围可以在KL25的datasheet中查看到:

图1
如果实际的Bus时钟配置为24Mhz,那么ADC转换时钟频率fADCK要达到最高,就需要bus时钟二分频,即ADCx_CFG1[ADICLK]=(0b)01。
         从用户手册中可知,ADC的转换时间公式为:
   ConversionTime=SFCAdder+AverageNum*(BCT+LSTAdder+HSCAdder).
其中SFCAdder为单次或者连续采样的第一次转换时间,具体的时间可以查看如下表格:

图2
AverageNum即平均数因子,由SC3[AVGE]和SC3[AVGS]寄存器配置决定。可以通过如下表格查看具体情况:

图 3
BCT,基本转换时间,这个和选择的ADC转换位数以及单端还是差分有关,具体可以查看如下表格:

图4
LSTAdder,即长采样时间,具体可以查看如下表格:

图5
HSCAdder,即高速转换时间,具体可以查看如下表格:

图6
如果想配置ADC为16位单端的最高采样频率,则可以做如下配置:
(1)16位单端模式,bus时钟24Mhz作为输入源
(2)输入时钟二分频作为ADC的转换时钟频率fadck.
(3)长采样时间禁止
(4)高速采样使能
(5)连续采样,平均因子选择为1.
通过如上的设置可以知道,首次单端连续采样的时间=5 ADCK cycles + 5 bus clock cycles+25 ADCK cycles +2 ADCK cycles =2.875us
其余的连续采样时间=25 ADCK cycles +2 ADCK cycles=2.25us。则可以知道,以后的连续采样频率可以最高可以高达444.44khz。
下面讲一下乃奎斯特采样定理:在进行模拟/数字信号的转换过程中,当采样频率大于信号中最高频率的2倍时,采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的5~10倍;
所以可以知道,实际应用中,我们能够达到的信号采样频率可以高达(44Khz~88khz)。当然,随着一个周期中采样点的减少,波形肯定会变的不是很好。
二,        KL25 16位ADC最高转换率软件配置
本文通过使用CW中PE里的Init_ADC模块配置,具体配置情况如下:

图7
可以看到,和计算的结果一样,16位ADC的连续转换时间可以达到2.25us,即转换频率可以达到444.44Khz,除了第一次转换之外。另外,ADC的引脚选择的是ADC0_SE8/TSI0_CH0/PTB0/LLWU_P5/I2C0_SCL/TPM1_CH0。
然后在ADC的转换完成中断中加上如下代码:
   void ADC0_Isr(void)
    {

        if (( ADC0_SC1A & ADC_SC1_COCO_MASK ) == ADC_SC1_COCO_MASK)
         {  
                if(cnt<200) envia_dados[cnt++] = ADC0_RA;
                else ADC0_SC1A &= 0xbf;
         }
}
如果ADC0转换完成,则取值放到数组envia_dados中,一共取200个点,取完则关闭ADC中断。

三,        ADC中断中代码效率测试
                通过systick测试取值代码时间,测试代码如下:
                  cnt=1;
                        systick_init();       
                        cnt_start_value = SYST_CVR;
                  
                    
                       
                        if(cnt<200) envia_dados[cnt++] = ADC0_RA;
                        else ADC0_SC1A &= 0xbf;
                       
                        cnt_end_value = SYST_CVR;
                        systick_disable();
                        overhead = cnt_start_value - cnt_end_value-overhead;
                        printf("systick start value: 0x%x\n\r", cnt_start_value);
                        printf("systick end value: 0x%x\n\r", cnt_end_value);
                        printf("systick current value read overhead: 0x%x\n\r", overhead);
其中overhead是连续两次读SYST_CVR;所花费的systick值,测出来是7。
打印出的结果如下:
systick start value: 0xfffff3

systick end value: 0xffffc2

systick current value read overhead: 0x2a
则可知,读取的代码执行需要0x2a=42, 则一共花费的时间=42/48Mhz=0.875us,在一次ADC转换时间2.25us之间,所以不会影响ADC的采样。

四,        ADC 16位实际采样结果测试
         使用信号发生器分别产生20Khz,50khz,80khz,然后将ADC配置为最大转换率,分别测试20Khz,50Khz, 80Khz得到的ADC结果,通过串口打印出来之后,再将点画成图,看波形是否失真。一共存储200个ADC值,即可以存储大概450us的波形。下面分别展示在20Khz,50khz,80khz下的测试结果。
(1)20Khz
测试原波形:                                                    测试ADC转换后的波形:
   
图8,

图9
可见正弦波能够很清楚的回显出来,而且非常光滑。转换后的波形的横坐标是取的点号,一共200个点,纵坐标为ADC的采样值,最高值对应2.5V。

(2)50khz
测试原波形:                                                   
  
图10
测试ADC转换后的波形:

图11
可见波形没有20K的时候光滑,但是波形还是能显示出来。
(3)80khz
测试原波形:                                                   


图12
测试ADC转换后的波形:


图13
可见,测试之后的波形光滑度已经很低,这时候,ADC转换率大概是被采波形的5倍,随着采样倍数的减小,波形光滑度降低,但是基本还是能复现原波形。
五,        附件
给出了测试代码,感兴趣大家可以自行查看测试。







PS:本帖可从飞思卡尔版块置顶帖:飞思卡尔Kinetis资料大本营飞思卡尔论坛支持小组【经验分享】帖汇总链接进入。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2014-7-10 17:23:32 | 显示全部楼层
不足之处欢迎指正,如果大家有什么问题可以提出一起交流。

出0入0汤圆

发表于 2014-7-10 17:36:07 | 显示全部楼层
学习一下。很详细的教程。希望越做越好。

出0入0汤圆

发表于 2014-7-10 17:45:51 | 显示全部楼层
谢楼主分享,学习中~!

出0入0汤圆

 楼主| 发表于 2014-7-11 15:13:08 | 显示全部楼层
pirdoll 发表于 2014-7-10 17:36
学习一下。很详细的教程。希望越做越好。

嗯啊,那是必须的。
我们以后会分享更多详细文档,都是实际中遇到的经验。

出0入0汤圆

发表于 2014-7-11 15:21:14 | 显示全部楼层
好贴!赞

出130入129汤圆

发表于 2014-7-11 15:26:15 | 显示全部楼层
16位AD的单片机,很有诱惑力

出0入0汤圆

发表于 2014-7-11 16:44:52 | 显示全部楼层
16位AD的单片机,很有诱惑力,  谢楼主分享,学习中~!

出0入0汤圆

发表于 2014-7-11 22:13:25 | 显示全部楼层
早点出来就好了,也不会选STM32F3系列的了

出0入0汤圆

发表于 2014-7-16 09:11:35 | 显示全部楼层
SysTick的应用很不错,测试内部外设的工作时间方便多了。

出0入0汤圆

发表于 2014-7-16 17:06:09 来自手机 | 显示全部楼层
正打算用16位

出0入0汤圆

发表于 2014-7-16 17:36:54 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2014-7-29 13:42:21 | 显示全部楼层
有实测直流信号的数据吗? 想看看16bit ADC 能到啥水平

出0入0汤圆

发表于 2014-7-30 13:56:38 | 显示全部楼层
16bit 的ADC
应该比我以前用的S12XS系列微控制器12bit的ADC强很多呢

出0入0汤圆

发表于 2014-9-3 10:36:25 | 显示全部楼层
谢谢分享,收了。

出0入0汤圆

发表于 2014-9-3 11:50:33 来自手机 | 显示全部楼层
多谢分享

出0入0汤圆

发表于 2014-9-3 12:01:34 | 显示全部楼层
不错的资料,下了精研

出100入101汤圆

发表于 2014-9-3 16:12:19 | 显示全部楼层
收藏,备用

出0入0汤圆

发表于 2014-9-3 16:55:41 | 显示全部楼层
多谢分享,学习了

出0入0汤圆

发表于 2014-9-3 16:57:04 | 显示全部楼层
16位ADC的单片机 飞思卡尔就是牛

出0入0汤圆

发表于 2014-9-3 16:58:58 | 显示全部楼层
johncoop 发表于 2014-9-3 16:57
16位ADC的单片机 飞思卡尔就是牛

要是速度再快点就好了

出0入0汤圆

发表于 2015-2-4 10:37:39 | 显示全部楼层
16bit 有效位能达到多少?  和官方的数据手册  能对上吗?

出0入0汤圆

 楼主| 发表于 2015-2-5 09:20:38 | 显示全部楼层
ljt80158015 发表于 2015-2-4 10:37
16bit 有效位能达到多少?  和官方的数据手册  能对上吗?

最高有效位可以达到14.5位,具体请查看数据手册。

出0入0汤圆

发表于 2015-2-5 10:15:04 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-2-5 09:20
最高有效位可以达到14.5位,具体请查看数据手册。

真的能达到   14.5bit?

出0入0汤圆

 楼主| 发表于 2015-2-5 11:17:27 | 显示全部楼层
ljt80158015 发表于 2015-2-5 10:15
真的能达到   14.5bit?

按照DATASHEET的测试要求,是可以的。

出0入0汤圆

发表于 2015-2-5 19:00:43 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2015-2-5 11:17
按照DATASHEET的测试要求,是可以的。

正好做完项目后试试

出0入0汤圆

发表于 2015-2-6 13:18:13 | 显示全部楼层
比较关注16位AD能达到的实际精度,不知有无类似实验?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 10:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表