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

发布者:hzx312895379最新更新时间:2021-04-06 来源: eefocus关键字:飞思卡尔  KEA128  ADC 手机看文章 扫描二维码
随时随地手机看文章

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/VREFL

    ADC_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;

    else

      tmp = 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);        //波特率使用9600

    light_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);     //初始化灯3

    adc_init(1,10);      //初始化,通道,采样精度

    adc_init(2,12);      //初始化,通道,采样精度

    adc_init(3,12);      //初始化,通道,采样精度

    printf("Hello Uart! 2015-5-11rn"); //串口发送初始化提示

    //4. 给有关变量赋初值

    mRuncount = 0;            //主循环计数器

    //5. 使能模块中断

    uart_enable_re_int(UART_2);   //使能串口2接收中断

    //6. 开总中断

    ENABLE_INTERRUPTS;

 

    //进入主循环

    //主循环开始==================================================================

    for (;;) {

        //运行指示灯闪烁-----------------------------------------------

        mRuncount++;               //主循环次数计数器+1

        if (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("%dt",ADCResult[i]);

            }

            printf("n");

//            printf("%d.",(uint_16)VTemp);

[1] [2]
关键字:飞思卡尔  KEA128  ADC 引用地址:恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记4——ADC

上一篇:恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记3——看门狗
下一篇:飞思卡尔单片机KEA128之ADC学习

推荐阅读最新更新时间:2024-11-18 21:08

Globalpress 2011:Freescale正在打造的‘传感系统’王国
    在MEMS领域,飞思卡尔(Freescale)不得不提通常也不会缺席。这不,在Globalpress第三日的MEMS Day上,freescale全球市场销售总裁 Glen Burchers 就作为首发嘉宾为我们做了宣讲。     Glen 说,与市场上其他类半导体产品的发展一样,如ASIC,SoC,MEMS传感器的最终发展趋势也是将更多种类的传感器,处理器以及电源管理等模块集中到一个封装里,即形成所谓的‘传感系统’。“从而使得终端设备尺寸更小,设计更加智能化。”     如上图示,Glen用金字塔的形式展示并且预测了传感器市场的发展。最底层是传感器产品发展的初级阶段,各个独立的传感单元器被集成在电子产品中,每个芯片需要
[嵌入式]
DIALOG半导体为卡尔I.MX 6双核 四核处理器优化电源
德国Kirchheim/Teck和中国北京--(美国商业资讯)--高集成度和创新的电源管理、音频和近距离无线技术解决方案提供商Dialog 半导体有限公司(法兰克福股票交易所代码:DLG)宣布:该公司的单芯片系统电源管理芯片(PMIC)被用于优化基于飞思卡尔多核i.MX 6系列应用处理器的平板电脑、信息娱乐系统、媒体中枢以及其它智能设备的供电需求。 公司的旗舰性PMIC处于飞思卡尔i.MX 6双核/四核应用处理器的电源管理原始设计电路的核心位置,现可通过Dialog DA9053得以实现对i.MX 6Solo/SoloLite的支持,该器件以前曾应用于飞思卡尔i.MX53多媒体平台。飞思卡尔是Dialog战略性合作伙伴之一,并得
[电源管理]
高速模数转换器输入阻抗测量
在通信领域,随着中频(IF)频率越来越高,了解输入阻抗如何随频率而变化变得日益重要。本文解释了为什么ADC输入阻抗随频率而变化,以及为什么这是个电路设计难题;然后比较了确定输入阻抗的两种方法:利用网络分析仪测量法和利用数学分析方法计算法。本文还介绍了正确使用网络分析仪的过程,并且提供了一个数学模型,其计算结果与实际测量结果非常接近。 利用高速ADC进行设计时,常常要考虑这样的问题: ADC的模拟输入阻抗与频率有何关系? 数据手册只给出对应一个频点的阻抗。如果要处理100 MHz以上的IF,那输入阻抗是多少?输入阻抗是随频率变化还是保持不变? 考虑在信号链中使用任何新器件时,输入/输出阻抗通常是让所需的信号链各模块配合得当的重要规
[测试测量]
高速<font color='red'>模数转换器</font>输入阻抗测量
卡尔推出面向汽车HVAC控制的参考解决方案
2012年8月14日,北京(飞思卡尔技术论坛)讯-飞思卡尔半导体 日前宣布推出两款汽车供暖、通风与空调(HVAC)参考控制解决方案,旨在提供完整的、生产就绪型硬件和软件解决方案,以帮助原始设备制造商(OEM)和一级供应商缩短开发周期并降低总体研发成本。 这两个参考解决方案提供一个低功率、低成本、多功能和多扩展平台,并可以根据用户在12V或24V汽车HVAC系统中的具体需求进行定制。 此两款参考解决方案集成了飞思卡尔S12G和S12HY 16位微控制器(MCU),以及具有关键电机控制算法的MC33905、MC33932和MC33937模拟器件。基于S12G的解决方案可驱动常用的HVAC系统中的所有电机类型,例如无刷直流、DC及步
[汽车电子]
51单片机学习:ADC模数转换实验--外部通道电压采集
实验名称:ADC模数转换实验--外部通道电压采集 接线说明: 实验现象:下载程序后,数码管上显示AD模块采集外部通道AIN3的电压值 注意事项: ***************************************************************************************/ #include public.h #include smg.h #include xpt2046.h /******************************************************************************* * 函 数 名 : main * 函数功能 :
[单片机]
四 ARM9(S3C2440)的ADC和触摸屏控制——理论知识
概述 10 位CMOS ADC(模/数转换器)是一个8 通道模拟输入的再循环类型设备。其转换模拟输入信号为10 位二 进制数字编码,最大转换率为2.5MHz A/D 转换器时钟下的500 KSPS。A/D 转换器支持片上采样-保持功能和掉电 模式的操作。 触摸屏接口可以控制/选择触摸屏X、Y 方向的引脚(XP,XM,YP,YM)的变换。触摸屏接口包括触摸屏引 脚控制逻辑和带中断发生逻辑的ADC 接口逻辑。 触摸屏接口模式 1. 普通转换模式 单转换模式是最合适的通用ADC 转换。此模式可以通过设置ADCCON(ADC 控制寄存器)初始化并且通过读写 ADCDAT0(ADC 数据寄存器0)就能够完成。 2. 分离的X/Y 方向转换模
[单片机]
卡尔智能电池监控保障汽车安全
每辆汽车中都至少有一个蓄电池,它通常有两个功能:启动发动机;给车内的电气装置供电,例如电动车窗,车载收音机等。在汽车发动机启动后,发动机将会通过发电机把动能转化为电能,然后给汽车电池充电来实现这个功能。 为了满足以上两个功能,汽车的电池需要提供一个稳定的12伏的直流电源。电池工作异常,是很多汽车电气故障的主要原因,其中与发动机有关的问题将可能引发一系列的安全隐患。汽车发展的主流趋势就是车载电子设备和电子应用越来越多,混合动力和纯电动汽车逐渐流行,这都直接导致汽车电力负荷越来越高,不断增加电池的压力,要求对电池的工作情况尽可能多的实现实时监控,以分析可能出现的故障原因。另一个市场需求来自于气候的变化,极端天气的频繁出现让车载电池
[嵌入式]
分析智能电表设计的挑战
采用 智能电表 让企业和工程师有更多机会设计出符合不断演进的全球标准的计量解决方案,这些解决方案能够满足未来需求,并将成为大众解决方案的一部分,即低成本解决方案。然而,要设计出成功的计量解决方案,还需要克服许多难题。 很多时候,开发计量芯片的设计人员甚至没有意识到计量解决方案所面对的挑战和需求。在这种情况下,设计人员很容易出现设计问题,使产品因为小的设计缺陷而无法用于最终解决方案。 本文将介绍计量SoC设计中的一些主要问题,并提出一些能够实现预期目标的解决方案。同时,本文还使SoC设计人员能够提前了解挑战,从而能够从容应对并设计出有效的解决方案。 挑战1:精确度 精确度是计量应用获得成功的关键,因为服
[嵌入式]
分析智能电表设计的挑战
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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