这个ADC模块的操作模式其实也比较简单。

首先就是配置,罗列一下该配置什么吧

ADICLK     ADC模块的输入时钟选择。是总线时钟,总线时钟2分频还是外部的

ADIV         对上面的时钟再分频后就可以给ADC的核心模块使用了。

MODE        选择8/10/12位转换

ADLSMP  短还是长时间采样。不设置的话默认是短

ADLPC    高速还是低功耗,低功耗的话会慢一些,不设置的话默认是高速

AIEN      使能不使能中断啊,默认不使能

ADCO      连续转换功能,默认单次。单次的话在一次采样完成后,要再一次选择通道才能开始下一次转换。

ADTRG    软件触发启动转换还是硬件触发。默认是软件

ACFE     比较功能是否开启,默认关闭。比较功能就是说你设定一个值,只有采样得到的值比这个值大或者小才会进中断,不然就一直采样。

ACFGT   这个是配合上面比较功能,进一步设置是比设定值大还是小才触发中断,默认于

REFSEL  基准电压的选择。是选择VREFH/VREFL还是VDDA/VSSA。默认VREFH/VREFL

ADC_APCTL1 这个很重要,ADC总共有十六个通道,每个通道对应一个引脚。这个寄存器就相当于在配置说要使用哪个通道。这个寄存器低十六位是可以用的,一个位对应一个通道。

HTRGMASKE  

HTRGMASKSEL 这两个寄存器是为了硬件触发准备的,如果你不用硬件触发,保持默认值就是了

ADC_CV 这个寄存器是保存比较值的,还记得上面有个寄存器使能比较功能吗

AFDEP  FIFO深度,可以是0即禁用FIFO或者是1就是2级,2就是3级以此类推最大可以8级。这个也很重要。

ASCANE  FIFO扫描模式开启和关闭。默认关闭,暂时没摸清楚什么是扫描模式

配置了一大堆,该讲讲怎么用这个ADC了。

你在设置完上面这一堆寄存器后,ADC就算初始化完成了,如果使用库函数的话,就是在配置结构体里把上面这些功能配置给填好了,可以调用Init函数了。

接下来讲Init完之后该干啥才能启动ADC

我配置的软件触发,就是默认的情况下啦。

你配置完之后,ADC就在等着你选择通道,外部的有十六个通道AD0~AD15,内部的有五个,有地、温度、气隙,VREFH,VREFL。这些个内部通道就是专用的,你不能改用途,不能说把温度通道改用成外部或者其他功能。

你通过设置ADCH,选择通道后ADC就会开始转换,如果你开了比较功能采样后会自动比较,没有的话就只是采样,采样完成后COCO标志就会置1,如果使能中断,就会进中断,然后你就可以通过ADC_R这个寄存器把采样结果读走,COCO标志你就不用管了,你读ADC_R的时候系统就会自动帮你把COCO清零的啦。如果你开了连续转换功能,那么这个时候你就可以走了,去干别的事,等下一次采样完成,如果你没开连续,那么在你读完ADC_R的值后,你还要再设置一次ADCH的值,告诉ADC模块接下来要采哪个通道,不然的话ADC就不鸟你了自己休息去。

如果ADC就这么简单,好像功能太少了,如果我有好几个通道要采,岂不是每读一次ADC_R就要设置一下下一个通道,还得判断下一个通道该谁了。太麻烦了,所以系统还给你个增强型功能,FIFO。系统里FIFO有两个,一个FIFO存通道号,一个FIFO存采样值,这两FIFO的深度必须是一致的,寄存器里也只有一个地方设置FIFO深度,没有说通道号FIFO深度,采样值FIFO深度这种设置,就一个FIFO深度。

有了FIFO深度该怎么用呢,普通情况下在你Init之后要选择通道,ADC才开始转换,有了FIFO这操作顺序还是一样的,只不过,这个时候你可以连续设置几次通道,系统会自动把你设置的值存到FIFO里,比如说你对ADCH写0x01,然后写0x02,最后写0X03,系统会把这三个值顺序写到FIFO里,这里需要注意的是你设置的FIFO深度跟你写通道号的次数要保持一次,意思就是说不能你设置FIFO深度是5,然后写通道号的时候你只连续写了三个,这样ADC是不会启动采样的,会一直等你写满5个才启动。FIFO的好处就是,比如说你设置FIFO深度是5,那么只有5个通道都采样完了COCO才会置1,才会进中断,读的时候还是读ADC_R的值,只不过像设置通道号那样,你可以连续读几次,用FIFO的时候要注意了,FIFO的意思就是first in first out,你连续写通道号的时候假如说顺序是这样的,5号,6号,3号,那么你连续读ADC_R出来的值的顺序就是5号,6号,3号。一定要记得顺序,不然乱了可别怪我。

刚刚上面讲的这个FIFO的功能是你有几个通道需要采样,用FIFO帮你全采样完了你才进中断一次性取出来。那么另外一种用FIFO的想法是,我就有一个通道需要采样,我不想采一次就进一次中断读采样值,能不能用FIFO一次帮我采样几个值,采样完了我再去中断里一次性读出来。我想这个功能应该就是上面我没摸头的FIFO扫描模式吧。

void ADC_Module_Init()
{
ADC_ConfigType  sADC_Config = {0};
sADC_Config.u8ClockDiv = ADC_ADIV_DIVIDE_4;
sADC_Config.u8ClockSource = CLOCK_SOURCE_BUS_CLOCK;
sADC_Config.u8Mode = ADC_MODE_12BIT;
sADC_Config.sSetting.bIntEn = 1;   //使能中断
sADC_Config.u8FiFoLevel = ADC_FIFO_LEVEL4;
//    sADC_Config.sSetting.bFiFoScanModeEn=1;
sADC_Config.u16PinControl |= 0x08;//使能AD3引脚的AD采样功能
ADC_SetCallBack(ADC_CallBack);
ADC_Init( ADC, &sADC_Config);
ADC_SetChannel(ADC,ADC_CHANNEL_AD22_TEMPSENSOR);
ADC_SetChannel(ADC,ADC_CHANNEL_AD29_VREFH);
ADC_SetChannel(ADC,ADC_CHANNEL_AD23_BANDGAP);
ADC_SetChannel(ADC,ADC_CHANNEL_AD3);
}
void ADC_CallBack(void)
{
uint8 i;
//when read the result register,COCO can reset automatic
while( !ADC_IsFIFOEmptyFlag(ADC) )  //wait read all data in FIFO
{
TempsensorBuffer[Index] = ADC_ReadResultReg(ADC);      //这几个数组都是static性质
VrefhBuffer[Index] = ADC_ReadResultReg(ADC);
BandgapBuffer[Index] = ADC_ReadResultReg(ADC);
LightsensorBuffer[Index] = ADC_ReadResultReg(ADC);
Index++;                        //这个Index也是static
}
if (Index == (MAXBUFFSIZE-1))
{
ADC_Calculate();                //存储完一组AD值后就要进行一次算法
}
u8Adc_Converted_Completed_Flag = 1;
ADC_SetChannel(ADC,ADC_CHANNEL_AD22_TEMPSENSOR);
ADC_SetChannel(ADC,ADC_CHANNEL_AD29_VREFH);
ADC_SetChannel(ADC,ADC_CHANNEL_AD23_BANDGAP);
ADC_SetChannel(ADC,ADC_CHANNEL_AD3);
}
void ADC_Calculate()                //这里用了最简单的平均值算法,还可以使用中间值滤波法
{
UINT8 i;
UINT32 tmp=0;
for (i=0;i



飞思卡尔单片机KEA128之ADC学习相关推荐

  1. 飞思卡尔单片机教程(1)——从安装开始

    放假了有木有!是不在家特别闲?是不是放假前立志学单片机来着?如果你拿到了天大精仪荣誉出品的JM60开发板,而且你还带回家了.. 结果安装起来好麻烦!!! WIN7 64位不可以用!USB3.0接口插上 ...

  2. 飞思卡尔单片机PLL时钟总线模块

    要设定PWM模块首先要确定片内总线时钟,MC9S12XS系列单片机增加了时钟产生器模块,锁定内部频率更高的压控振荡器VCO频率,作为系统时钟,单片机的内部时钟可达80MHz,片内总线时钟可达40MHz ...

  3. 飞思卡尔单片机AD模块简述(1)

    S12XS系列MCU的ATD模块共有27个寄存器,包括6个ATD转换控制寄存器,2个ATD转换状态寄存器,1个ATD比较使能寄存器,1个ATD比较方式寄存器,1个ATD转换输入使能寄存器和16个ATD ...

  4. 飞思卡尔智能车HCS12芯片学习笔记

    编译器:Freescale CodeWarrior,其中的上横线都未标出.如IRQ字母上面本来应该有一个横线. 一:I/O 普通IO口一般就用porta和portb,主要就下面两句: DDRB=0xf ...

  5. 飞思卡尔单片机编程与c语言,飞思卡尔单片机高效C语言编程(中文)

    高效C语言编程实验,包括:CodeWarrior的使用.中断.数据段的定义.常量数据段.变量.位操作.数组.指针.函数内的自变量.优化方法.Manual Optimization(手工优化).Proc ...

  6. 飞思卡尔单片机PE开发工具硬件及软件

    原文链接: http://blog.sina.com.cn/s/blog_8ebff8d7010121tm.html 1.HC(S)08系列 开发机硬件:USB-ML-12 CYCLONE PRO U ...

  7. 飞思卡尔单片机DZ60---EEPROM读写

    //向EEPROM中写入数据,然后读出数据,赋值给PORTD,点亮相应的LED灯 #include <hidef.h> /* for EnableInterrupts macro */ # ...

  8. 飞思卡尔单片机DZ60---实时中断

    //RTI实时中断实验 //RTC模块包括一个状态和控制寄存器.一个8位计数寄存器和一个8位模数寄存器 //实时中断功能用来产生周期性中断.RTI有三个可选时钟源:LPO 1KHZ内部振荡器,32KH ...

  9. 闲聊飞思卡尔ADC模块

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

  10. 飞思卡尔16位单片机(十五)—— 如何批量烧写芯片

    我们在进行飞思卡尔单片机开发时,一般使用CodeWarrior软件和usbdm调试器进行.但是在实际生产过程中,采用这种方式烧写芯片效率比较低,而且很多情况下,程序的源码不希望对生产人员开放,本文就是 ...

最新文章

  1. 科技城|从专利布局看人工智能领域全球竞争与中国面临的挑战
  2. 史上最全java堆,将知识点掰碎了给你嚼,还不信学不会。
  3. Python 网络爬虫笔记3 -- Beautiful Soup库
  4. mysql启用组提交变量_MySQL的COMMIT_ORDER模式下组提交分组实现与BUG案例源码剖析...
  5. 数据返回nan_数据处理教程
  6. Python: SystemError: Unknown opcode
  7. AIX系统常用命令总结
  8. DAY1——sql 建表/插入数据
  9. TensorFlow Seq2Seq模型样例:实现语言翻译
  10. Outlook的服务器设置中POP3协议,在outlook的服务器设置中POP3协议是指
  11. hdu 5211 Mutiple 数学
  12. Editext编辑属性
  13. FPGA智能网卡功能剖析
  14. OpenGL(十三)——Qt OpenGL绘制三维图形
  15. 【引路帖】【MATLAB】【求解最优化问题】
  16. 爷回青——小米5s Plus刷入LineageOS
  17. 向武 清华大学 计算机,哥哥保送弟弟全市第二 双胞胎同时上清华(组图)
  18. U盘中毒后怎么恢复数据
  19. Openssh7.4p1更换为8.2
  20. 机器人,给我来一瓶82年的农夫山泉

热门文章

  1. 苹果Macbook快捷键使用大全
  2. sketchup 2018下载与安装教程
  3. python强度公式计算_python – 黑体谱的普朗克斯公式
  4. Eclipse保护色设置
  5. 大数据中心大数据资源平台建设方案
  6. Excel VBA 宏编程入门
  7. mysql中添加外键语句_数据库语句怎么加外键
  8. putty screen 快捷键
  9. MacBook双开微信原来这么简单
  10. 使用微软官方工具MediaCreationTool制作Windows10的U盘安装盘