打印
[Kinetis]

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

[复制链接]
10592|109
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 FSL_TICS_ZJJ 于 2014-7-11 14:44 编辑

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

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
如果想配置ADC16位单端的最高采样频率,则可以做如下配置:
116位单端模式,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 16ADC最高转换率软件配置
本文通过使用CWPE里的Init_ADC模块配置,具体配置情况如下:

7
可以看到,和计算的结果一样,16ADC的连续转换时间可以达到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位实际采样结果测试
         使用信号发生器分别产生20Khz50khz80khz,然后将ADC配置为最大转换率,分别测试20Khz50Khz 80Khz得到的ADC结果,通过串口打印出来之后,再将点画成图,看波形是否失真。一共存储200ADC值,即可以存储大概450us的波形。下面分别展示在20Khz50khz80khz下的测试结果。
120Khz
测试原波形:                                                    测试ADC转换后的波形:
  

8 9
可见正弦波能够很清楚的回显出来,而且非常光滑。转换后的波形的横坐标是取的点号,一共200个点,纵坐标为ADC的采样值,最高值对应2.5V
250khz
测试原波形:
                                                   
10
测试ADC转换后的波形:
11
可见波形没有20K的时候光滑,但是波形还是能显示出来。
380khz
测试原波形:   
                                                
12
测试ADC转换后的波形:

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

相关帖子

沙发
FSL_TICS_ZJJ|  楼主 | 2014-7-10 17:13 | 只看该作者
不足之处,恳请指正,如果大家有什么问题,可以直接提出交流。

使用特权

评论回复
板凳
xinyinxing| | 2014-7-10 17:42 | 只看该作者
看看代码,感谢楼主分享。

使用特权

评论回复
地板
ar_m_cu| | 2014-7-10 18:32 | 只看该作者
KL25的16位ADC确实给力,要是通道数能再多些再加上DMA的支持就更好了

使用特权

评论回复
5
Imakey| | 2014-7-10 21:40 | 只看该作者
16ADC位确实给力,可以试试做个示波器

使用特权

评论回复
6
FSL_TICS_ZJJ|  楼主 | 2014-7-11 08:56 | 只看该作者
ar_m_cu 发表于 2014-7-10 18:32
KL25的16位ADC确实给力,要是通道数能再多些再加上DMA的支持就更好了


是支持DMA的哦,马上我们还会出一片关于KL25 16位和ADC结合的经验分享,到时候也可以看看并讨论哦。

使用特权

评论回复
7
FSL_TICS_ZJJ|  楼主 | 2014-7-11 08:57 | 只看该作者
Imakey 发表于 2014-7-10 21:40
16ADC位确实给力,可以试试做个示波器

结合上位机的确可以做的哦。

使用特权

评论回复
8
ar_m_cu| | 2014-7-11 09:02 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-7-11 08:56
是支持DMA的哦,马上我们还会出一片关于KL25 16位和ADC结合的经验分享,到时候也可以看看并讨论哦。 ...

恩,期待佳作

使用特权

评论回复
9
xinyinxing| | 2014-7-16 17:46 | 只看该作者
顶起,好资料!

使用特权

评论回复
10
FSL_TICS_Jeremy| | 2014-8-18 10:58 | 只看该作者
好贴啊,不能沉啊!

使用特权

评论回复
11
stone5195| | 2014-8-24 16:46 | 只看该作者
XUEXI

使用特权

评论回复
12
temp009| | 2014-9-11 09:23 | 只看该作者
好极了 刚好要看Knetis的SPI

使用特权

评论回复
13
FSL_TICS_Robin| | 2014-9-11 10:44 | 只看该作者
stone5195 发表于 2014-8-24 16:46
XUEXI

此帖中的systick应用测试代码执行时间非常实用,大家可以参考

使用特权

评论回复
14
xxlin1984| | 2014-9-11 11:00 | 只看该作者
Kinetis系列的ADC有个问题:当输入阻抗较大时,比如1Mohm,由于最小2MHz和最大20ADCLK取样的限制,会因采样时间不足而导致测量值偏低。
希望什么时候能把这模块改进下,比如放开取样周期数的限制。很多应用速度很慢,但精度要求很高的

使用特权

评论回复
15
bestray| | 2014-9-11 17:58 | 只看该作者

使用特权

评论回复
16
seaforestlove| | 2014-9-13 12:38 | 只看该作者
感谢高手的分享

使用特权

评论回复
17
jd972594| | 2014-9-15 10:26 | 只看该作者
xxlin1984 发表于 2014-9-11 11:00
Kinetis系列的ADC有个问题:当输入阻抗较大时,比如1Mohm,由于最小2MHz和最大20ADCLK取样的限制,会因采样 ...

好大的输入阻抗啊,不能通过跟随电路把阻抗调小一点吗?
阻抗大的话,ADC采样时间不够会很不准的。

使用特权

评论回复
18
xxlin1984| | 2014-9-15 11:05 | 只看该作者
jd972594 发表于 2014-9-15 10:26
好大的输入阻抗啊,不能通过跟随电路把阻抗调小一点吗?
阻抗大的话,ADC采样时间不够会很不准的。

比如NTC测-40度低温之类,如果加跟随且要保证0.1度的分辨率,就得上低温漂低偏差的运放,成本上不划算。

使用特权

评论回复
19
jd972594| | 2014-9-16 15:31 | 只看该作者
xxlin1984 发表于 2014-9-11 11:00
Kinetis系列的ADC有个问题:当输入阻抗较大时,比如1Mohm,由于最小2MHz和最大20ADCLK取样的限制,会因采样 ...

其实可以把硬件平均次数增多,这样对于内部采样电容的充电将会越来越接近被采样信号电压。
但是需要软件判断,将一开始那些尚未完全充电获得的AD值给滤掉。

使用特权

评论回复
20
xxlin1984| | 2014-9-18 09:09 | 只看该作者
jd972594 发表于 2014-9-16 15:31
其实可以把硬件平均次数增多,这样对于内部采样电容的充电将会越来越接近被采样信号电压。
但是需要软件 ...

没有用,若充电不足,则每次采集都会偏低(转换的时间比采集的时间长)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

165

主题

5069

帖子

88

粉丝