从零入手Kinetis系统开发(七)之ADC模块-_第1页
从零入手Kinetis系统开发(七)之ADC模块-_第2页
从零入手Kinetis系统开发(七)之ADC模块-_第3页
从零入手Kinetis系统开发(七)之ADC模块-_第4页
从零入手Kinetis系统开发(七)之ADC模块-_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、【原创】从零入手Kinetis系统开发(七之ADC模块2012-02-2922:52发表系统分类:嵌入式系统自定义分类:Kinetis标签:Kinetis K60IAR ADC今天是2月最后一天,而且还是四年一次的2月29日,为了纪念这难得的一天还是决定写点东西,呵呵。在连续写了几篇有关飞思卡尔开发环境(IDE的博客之后,觉着虽然有点新意有点小技巧在里面,不过看多了估计大家也看腻歪了也会觉着其实写了那么多没实际内容(其实真有的,这些小技巧我还是花费了一些心思专研了一番的,哈哈,所以这次就再爆点实料,继续更新从零入手系列。前一阵儿,自己的确在找状态,因为放假回来之后觉着对Kinetis生疏了不少

2、,思路有些空白,所以私底下弥补了一番,真的是台上十分钟,台下十年功,当然不是在给开源者邀功颂德之类的,就是明白了为什么好多人不愿意开源,其实一方面可能的确涉及到自己的知识产权和核心的东西,还有就是想要开源不单单是简单的贴出源代码这么简单(这点很同意AET博主说的,其实作为开源者也是,作为开源者,开源常常会拖带一些麻烦的义务还有因为自己辛苦的劳动被别人简单的贴出去连转载两个字都不加的委屈,说真的,简单的贴出源代码,估计没几个人能看懂,当然代码风格好的就不算了,嘿嘿,所以开源需要很大的勇气。晕,又扯偏了,呵呵,还是继续说正事吧,哈哈又是老惯例,啰嗦了一堆,所以老朋友可以直接跳的该段了,哈哈,本篇就

3、拿Kinetis的ADC模块开刀,其实有过网友说急需DMA的例程还有说写写细说寄存器使用方法之类的,不是不想写,是的确我还没用到DMA之类的,所以可能还需一些时日,不过保证肯定会有的,如果有先写出来的还是欢迎分享出来,独乐乐不如众乐乐嘛,哈哈,下面进入正题:1.Kinetis的ADC模块的一些特点(以K60为例,挑重要的说了,一些AD模块常见的特点就不提了,呵呵:(1最高16位AD转换精度,逐次逼近型的,所以速度没问题,而且能做到如此精度已实属不易了,再往高估计就该换-的了;(2最多4对差分模拟输入通道和24个单端模拟输入通道,对一般工业应用足够了,其实在对AD要求不高的应用还是用内部AD好些

4、,选外部AD的话一是操作起来麻烦,还有就是对模拟电路布局布线上还是有些技巧的;(3输出精度可选,例如差分的话可编程16位,13位,11位和9位模式,单端的话可编程为16位, 12位,10位和8位,不明白为什么差分精度非要比单端多1位,有知道的希望不吝告诉一下,在下面留言即可,呵呵;(4输入时钟可选四种时钟,即bus_clock,bus_clock/2,ALTCK,ADACK;(5内设内部温度传感器,用于监控芯片温度,这个还是有一定用途的,不过对他的精度不要有过高期望;(6硬件平均功能,对AD转换结果在队列里平均之后输出,挺实用的,要是再能对列排列一下就好了,咳咳,有点要求太高了,哈哈;(7带自

5、校准模式,用过外部AD的知道,这个功能是必须的但又颇有点小道道的,深入做过项目的肯定知道,呵呵;(8最高64倍PGA(programable gain Amplifier,加上这个还是让俺们给飞思卡尔加点满意分的,哈哈。2.Kinetis的ADC内部结构框图,是我们接下来的编程的依据,老套路,上图: 可能第一眼我们的感觉都是。有点复杂哈,咳咳,所以我在图中对重要的部分用红线圈出来逐个分析了下,怎样,应该初步了然了吧,图中我圈出来的是重点抓住的,下面软件编程的时候需要用到,其他的可以随便看看,前提是你有足够的耐心去看一堆英文说明了,哈哈。3.软件编程部分,其实无非就是操作寄存器,其实按照data

6、sheet的来就可以,另外强调一下,官方例程给出的是PDB硬件触发,觉着有点麻烦,所以按照平时常用的方法(对我来说,还是习惯软件触发针对Tower系统写了下,采用的是单端模式。如下:/*Routine:ADC_Init*input:ADC-ADC0and ADC1module selectionbits:0-8bit,1-12bit,2-10bit,3-16bitchannel:023in total of24channels in single-ended convertion modemode:INT_MODE,SEARCH_MODE(母语解释一下吧,哈哈,这里分为中断方式和查询方式*/v

7、oid ADC_Init(ADC_MemMapPtr ADC,uint8bits,uint8channel,uint8modeif(ADC=ADC0_BASE_PTRSIM_SCGC6|=SIM_SCGC6_ADC0_MASK;/*turn on the ADC0clock*/else if(ADC=ADC1_BASE_PTRSIM_SCGC3|=(SIM_SCGC3_ADC1_MASK;/*turn on the ADC1clock*/ADC_CFG1_REG(ADC|=ADC_CFG1_ADIV(3/*normal power,clock rate is(inputclock/8*/ +A

8、DC_CFG1_ADLSMP_MASK/*long sample time*/+ADC_CFG1_MODE(bits/*bits range0to3(0-8bit,1-12bit,2-10bit,3-16bit*/+ADC_CFG1_ADICLK(1;/*inputclock is busclock/2*/ADC_CFG2_REG(ADC&=(ADC_CFG2_MUXSEL_MASK/*a registers is selected*/+ADC_CFG2_ADACKEN_MASK/*Asynchronous clock output disabled*/+ADC_CFG2_ADHSC_MASK

9、/*Normal conversion sequence selected*/+ADC_CFG2_ADLSTS_MASK;/*Default longest sample time.*/*set default status:Software triger(a convertion is initated following a write toSC1Acompare function disabled,DMA is disabled,default voltage reference pin (external pins VREFH and VREFL.*/ADC_SC2_REG(ADC=0

10、;ADC_SC3_REG(ADC|=ADC_SC3_ADCO_MASK/*continuous conversions*/+ADC_SC3_AVGE_MASK/*hardware averages enabled.*/+ADC_SC3_AVGS(3;/*4samples average*/-when in software triger mode,a conversion is actived after the ADC_SC1A is writed. ADC_SC1_REG(ADC,0=ADC_SC1_ADCH(channel;/*single-ended AD20channel is se

11、lected*/if(mode=INT_MODEADC_SC1_REG(ADC,0|=ADC_SC1_AIEN_MASK;/*conversion complete interrrupt enabled */if(ADC=ADC0_BASE_PTRenable_irq(adc0_isr_no;/*enable the ADC0IRQ interrupt*/else if(ADC=ADC1_BASE_PTRenable_irq(adc1_isr_no;/*enable the ADC1IRQ interrupt*/else if(mode=SEARCH_MODEADC_SC1_REG(ADC,0

12、&=ADC_SC1_AIEN_MASK;/*conversion complete interrrupt disabled*/ /* *Routine:Read_ADC *input: ADC-ADC0 and ADC1 module selection result: the pointer of the return value of the convertion result. */ void Read_ADC(ADC_MemMapPtr ADC, uint16 * result while(!(ADC_SC1_REG(ADC,0&ADC_SC1_COCO_MASK; /* wait u

13、ntil the selected numbers of convertion(determined by the AGVS bits */ *result = ADC_R_REG(ADC,0; /* clear the COCO flag by reading the corresponding data register. */ /* *Routine:adc0_isr *Description: the interrupt service routine of ADC0 */ void adc0_isr(void (void ADC0_RA; /* *Routine:adc1_isr *

14、Description: the interrupt service routine of ADC1 */ void adc1_isr(void (void ADC1_RA; 在这里解释下上面代码,其实看英文注释就行,我每步都做了简单的注释,按照步骤来即可。其实主 要分两部分,一个就是其 AD 初始化部分,主要操作寄存器为 ADC_SC1ADC_SC3和 ADC_CFG1ADC_CFG2。输入参数包括 ADC 模块选择(包括两个,即 ADC0和 ADC1) ,转换精度 选择(8位,10位,12位,16位) ,通道号(由于是单端模式,所以范围为023共24个通道)和输 出模式(查询或者中断模式)

15、 ;另外就是读结果寄存器部分,包括了查询方式读和中断方式读(我使 用了查询方式,所以中断方式我设置了空读,呵呵,其实根本没用到) ,完整文件见附件。 4.再补充一部分,即主函数内部的调用方法,由于本例程是根据 Tower 系统写的,而系统板上电位器 的分压端是连在 ADC1_DM1端上的,不过对单端模式来说其实是连在了 AD20这个通道上的,如下 图通道安排(看到 Chapter3了吧,呵呵,find it in chapter3, you can get it,哈哈) : 下面是具体在 main 函数里的调用方法,如下: void main(void /-insert your code in the following-uint16 AD_Result; /* 声明 AD 转换结果变量,存储 AD 值 */ ADC_Init(ADC1, 3, 20, SEARCH_MODE; /* 初始化 AD1位单通道20输入,转换结果16bit, 查询模 式 */ EnableInterrupts; whi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论