飞思卡尔单片机KEA128之ADC学习

发布者:数据梦行者最新更新时间:2021-04-07 来源: eefocus关键字:飞思卡尔  单片机  KEA128  ADC学习 手机看文章 扫描二维码
随时随地手机看文章

这个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学习 引用地址:飞思卡尔单片机KEA128之ADC学习

上一篇:恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记4——ADC
下一篇:第五课 MC9S08DZ60之串行外围设备接口SPI

推荐阅读最新更新时间:2024-11-09 18:03

单片机C语言程序设计之T0控制LED实现二进制计数
AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。 单片机C语言程序设计之T0控制LED实现二进制计数 T0控制LED实现二进制计数原理图 T0控制LED实现二进制计数程序设计 /* 名称:T0 控制 LED 实现二进制计数说明:本例对按键的计数没有使用查询法,没有使用外部中断函数,没有使用定时或计数中断函数。而是启用了计数器,连接在 T0 引脚的按键每次按
[单片机]
<font color='red'>单片机</font>C语言程序设计之T0控制LED实现二进制计数
51单片机 独立按键k1控制数码管移位 k2控制数值加
按下独立按键k1数码管左移,按下独立按键k2数码管数值加1。 typedef unsigned char u8; u8 code smgwei ={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c}; u8 code smgduan ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbit key1=P3^1; sbit key2=P3^0; u8 wei,shu; void delay(u16 i) { while(i--); } void button() { if(key1==0) { delay(1000);
[单片机]
C51单片机独立按键的使用
前面我们简单的学习了C51的IO结构,现在我们来看看,准双向IO口如何使用按键输入 这是准双向IO的基本结构,单片机就靠内部输入线来读取IO的电平状态。 我们以这个电路分析准双向IO上的按键使用 在准双向口中,我们需要先给IO写高电平才能去读取IO的电平变化(高- 低) 在写高电平的情况下…… 三极管截止 没有按下按键,电流由正极经过上拉电阻流到内部输入线路,这时候内部读出高电平 这时候按下按键,按下按键,电流由VCC流经上拉电阻再流经按键最后流向GND。由于电流由正极流向负极。内部输入线路线路的电流流向负极,这时候读出的数值就是低电平的 如果我们写IO是低电平的话,三极管始终导通,内部输入的电流经过三极管接到负极
[单片机]
C51<font color='red'>单片机</font>独立按键的使用
19-基于51单片机的倒计时系统
具体实现功能 系统由STC89C52单片机+按键电路+复位电路+晶振电路+LCD1602显示模块构成。 具体功能: (1)六位LED显示,从59分59秒99开始倒计时; (2)倒计时精度为0.01秒,能正确地进行倒计时; (3)复位后倒计时重新回到初始状态。 设计背景 近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了基于单片机的数字电子秒表倒计时设计,倒计时精度达0.01s了,解决了传统的由于倒计时精度不够造成的误差和不公平性,是各种体育竞赛的必备设备之一。本设计的数字电子秒表倒计时系统采用8051单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断
[单片机]
19-基于51<font color='red'>单片机</font>的倒计时系统
手把手教学51单片机第三课 | 复位电路、数码管静态显示
1.复位电路 1个机器周期=12个震荡周期(晶振) 51单片机复位要求:高电平 =2个机器周期 时间常数τ 复位电路要求是RST引脚高电平有效大于2个机器周期,相当于24个震荡周期,假设震荡频率是12Mhz。τ=根号RC,其中R是10KΩ,C是10uf,实际值是τ=0.12s,理论上要大于等于12us(晶振频率分之一),这样就一定成立了。 以下是复位电路图 ---------------------------------------------------------------------------------------分割线-------------------------------------------
[单片机]
手把手教学51<font color='red'>单片机</font>第三课 | 复位电路、数码管静态显示
8051单片机的C语言编程
8051的C语言编程和传统的C语言编程是类似的。当然其中有些数据类型是不一样的,我们知道8051支持强大的位寻址能力,因此8051的C语言编程增加了一些新的数据类型,为了不使的8051的能力被浪费。下面给出新增的数据类型。 bit ——用于定义1个位变量,用于8051的位寻址空间(仅仅限于内部RAM的20H——2FH的字节空间(00H——7FH的位地址空间)).(不得不说8051的地址重叠搞得人很烦) 例如:bit flag = 0; 定义flag为一个位变量,并且初始化为0. sbit ——用于定义一个位变量,用于8051的特殊功能寄存器(内部RAM的80H——FFH的字节
[单片机]
8051<font color='red'>单片机</font>的C语言编程
实力讲解PIC单片机的时钟设置操作
  单片机的时钟信号好比是单片机的心脏。单片机的时钟频率决定了单片机运行一个指令周期的时间。原理的话应该是晶振与外部电容构成电容三点式振荡电路,此时时钟输入为正弦波,经过内部施密特触发器整形变为方波。   内部时钟方式:   利用单片机内部的振荡器,然后在引脚XTAL1(18脚)和XTAL2(19脚)两端接晶振,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路,外接晶振时,晶振两端的电容一般选择为30PF左右;这两个电容对频率有微调的作用,晶振的频率范围可在1.2MHz-12MHz之间选择。为了减少寄生电容,更好地保证振荡器稳定、可靠地工作,振荡器和电容应尽可能安装得与单片机芯片靠近。   外部时钟方式:   此
[单片机]
实力讲解PIC<font color='red'>单片机</font>的时钟设置操作
集Hi-Fi、智能和USB多通道等特征于一体的微控制器——迎接数字音频新时代
随着诸多技术突破和全新流媒体服务的不断融合,在智能家居和智能音箱市场日益繁荣的今天,消费者对于音频的需求已不再仅仅局限于音质本身,更多的是追求高品质的生活体验和便捷的智慧互联。因此, 要想更好的迎接数字音频新时代,当今的数字音频,不仅要能够提供Hi-Fi的音质,而且还能够作为智能设备的人机界面,同时还能够用USB多通道等方式方便连接...... XMOS在其最新的xcore器件中集成了边缘AI、DSP、控制单元和I/O等功能,因而可以在新一代音频、电机控制、工业自动化和边缘计算等许多应用和场景中,利用软件就能开发出功能非常先进的系统。这种在实现高性能硬件的同时,保持灵活性和可编程性的特性,可以为工程师和系统企业带来更快的产品
[模拟电子]
集Hi-Fi、智能和USB多通道等特征于一体的<font color='red'>微控制器</font>——迎接数字音频新时代
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved