飞思卡尔的KL25单片机AD做的是很不错的,SAR型能做到16位。不过数据手册就写得不怎么样了,简直可以说是坑爹,很难看懂。有的描述让人难以理解,你指望在别的地方对不理解的地方会有其他角度的描述,结果你发现关于同一描述,他们坚定的采用了复制粘贴的办法!擦!

而且,我还发现了数据手册的错误。用户手册上给出了一个案列,AD工作在16bit单端模式下ADCK为1MHZ,但是数据手册上注明如果AD工作在16比特模式,ADCK必须至少2MHZ,你说这不是坑爹不是!我给官网发了邮件,他们打哈哈让我去社区搜帖子。

结果,我看了整整一天的时间,跳过了很多不重要的功能,才能写出AD采集代码。这玩意寄存器20多个,手册有50页,很复杂。

我要采集的是地震波,只需要1K的采样率即可,特别低,通道为ADC0_SE4b。

下面是初始化代码,全是配置寄存器,中间用到了飞思卡尔自己提供的自校准函数,老实说,自校准这一块我根本没看。本函数使用连续采样,用到了硬件平均功能,让采集的32点做个平均之后再保存到结果寄存器中,目的也是降低采样率。禁用中断,禁用DMA。

void init_ADC16(void){
  
          // Turn on the ADC0 clock as well as the PDB clocks to test ADC triggered by PDB
            SIM_SCGC6 |= (SIM_SCGC6_ADC0_MASK );
//            SIM_SCGC6 |= SIM_SCGC6_PDB_MASK ; pdb
   //         PMC_REGSC |= PMC_REGSC_BGBE_MASK ;  
               
            // setup the initial ADC default configuration              
            Master_Adc_Config.CONFIG1  = ADLPC_LOW
              | ADC_CFG1_ADIV(ADIV_4)
              | ADLSMP_LONG
              | ADC_CFG1_MODE(MODE_16)
              | ADC_CFG1_ADICLK(ADICLK_BUS_2);
            Master_Adc_Config.CONFIG2  = MUXSEL_ADCB    //通道选择
              | ADACKEN_DISABLED
              | ADHSC_NORMAL
              | ADC_CFG2_ADLSTS(ADLSTS_20) ;        //增加20时钟
       //     Master_Adc_Config.COMPARE1 = 0x1234u ;                 // can be anything
       //     Master_Adc_Config.COMPARE2 = 0x5678u ;                 // can be anything
            // since not using
            // compare feature
            Master_Adc_Config.STATUS2  = ADTRG_SW             //软件触发
              | ACFE_DISABLED                              //禁止比较                                
              | ACFGT_GREATER
              | ACREN_DISABLED
              | DMAEN_DISABLED                  //禁止DMA
              | ADC_SC2_REFSEL(REFSEL_EXT);      //设定电压参考源
            
            Master_Adc_Config.STATUS3  = CAL_OFF  
              | ADCO_CONTINUOUS                        //连续采集
              | AVGE_ENABLED                      //允许硬件平均
              | ADC_SC3_AVGS(AVGS_32);               //32点平均,降低采样速率
            
            Master_Adc_Config.STATUS1A = !AIEN_ON | DIFF_SINGLE | ADC_SC1_ADCH(4);
              
            // Configure ADC as it will be used, but becuase ADC_SC1_ADCH is 31,
            // the ADC will be inactive.  Channel 31 is just disable function.
            // There really is no channel 31.
            
            ADC_Config_Alt(ADC0_BASE_PTR, &Master_Adc_Config);  // config ADC
              
            
            // Calibrate the ADC in the configuration in which it will be used:
            ADC_Cal(ADC0_BASE_PTR);                    // do the calibration
            
            // The structure still has the desired configuration.  So restore it.
            // Why restore it?  The calibration makes some adjustments to the
            // configuration of the ADC.  The are now undone:
            
            // config the ADC again to desired conditions
            ADC_Config_Alt(ADC0_BASE_PTR, &Master_Adc_Config);
}

主函数部分

void init_ADC16(void);
tADC_Config Master_Adc_Config;
int main(void)
{    
 char j=0;
 char i=0;
 uint16 xinhao[216];   //定义数组
 init_ADC16();
    for (j=0;j<216;j++)
    {
      while (!(ADC0_SC1A & ADC_SC1_COCO_MASK) );  //查询办法,标志位没有置1,就一直等着
      xinhao[j]=ADC0_RA;
    }
    ADC0_SC1A =0x0000001F ; //停止AD采样
 for (i=0;i<216;i++)
 printf("第%d点为%d", i,xinhao[i]);
 return 0;
}

这里要说的是,IAR调试经常会发现单步执行和全速执行结果不一样,这是因为缺少延时控制。尤其是对外设的操作代码最容易出错。

外设反应较慢,需要较长的时钟周期,而CPU执行很快,它必须等待外设。比如,我们某一句代码擦除flash,下一句就判断flash的寄存器是否为0,如果单步执行这是正确的,但是全速执行就不会正确。因为单步执行的时候,步与步之间的延时使得CPU有时间擦除flash,但是全速执行的时候根本没有这个时间。

还有,如果某一标志位大部分时间为0,一瞬间为1表示某过程结束,代码怎么写也是有讲究的。比如AD采样,COCO标志位在结果没出来之前一直为0,直到结果出来了为1,我们采用查询的方法来判断COCO的时候,正确的写法

不是while (COCO==1){  执行。。。。。。}

而是while (!COCO); 执行。。。。。。

因为第一种写法在COCO==0的时候就会直接跳过while语句。而第二种写法在COCO==0时,会一直等到COCO为1,这就是在等待外设。

使用IAR还有一个技巧。IAR你的局部变量会在用完之后被清掉。这很烦人,因为有时候你想看它们的值。一个有效的办法,就是在你的断点之后,对该变量加一个打印语句,只要有这条语句存在,局部变量的值在执行到断点的时候就不会被清掉。

最后贴一下AD采集到的数据:

KL25的AD采集操作的更多相关文章

  1. STM32F412应用开发笔记之三:SPI总线通讯与AD采集

    本次我们在NUCLEO-F412ZG试验模拟量输入采集.我们的模拟量输入采用ADI公司的AD7705,是一片16位两路差分输入的AD采集芯片.具有SPI接口,我们将采用SPI接口与AD7705通讯.两 ...

  2. AD采集问题

    在调试AD采集时想问的一些问题 1.电路原理图中的VSS是什么意思? 2.电路原理图中的VDD是什么意思? 3.电路原理图中的VREF+和VREF-是什么意思? 4.电路原理图中的VBAT是用来干什么 ...

  3. TI 28335和AD采集

    使用TI 28335和片外AD7606,一个AD有8个通道可以采集,激活AD采集: #define EXTADLZ0 *(int *)0x4200 // Zone 0, ADC data, ADCH1 ...

  4. [ZigBee] 9、ZigBee之AD剖析——AD采集CC2530温度串口显示

    1.ADC 简介 ADC 支持多达14 位的模拟数字转换,具有多达12 位有效数字位.它包括一个模拟多路转换器,具有多达8 个各自可配置的通道:以及一个参考电压发生器.转换结果通过DMA 写入存储器. ...

  5. FPGA在AD采集中的应用

    AD转换,也叫模数转换,是将模拟信号转换为数字信号.目前包括电脑CPU,ARM,FPGA,处理的信号都只能是数字信号,所以数据信号在进入处理芯片前必须要进行AD转换. 在高速的AD转换中,FPGA以其 ...

  6. STM32F0使用LL库实现DMA方式AD采集

    在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.在本文中我们将介绍基于LL库的ADC的DM ...

  7. AM57x 多核SoC开发板——GPMC的多通道AD采集综合案例手册(上)

    目 录 1 ----案例功能 2 ----操作说明 2.1 ----硬件连接 2.2 ----案例测试 2.3 ----使用CCS查看信号波形 2.3.1 ----加载Symbols信息表 2.3.2 ...

  8. 关于多个 Kubernetes 集群指标的采集操作

    简介 在使用观测云期间,有时需要针对一个工作空间接入多个 Kubernetes 集群指标,通过观测云提供的全局 Tag 的方式来进行区分,大大提高了效率.下面是我总结的操作步骤. 当集群中只有一个采集 ...

  9. 利用AD采集获取外部温度传感器的值

    #include "led.h" #include "delay.h" #include "key.h" #include "sy ...

随机推荐

  1. Appium Android Bootstrap源码分析之控件AndroidElement

    通过上一篇文章<Appium Android Bootstrap源码分析之简介>我们对bootstrap的定义以及其在appium和uiautomator处于一个什么样的位置有了一个初步的 ...

  2. bat启动/停止oracle服务

    原文:bat启动/停止oracle服务 自己的电脑比较慢,尤其装了oracle10g后,服务开启和关闭用bat文件操作省事点 开启服务 @echo offnet start OracleService ...

  3. RegularExpressionValidator控件

    原文:RegularExpressionValidator控件 ★搜Asp.net★(www.soAsp.net),为专业技术文档网站.包括Asp.net开发技术文档·C#开发技术文档·Access/ ...

  4. 快速构建Windows 8风格应用22-MessageDialog

    原文:快速构建Windows 8风格应用22-MessageDialog 本篇博文主要介绍MessageDialog概述.MessageDialog常用属性和方法.如何构建MessageDialog ...

  5. 移动端App混合开发问题 汇总

    1.IOS系统,双击页面,页面会向上移动一节,无法滑动复原. //阻止用户双击放大 var agent = navigator.userAgent.toLowerCase(); //检测是否是ios ...

  6. Ora中select某时间段记录sql语句

    要查找某时间段的记录,例如查找2013-11-1到2013-11-30的记录. ' group by user_name, user_id 注意:SQL语句中含有sum累加函数,末尾要加group b ...

  7. IE支持CSS3圆角

    在CSS中使用CSS插件文件即可让IE6/IE7/IE8浏览器. 具体CSS代码: .yuan { border: 2px solid #C0C0C0; -moz-border-radius: 10p ...

  8. 邮箱自动完成(jquary效果)

    邮箱自动完成的效果在网站上大多都看过,但是质量参差不齐,今天突然在网上看到一篇博客,感觉这个插件很好,就想来写一下分享给大家! 效果图如下! 完整demo代码如下: <!DOCTYPE html ...

  9. iOS基础 - 触摸事件与手势识别

    一.iOS的输入事件 UIKit可识别三种类型的输入事件: 触摸事件 运动(加速计)事件 远程控制事件 二.UIEvent iOS中许多事件对象都是UIEvent类的实例,记录事件产生的时刻和类型 U ...

  10. Intellij Idea/Webstorm/Phpstorm

    Intellij Idea/Webstorm/Phpstorm 的高效快捷键   1. shift + F6可以理解为F2的豪华重量版,不但可以重命名文件名,而且可以命名函数名,函数名可以搜索引用的文 ...