飞思卡尔单片机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学习相关推荐
- 飞思卡尔单片机教程(1)——从安装开始
放假了有木有!是不在家特别闲?是不是放假前立志学单片机来着?如果你拿到了天大精仪荣誉出品的JM60开发板,而且你还带回家了.. 结果安装起来好麻烦!!! WIN7 64位不可以用!USB3.0接口插上 ...
- 飞思卡尔单片机PLL时钟总线模块
要设定PWM模块首先要确定片内总线时钟,MC9S12XS系列单片机增加了时钟产生器模块,锁定内部频率更高的压控振荡器VCO频率,作为系统时钟,单片机的内部时钟可达80MHz,片内总线时钟可达40MHz ...
- 飞思卡尔单片机AD模块简述(1)
S12XS系列MCU的ATD模块共有27个寄存器,包括6个ATD转换控制寄存器,2个ATD转换状态寄存器,1个ATD比较使能寄存器,1个ATD比较方式寄存器,1个ATD转换输入使能寄存器和16个ATD ...
- 飞思卡尔智能车HCS12芯片学习笔记
编译器:Freescale CodeWarrior,其中的上横线都未标出.如IRQ字母上面本来应该有一个横线. 一:I/O 普通IO口一般就用porta和portb,主要就下面两句: DDRB=0xf ...
- 飞思卡尔单片机编程与c语言,飞思卡尔单片机高效C语言编程(中文)
高效C语言编程实验,包括:CodeWarrior的使用.中断.数据段的定义.常量数据段.变量.位操作.数组.指针.函数内的自变量.优化方法.Manual Optimization(手工优化).Proc ...
- 飞思卡尔单片机PE开发工具硬件及软件
原文链接: http://blog.sina.com.cn/s/blog_8ebff8d7010121tm.html 1.HC(S)08系列 开发机硬件:USB-ML-12 CYCLONE PRO U ...
- 飞思卡尔单片机DZ60---EEPROM读写
//向EEPROM中写入数据,然后读出数据,赋值给PORTD,点亮相应的LED灯 #include <hidef.h> /* for EnableInterrupts macro */ # ...
- 飞思卡尔单片机DZ60---实时中断
//RTI实时中断实验 //RTC模块包括一个状态和控制寄存器.一个8位计数寄存器和一个8位模数寄存器 //实时中断功能用来产生周期性中断.RTI有三个可选时钟源:LPO 1KHZ内部振荡器,32KH ...
- 闲聊飞思卡尔ADC模块
因为 ADC 模块是各种控制比较重要的功能模块,基本的保护算法都要考 ADC 的采样数据来执行,所以 ADC 模块还是要熟练掌握,今天我们就来学习下飞思卡尔的ADC模块,如果有猿友使用过m ...
- 飞思卡尔16位单片机(十五)—— 如何批量烧写芯片
我们在进行飞思卡尔单片机开发时,一般使用CodeWarrior软件和usbdm调试器进行.但是在实际生产过程中,采用这种方式烧写芯片效率比较低,而且很多情况下,程序的源码不希望对生产人员开放,本文就是 ...
最新文章
- 科技城|从专利布局看人工智能领域全球竞争与中国面临的挑战
- 史上最全java堆,将知识点掰碎了给你嚼,还不信学不会。
- Python 网络爬虫笔记3 -- Beautiful Soup库
- mysql启用组提交变量_MySQL的COMMIT_ORDER模式下组提交分组实现与BUG案例源码剖析...
- 数据返回nan_数据处理教程
- Python: SystemError: Unknown opcode
- AIX系统常用命令总结
- DAY1——sql 建表/插入数据
- TensorFlow Seq2Seq模型样例:实现语言翻译
- Outlook的服务器设置中POP3协议,在outlook的服务器设置中POP3协议是指
- hdu 5211 Mutiple 数学
- Editext编辑属性
- FPGA智能网卡功能剖析
- OpenGL(十三)——Qt OpenGL绘制三维图形
- 【引路帖】【MATLAB】【求解最优化问题】
- 爷回青——小米5s Plus刷入LineageOS
- 向武 清华大学 计算机,哥哥保送弟弟全市第二 双胞胎同时上清华(组图)
- U盘中毒后怎么恢复数据
- Openssh7.4p1更换为8.2
- 机器人,给我来一瓶82年的农夫山泉