闲聊飞思卡尔ADC模块



0?wx_fmt=gif

因为 ADC 模块是各种控制比较重要的功能模块,基本的保护算法都要考 ADC 的采样数据来执行,所以 ADC 模块还是要熟练掌握,今天我们就来学习下飞思卡尔的ADC模块,如果有猿友使用过microchip的MCU就会发现这两种MCU的ADC模块还是有很大的不同的。

ADC模块简介

KV4x系列MCU 的ADC(Analog to Digital Converter)模块有16个通道,是双端12位的ADC,有独立的参考电压源和控制块,分为ADCA和ADCB,各有8个通道,ADCA和ADCB可以并行采样也可以串行采样,有各自的采样保持电路,特性主要有:

12位的分辨率

最大时钟频率为25M,周期为40ns.

采样速率可以达到8.83百万次每秒

可以去其他外设同步,像常用的PWM外设

可以连续扫描存储16次的测量值

输入信号的增益可以配置为x1,x2,x4,这个功能还是很有用的.

中断功能

可选的DMA功能

可选的采样修正功能

单端或者差分输入

ADC模块框图

从下图可以清楚的看出ADC模块的构成,主要有通道多路开关,采样保持,参考电压,数字输出存储寄存器,中断以及数据传输等功能块。

0?wx_fmt=jpeg

ADC模块外部信号

主要的外部信号可以通过下表详细的看出

0?wx_fmt=jpeg

外部输入信号主要有:

模拟输入引脚:ADC外设有16路模拟输入引脚,被分为ANA[0;7]和ANB[0:7],ADCA和ADCB都有自己的采样保持电路和转换器。

参考电压引脚:

VREFH和VREFL的电压是不一样的,VREFH一般为VDDA,VREFL一般为0V.

电源引脚VDDA和VSSA为ADC模块提供电源.

ADC寄存器

与ADC相关的寄存器也比较多,具体的内容可以参考飞思卡尔官方的数据参考手册,这里主要介绍几个主要的寄存器。

ADC_CTRL1,控制寄存器一主要用来配置ADC扫描模式以及中断源使能。位0到位2总共3位用来配置扫描模式,主要有六种模式:单次顺序扫描,单词并行扫描,循环顺序扫描,循环并行扫描,顺序触发扫描和并行触发扫描。

ADC_CLISTx,主要用来配置单端或者差分输入的通道

ADC_STAT,状态寄存器主要用来指示一些ADC模块的状态,主要包括转换状态,转换完成中断,过零中断,高低门限中断。

ADC_RSLTn 结果寄存器用来存储转换完成的结果。

驱动程序概述

ADC的驱动程序有两种方案,一种为自己开发,按照数据手册的指引开发简单的ADC驱动程,另一种是使用飞思卡尔SDK提供的ADC模块驱动程序,SDK包含功能比较全的ADC驱动,自己开发我们不用的功能可以不包含,使代码简单易用。这里主要简单介绍下自己开发驱动,

主要包含几个功能

初始化函数:按照数据手册配置寄存器,实在不会可以参考例程学习配置,因为ADC模块是各种控制比较重要的功能模块,基本的保护算法都要考ADC的采样数据来执行,所以ADC模块还是要熟练掌握。

初始化主要包括配置时钟,通道,转换模式,使能中断等

中断函数:当然你也可以选择使用查询来得到转换结果,但小猿建议大家在正式的项目中尽量使用中断。

中断函数中主要包括清中断标志,将结果寄存器中的值读取到数组中或者变量中,需要注意的一点是如果是使用并行采样模式和使用顺序扫描模式的中断函数是不一样的,采用并行的话需要分别写ADCA和ADCB的中断,如果是使用顺序扫描只要完成ADCA的中断就可以。

数据传输函数:主要完成数据的搬运和传输给其他模块使用,这个根据架构来决定。

实际应用中需要注意低功耗模式下和正常模式下的区别,另外虽然数据手册说最大可以配置为25M的频率,但建议大家不要配置到最大频率使用,确保转换稳定精确,有兴趣的猿友可以配置为不同的模式,对比下不同。

嵌入式

程序猿

微信号:InterruptISR

嵌入式程序猿致力于打造程序猿工程师交流分享的精品移动平台,欢迎各位猿友加入和分享。微信搜索嵌入式程序猿添加关注,或者长按下方二维码,选择识别图中二维码添加关注。

0?wx_fmt=jpeg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
AD模块飞思卡尔调试程序全部文件: #include <hidef.h> /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ int i; unsigned char RX_ID[4],RX_DS[8]; unsigned int r[8]; unsigned int temp[2],s; void setbusclock(void) { CLKSEL=0X00; // disengage PLL to system PLLCTL_PLLON=1; // turn on PLL SYNR=0x01; // VCOFRQ[7:6];SYNDIV[5:0] // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1) // fPLL= fVCO/(2 × POSTDIV) // fBUS= fPLL/2 // VCOCLK Frequency Ranges VCOFRQ[7:6] // 32MHz <= fVCO <= 48MHz 00 // 48MHz < fVCO <= 80MHz 01 // Reserved 10 // 80MHz < fVCO <= 120MHz 11 REFDV=0x01; // REFFRQ[7:6];REFDIV[5:0] // fREF=fOSC/(REFDIV + 1) // REFCLK Frequency Ranges REFFRQ[7:6] // 1MHz <= fREF <= 2MHz 00 // 2MHz < fREF <= 6MHz 01 // 6MHz < fREF <= 12MHz 10 // fREF > 12MHz 11 // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz; POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV) // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one). _asm(nop); // BUS CLOCK=16M _asm(nop); while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it; CLKSEL_PLLSEL =1; //engage PLL to system 分频; } //[设置总线时钟频率为16MHZ] ; // void ATDInit(void) { ATD0CTL2=0x42; // ATD启动,禁止外部触发,允许ATD中断; ATD0CTL3=0x88; // 背景调试模式下继续转换,每1次转换一个转换序列,继续转换; ATD0CTL4=0x01; // 采样时间为 2个时钟周期,转化按10位进行,总分频系数为8; ATD0CTL5=0x20; // 数据右对齐,无符号,单通道采集, } //[AD进行初始化];
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值