历史上的今天
返回首页

历史上的今天

今天是:2025年04月06日(星期日)

2021年04月06日 | 恩智浦 飞思卡尔Freescale Kinetis KEA128学习笔记4——ADC

2021-04-06 来源:eefocus

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

推荐阅读

史海拾趣

Fibrefab Limited公司的发展小趣事

Fibrefab始终坚持以客户为中心的服务理念。为了提升客户满意度和忠诚度,Fibrefab不断加强售前咨询、售中服务和售后支持等方面的投入。公司建立了一套完善的服务体系,为客户提供从方案设计、产品选型、安装调试到后期维护等全方位的服务支持。此外,Fibrefab还积极收集客户反馈和建议,不断优化产品和服务以满足客户需求。

Conexcon Group公司的发展小趣事

面对日益激烈的市场竞争,Conexcon Group积极寻求与国内外知名企业的战略合作。通过与行业巨头的联合研发和市场推广,公司成功将自身产品推向了更广阔的市场。同时,这些合作也为公司带来了先进的技术和管理经验,进一步提升了公司的核心竞争力。在合作中,Conexcon Group始终坚持开放、共赢的原则,与合作伙伴共同推动电子行业的发展。

EECO Switch公司的发展小趣事

1993年,Transico公司收购了EECO Switch部门,这标志着EECO Switch公司进入了一个全新的发展阶段。在被收购后,EECO Switch获得了更多的资源和支持,进一步加速了其业务拓展的步伐。公司不仅在原有的人机界面产品领域继续深耕细作,还积极拓展新的业务领域,如智能家居、物联网等。

Achronix Semiconductor Corporation公司的发展小趣事

1993年,Transico公司收购了EECO Switch部门,这标志着EECO Switch公司进入了一个全新的发展阶段。在被收购后,EECO Switch获得了更多的资源和支持,进一步加速了其业务拓展的步伐。公司不仅在原有的人机界面产品领域继续深耕细作,还积极拓展新的业务领域,如智能家居、物联网等。

芯海科技(CHIPSEA)公司的发展小趣事

随着市场需求的不断升级,芯海科技在ADC芯片的基础上,开始研发自主知识产权的8位MCU(微控制器)内核。经过数年的努力,公司成功将8位MCU内核技术应用于消费类电子产品市场,如小家电、电子玩具等。这一技术的突破进一步巩固了芯海科技在电子行业的地位,并为其后续发展提供了有力支撑。

DB Unlimited公司的发展小趣事

DB Unlimited始终将技术创新作为公司发展的核心驱动力。公司不断投入大量资源进行技术研发和创新,推出了多项具有行业领先水平的音频技术。这些技术的推出不仅提升了公司的竞争力,也推动了整个音频行业的发展。DB Unlimited的技术创新能力和成果得到了业界的广泛认可。

问答坊 | AI 解惑

8051.单片机.c.语言彻底应用

8051.单片机.c.语言彻底应用,希望对想学C语言的人有用。…

查看全部问答>

ADF7020-1 工业级嵌入式无线数传模块资料分享,实测距离1500m

1. 微发射功率:最大发射功率17dBm(50mW) 2. 工作载频频率470-490MHz,无需申请频点(国家无委最新开放频段) 3. 基于GFSK调制方式的高效前向纠错编码方式,提高抗干扰能力和低误码率 4. 传输距离远     在视距情况下,可靠 ...…

查看全部问答>

谁有tornado2.2 for mips ?

小弟刚刚学习vxworks,要作MIPS的BSP开发, 请问谁有tornado2.2 for mips 呀?…

查看全部问答>

arm7(LPC2103)键盘测试程序,为什么总是进不了中断呢?兄弟们进来帮帮

/***************************************************************************** *   uarttest.c:  main C entry file for Philips LPC214x Family Microprocessors * *   Copyright(C) 2006, Philips Semi ...…

查看全部问答>

请问WINCE下的进程监控如何实现?

目前需要实现:能捕获到某个指定exe窗体打开事件,在打开前调用自己的程序,根据程序运行结果判断是否执行被拦截的exe事件。 原本是准备用钩子函数的,但是所有找到的WINCE钩子函数都说只有三个钩子:WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KE ...…

查看全部问答>

请问什么叫做In-box driver?谢谢!

最近看新版本得WDK关于驱动部分的内容,看到一个叫做In-box driver的名词,请问这指的是什么类型的驱动?或者驱动的什么方面内容?谢谢!…

查看全部问答>

PWM波的占空比?

改变PWM波的占空比可以让电机转,改变PWM波的周期可以 调速。假如周期为500,我让占空比从10变到490和从240变到 260会有什么不一样?请各位大侠不吝赐教,谢谢! …

查看全部问答>

收到接近感应传感器开发套件,分享一下PuzzleSwipe应用

先上全家福 PuzzleSwipe软件界面如下图所示 操作说明请参照HID_USBtoIR参考设计 1.下载PuzzleSwipe Application 下载地址http://www.silabs.com/Support%20Documents/Software/HID_USB_to_IR_RD.exe 2.下载完成后安装时需要PC机有microsof ...…

查看全部问答>

晒晒pos机套件!

一整套(很多,一堆)系统的芯片,开发难度有点大,请问有PCB开发板吗?自己可以把芯片焊上去,不过BGA的怎么焊?主要还是想获得开发板那样的技术支持,否则开发时间太长了 [ 本帖最后由 lidonglei1 于 2013-1-27 15:33 编辑 ]…

查看全部问答>