KEA128的ADC有8个寄存器

ADC编程基本步骤:

1.打开ADC模块时钟

2.开启ADC_APCTL1引脚控制寄存器相应引脚的AD功能(即关闭这些引脚的IO功能)

3.配置ADC_SC3寄存器的总线时钟,时钟分频,并根据采样精度定ADC_SC3_MODE位

4.配置ADC_SC2寄存器的软件触发位,比较功能禁用,默认外部参考电压Vrefh和Vrefl。

5.配置ADC_SC1寄存器的ADC模块使能和连续转换使能。选择采样通道。

6.等待转换完成

7.读取结果(读取之后转换完成标志位会自动清零)

//===========================================================================
//文件名称:adc.h
//功能概要:adc底层驱动构件头文件
//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//更新记录:2015-05-11
//===========================================================================#ifndef _ADC_H         //防止重复定义( 开头)
#define _ADC_H#include "common.h"    //包含公共要素头文件//===========================================================================
//函数名称:adc_init
//功能概要:初始化adc模块
//参数说明:channel:通道号
//       accurary采样精度:单端8-10-12
//===========================================================================
void adc_init(uint_8 channel,uint_8 accurary);//===========================================================================
//函数名称:adc_read
//功能概要:进行一次AD采样
//参数说明:channel:单端输入 通道范围 0~ 31
//===========================================================================
uint_16 adc_readonce(uint_8 channel);//============================================================================
//函数名称:ad_mid
//函数返回:16位无符号的AD值,中值滤波后的结果(范围:0-4095)
//参数说明:channel:通道号
//功能概要:采样三次,取中值
//============================================================================
uint_16 adc_mid(uint_8 channel);//============================================================================
//函数名称:ad_ave
//函数返回:16位无符号的AD值,中值+均值滤波后的结果(范围:0~4095)
//参数说明:channel:通道号
//      N:均值次数(范围:0~255),每次调用中值滤波获得
//功能概要:中值+均值滤波,实际采样次数=3*N
//============================================================================
uint_16 adc_ave(uint_8 channel, int N);#endif                 //防止重复定义( 开头)//===========================================================================
//声明:
//(1)我们开发的源代码,在本中心提供的硬件系统测试通过,真诚奉献给社会,不足之处,
//     欢迎指正。
//(2)对于使用非本中心硬件系统的用户,移植代码时,请仔细根据自己的硬件匹配。
//
//苏州大学飞思卡尔嵌入式中心(苏州华祥信息科技有限公司)
//技术咨询:0512-65214835  http://sumcu.suda.edu.cn
//业务咨询:0512-87661670,18915522016  http://www.hxtek.com.cn
//===========================================================================
//文件名称:adc.c
//功能概要:ADC底层驱动构件源文件
//版权所有:苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//更新记录:2015-05-11   V1.0
//===========================================================================
#include "adc.h"//===========================================================================
//函数名称:adc_init
//功能概要:初始化一个AD转换通道
//参数说明:channel:通道号
//       accurary:单端采样精度8-10-12
//===========================================================================void adc_init(uint_8 channel,uint_8 accurary)
{//1.打开ADC模块时钟SIM_SCGC |= SIM_SCGC_ADC_MASK;//开启引脚的AD功能ADC_APCTL1 |=0x0F;//选择总线时钟ADC_SC3 = (ADC_SC3 & ~ADC_SC3_ADICLK_MASK) | ADC_SC3_ADICLK(0b00);//输入时钟4分频ADC_SC3 = (ADC_SC3 & ~ADC_SC3_ADIV_MASK) | ADC_SC3_ADIV(0b10);//2.2 根据采样精度   定ADC_SC3_MODE位switch(accurary){case 8:ADC_SC3 |= ADC_SC3_MODE(0);      //选择8位转换模式break;case 10:ADC_SC3 |= ADC_SC3_MODE(1);      //选择10位转换模式break;case 12:ADC_SC3 |= ADC_SC3_MODE(2);      //选择12位转换模式break;default:ADC_SC3 |= ADC_SC3_MODE(2);       //选择12位转换模式break;}//3.配置ADC_SC2:软件触发,比较功能禁用;默认外部参考电压 VREFH/VREFLADC_SC2 = 0x00;//4.配置ADC_SC1:使能ADC,并设置为连续转换模式,使能外部引脚ADC_SC1|= ADC_SC1_ADCO_MASK;//选择采样通道ADC_SC1|=ADC_SC1_ADCH(channel);
}//============================================================================
//函数名称:adc_readonce
//功能概要:对AD通道进行一次采样
//参数说明:channel:通道范围 0~31
//============================================================================
uint_16 adc_readonce(uint_8 channel)
{uint_16 ADCResult = 0;//设置SC1寄存器通道号ADC_SC1 = (ADC_SC1 & ~ADC_SC1_ADCH_MASK) | ADC_SC1_ADCH(channel);//等待转换完成while(!(ADC_SC1 & ADC_SC1_COCO_MASK));//读取转换结果ADCResult = (uint_16)ADC_R;//清ADC转换完成标志ADC_SC1 &= ~ADC_SC1_COCO_MASK;//返回读取结果return ADCResult;
}
//============================================================================
//函数名称:ad_mid
//函数返回:16位无符号的AD值,中值滤波后的结果(范围:0-4095)
//参数说明:channel:通道号
//功能概要:采样三次,取中值
//============================================================================
uint_16 adc_mid(uint_8 channel)
{uint16_t i,j,k,tmp;//1.取3次A/D转换结果i = adc_readonce(channel);j = adc_readonce(channel);k = adc_readonce(channel);//2.取中值if (i > j){tmp = i; i = j; j = tmp;}if (k > j)tmp = j;else if(k > i)tmp = k;elsetmp = i;return tmp;
}//============================================================================
//函数名称:ad_ave
//函数返回:16位无符号的AD值,中值+均值滤波后的结果(范围:0~4095)
//参数说明:channel:通道号
//      N:均值次数(范围:0~255),每次调用中值滤波获得
//功能概要:中值+均值滤波,实际采样次数=3*N
//============================================================================
uint_16 adc_ave(uint_8 channel, int N)
{long int i;float tmp;int  j;i=0;for(j = 0; j < N; j++) i=i+(long int)adc_mid(channel);tmp =i / N;return (uint_16)tmp;
}

MAIN

//说明见工程文件夹下的Doc文件夹内Readme.txt文件
#include "includes.h"int main(void){//1. 声明主函数使用的变量uint_32 mRuncount;     //主循环计数器uint_16 ADCResult[8];   //存放AD结果int i;//2. 关总中断DISABLE_INTERRUPTS;//3. 初始化外设模块uart_init (UART_2, 9600);        //波特率使用9600light_init(LIGHT_RED, LIGHT_OFF);     //初始化灯0//light_init(RUN_LIGHT_1, LIGHT_OFF);     //初始化灯1//light_init(RUN_LIGHT_2, LIGHT_OFF);     //初始化灯2//light_init(RUN_LIGHT_3, LIGHT_OFF);     //初始化灯3adc_init(1,10);      //初始化,通道,采样精度adc_init(2,12);      //初始化,通道,采样精度adc_init(3,12);      //初始化,通道,采样精度printf("Hello Uart! 2015-5-11\r\n"); //串口发送初始化提示//4. 给有关变量赋初值mRuncount = 0;            //主循环计数器//5. 使能模块中断uart_enable_re_int(UART_2);   //使能串口2接收中断//6. 开总中断ENABLE_INTERRUPTS;//进入主循环//主循环开始==================================================================for (;;) {//运行指示灯闪烁-----------------------------------------------mRuncount++;               //主循环次数计数器+1if (mRuncount >= RUN_COUNTER_MAX)  //主循环次数计数器大于设定的宏常数{mRuncount = 0;           //主循环次数计数器清零light_change(LIGHT_RED);      //灯0(RUN_LIGHT_0)状态变化//light_change(RUN_LIGHT_1);      //灯1(RUN_LIGHT_1)状态变化//light_change(RUN_LIGHT_2);      //灯2(RUN_LIGHT_2)状态变化//light_change(RUN_LIGHT_3);      //灯3(RUN_LIGHT_3)状态变化//以下加入用户程序----------------------------------------------//进行一次各个通道采样ADCResult[0] = adc_readonce(0);ADCResult[1] = adc_readonce(1);ADCResult[2] = adc_readonce(2);ADCResult[3] = adc_readonce(3);ADCResult[4] = adc_mid(4);ADCResult[5] = adc_mid(5);ADCResult[6] = adc_ave(6,10);ADCResult[7] = adc_ave(7,30);//芯片温度采集通道
//            temp=(adc_read(22)*5000)>>10;
//            VTemp=25-(temp-1396)/3.638;
//            //将采集的A/D值通过串口发送到PC
//             //1字节=8位,ADCResult的长度16*16位=16*2字节=32字节for(i=0;i<8;i++){printf("%d\t",ADCResult[i]);}printf("\n");
//            printf("%d.",(uint_16)VTemp);
//            printf("%d\r\n",(uint_16)((VTemp-(uint_16)VTemp)*100));}}  //主循环end_for//主循环结束==========================================================
}

恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记4——ADC相关推荐

  1. 恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3--GPIO模块(二)

    苏州大学资料KEIL模版 链接:https://pan.baidu.com/s/1e3g--GzvsU-lEIqy8WttGg  提取码:qwik 通过IO控制小灯亮灭. //============ ...

  2. 恩智浦+飞思卡尔后你需要知道的十件事

    这两年,半导体行业似乎进入了多事之秋,收购战此起彼伏.就在今年短短的3个月里,半导体行业并/收购案有:Avago Technologies 以 6 亿美金价格收购无线网络公司 Emulex Corp ...

  3. 飞思卡尔16位单片机(五)——ADC模数转换模块测试

    一.介绍 ADC模块的作用是将模拟的电压信号转换为CPU可以处理的数字信号.一些低端的单片机上没有ADC模块,必须使用片外的ADC芯片,才能实现模数转换的功能.而飞思卡尔的单片机一般是集成了ADC模块 ...

  4. STM32F407霸天虎HAL库学习笔记——使用ADC采集MQ135的数据并通过OLED显示

    STM32F407霸天虎HAL库学习笔记--使用ADC采集MQ135的数据并通过OLED显示 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil MQ135.c MQ135.h main函 ...

  5. 【Info】车载芯片的几个大玩家:飞思卡尔(Freescale), 恩智浦(NXP), 高通(Qualcomm)

    恩智浦前身为飞利浦(PHILIPS)半导体业务. 飞思卡尔的前身为摩托罗拉(Motorola)半导体部门. 2015年3月2日,恩智浦(NXP Semiconductors)宣布,将以大约118亿美元 ...

  6. 飞思卡尔地磁传感器MAG3110调试笔记

    首先我们要了解这么一个基本概念:地磁传感器必须和重力传感器一起工作,指南针才可以正常工作. 一.    调试要点: 1.    重力传感器的3轴有方向性,地磁传感器的数据输出也有方向性.我们必须根据硬 ...

  7. Freescale MC9S08AW60汇编学习笔记(五)

    前面学习了查表的功能,可以用查表的功能实现不少强大的功能,如查立方表.平方表.函数表.数码管显示的段码表等.这里还有一种由查表和转移指令配合使用而实现的一种强大的功能:散转.散转是指根据输入数据的不同 ...

  8. Freescale MC9S08AW60汇编学习笔记(三)

    前面给出了一个实现加法的小程序,但是如果要求变得更复杂.步骤变得更繁琐,这时又该怎么办呢??我们可以使用子程序来解决这个问题,这里给个例子:若字变量Data1和Data2分别存放着两个16位无符号数, ...

  9. STM32学习笔记(七) ADC模数转换测电平(普通和DMA模式)

    嵌入式系统在微控制领域(温度,湿度,压力检测,四轴飞行器)中占据着重要地位,这些功能的实现是由微处理器cpu(如stm32)和传感器以及控制器共同完成的,而连接他们,使它们能够互相正常交流的正是本小节 ...

最新文章

  1. C# ArrayList集合
  2. java Map 怎么遍历
  3. tp5获取mysql版本_TP5 + MySQL 应用地址选择
  4. import tensorflow 报错 ImportError: DLL load failed: 找不到指定的模块。
  5. Linux 系统管理员工具集
  6. 计算机科学与技术第2次上机实验,天大计算机科学与技术学院—汇编语言—上机实验报告302...
  7. java single instance_java单例模式(具体代码显现)两种方法
  8. js笔记(五)文档对象模型DOM
  9. vue-cli 引用elementUI打包后文件过大
  10. python基础学习笔记3
  11. php中echo和print的区别
  12. 常用Docker 镜像命令(二)
  13. 那些有实力进入 BAT 的本科生,都做对了什么事?
  14. 团队-科学计算器-代码设计规范
  15. ThingsBoard 提示 New ThingsBoard version xx is availabled!
  16. CrystalReports2008 SN
  17. 电子电路学习笔记(7)——LED发光二极管限流电阻计算
  18. 电脑计算机快捷键切换桌面,电脑切换界面的快捷键是什么_电脑切换桌面快捷键怎么用-win7之家...
  19. C#中服务器端以太网通讯(一对一)
  20. MySQL提示:The server quit without updating PID file问题的解决办法

热门文章

  1. APL平台测试版推出.
  2. 微信授权时遇到48001的问题
  3. Latex中 .cls和.sty文件的作用和区别
  4. Unity 游戏区域性崩溃,深藏的国际化巨坑
  5. 如何理解照片后期处理
  6. scada与MySQL连接_SCADA系统与实时数据库数据同步
  7. npm install 提示 path xxx/node_modules/node-sass npm ERR command failed 解决方法
  8. Java钉钉开发_异常_01_error code:50002, error message:请求的员工userid不在授权范围内...
  9. 编译:一个 C 程序的艺术之旅
  10. java webservice开发和调用(jdk1.5+eclipse3.4 + tomcat5.5+axis1.4+xfire1.2.6)