登录/注册

mtk平台adc学习笔记

更多

以下是针对 MTK平台ADC驱动开发 的学习笔记整理,重点涵盖硬件架构、软件驱动框架和关键代码实现,适用于嵌入式Linux/Android系统开发人员:


一、硬件基础

  1. ADC控制器

    • MTK SoC内置多路ADC,通常为12-bit精度,支持差分/单端输入模式。
    • 关键参数:
      • 采样率:典型值 500Ksps(不同平台有差异)
      • 输入电压范围:0V ~ 1.8V 或 0V ~ 3.3V(需查数据手册)
      • 通道数:8~16路(如MT6765支持12通道)
  2. 信号通路

    传感器 → 外部RC滤波 → MTK ADC引脚 (AUX_INx) → 内部多路复用器 → ADC核心 → APB总线

二、Linux驱动框架

MTK ADC驱动基于 Linux IIO子系统 实现:

drivers/iio/adc/mt6370_adc.c         # PMIC内置ADC示例
drivers/iio/adc/mtk_auxadc.c         # SoC内置ADC主驱动

关键结构体

struct mtk_auxadc_device {
    void __iomem *reg_base;
    struct clk *adc_clk;
    struct mutex lock;
};

struct iio_dev *indio_dev;           // IIO设备核心结构

三、设备树(DTS)配置

&auxadc {
    compatible = "mediatek,mt6577-auxadc";
    reg = <0x11001000 0x1000>;       // AUXADC寄存器基址
    clocks = <&clk26m>;              // 时钟源
    clock-names = "main";
    #io-channel-cells = <1>;         // 每个通道独立标识
};

/* 使用ADC通道示例 */
bat_thermistor {
    compatible = "mediatek,bat_therm";
    io-channels = <&auxadc 0>;       // 使用通道0
    io-channel-names = "batt_therm";
};

四、驱动核心流程

1. 通道初始化

static const struct iio_chan_spec mtk_auxadc_channels[] = {
    AUXADC_CHANNEL(0, "CH0"),  // 通道0:电池电压
    AUXADC_CHANNEL(1, "CH1"),  // 通道1:充电电流
};

2. 数据采集函数

static int mtk_auxadc_read_raw(struct iio_dev *indio_dev,...){
    // 启动转换
    writel(MTK_AUXADC_CON_V | MTK_AUXADC_CON1_CHANNEL(channel),
           base + MTK_AUXADC_CON1);

    // 等待转换完成 (超时机制)
    while (timeout--) {
        if (readl(base + MTK_AUXADC_STA) & BIT_ADC_DONE)
            break;
    }

    // 读取ADC原始值
    *val = readl(base + MTK_AUXADC_DAT0) & MTK_AUXADC_DATA_MASK;
    return IIO_VAL_INT;
}

五、校准处理

MTK ADC需校准以减少误差:

// 应用校准系数(通常存放在NVRAM)
raw_value = read_adc_channel(0);
calibrated_value = (raw_value - offset) * slope / 1000 + temp_offset;

提示:校准参数通过工厂测试写入,存储在/persist/adc_calib.bin


六、用户空间访问

  1. 通过sysfs读取

    cat /sys/bus/iio/devices/iio\:device0/in_voltage0_raw  # 通道0原始值
  2. 通过IIO API读取(推荐):

    int fd = open("/dev/iio:device0", O_RDONLY);
    ioctl(fd, IIO_GET_EVENT_FD_IOCTL, &event_fd);

七、常见问题解决

  1. ADC采样值跳变

    • 检查PCB布局:模拟信号远离高频线路
    • 增加RC滤波(e.g., 10KΩ + 100nF)
  2. 转换超时错误

    • 确认ADC时钟是否使能:clk_prepare_enable(adc->adc_clk);
    • 检查DTS中clock配置是否正确
  3. 精度不足

    • 开启多次采样取平均:
      for(int i=0; i<4; i++) sum += read_adc();
      adc_value = sum / 4;

八、关键寄存器映射

寄存器偏移 名称 功能描述
0x0000 AUXADC_CON0 ADC全局控制
0x0008 AUXADC_CON1 通道选择/启动转换
0x0100 AUXADC_DAT0 通道0数据寄存器
0x0214 AUXADC_STA 状态寄存器(BIT_ADC_DONE)

九、扩展功能

  1. 温度传感器接入
    通过AUXADC读取NTC电阻值,需在驱动中实现查表法:

    static const int bat_temp_table[] = {
    /* -20℃ */ 125000,
    /* -10℃ */ 85000,
    /*  0℃  */ 60000,  // 根据实际NTC B值表填充
    };
  2. 充电电流检测
    连接电流检测电阻至ADC,计算算法:

    current_ma = (adc_value * 1800 / 4096) / (0.1 * 1000); // 0.1Ω采样电阻

完整代码示例
? MTK AUXADC驱动参考实现(官方GitHub仓库)

建议结合具体平台数据手册(如《MT6765_Datasheet》第12章)和实际硬件原理图进行调试。

Nucleo平台sleep和deepsleep模式的学习资料

本笔记以 Nucleo-F103RB 为平台,基于mbed平台的C语言开发,是一个系列课程,欢迎大家下载

2023-10-07 06:49:32

STM32Cube学习笔记

STM32Cube学习笔记,一步一步手把手带你进入STM32Cube的世界,包括点灯,按键,串口,ADC,DAC等等一共16篇。

2023-09-20 06:49:48

ADC学习笔记(二)

使用和处理信息,就需要将模拟量转换为数字量,并传送到微控制器或微处理器。 那么ADC转换是如何实现的呢? 这是一个什么样的过程? 阅读下面的笔记,你一定会对模数转换器有更全面、更系统的了解。

2023-02-09 12:21:17

MSP430 G2553 学习笔记--ADC模块

MSP430 G2553 学习笔记--ADC模块(通信电源技术是省刊吗)-文档为MSP430 G2553

资料下载 李勇 2021-09-18 16:20:31

cortex_m3_stm32嵌入式学习笔记16之ADC资料下载

电子发烧友网为你提供cortex_m3_stm32嵌入式学习笔记16之ADC资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文

资料下载 吴湛 2021-04-28 08:44:11

MTK平台手机射频电路的工作原理及分析

MTK平台手机射频电路的工作原理及分析

资料下载 佚名 2021-03-23 17:17:49

MXNet深度学习计算平台中文学习笔记免费下载

本文档的主要内容详细介绍的是MXNet深度学习计算平台中文学习笔记免费下载。

资料下载 佚名 2021-03-01 10:09:00

机器学习的个人学习笔记

本文档的主要内容详细介绍的是机器学习的个人学习笔记免费下载。

资料下载 佚名 2021-03-01 09:28:25

ADC学习笔记(一)

信息,就需要将模拟量转换为数字量,并传送到微控制器或微处理器。那么ADC转换是如何实现的呢?这是一个什么样的过程?阅读下面的笔记,你一定会对模数转换器有更全面、更系统的了解。

2023-02-09 12:09:19

Arduino学习笔记

1.前言    近段时间,博主陆续更新了ESP8266学习笔记,主要开发平台是Arduino。但是,对于很多无基础的初学者来说,甚至不了解Ard

2021-11-23 06:35:10

NodeMCU学习笔记

NodeMCU学习笔记(1)— 硬件介绍、固件制作、烧录提示:作者使用 ESP8266 进行开发学习。文章目录NodeMCU

2021-11-04 07:43:12

MTK手机平台充电的原理是什么

MTK手机平台充电原理

2021-09-14 09:08:46

MTK平台上实现2ME需要哪些功能?

J2ME是什么?在MTK平台上实现J2ME运行环境,需要哪些功能?怎样去设计并实现J2ME运行平台?

2021-04-27 06:22:46

教你们如何解决MTK平台手机重启问题

目前采用MTK平台开发的GSM单卡单待机器和双卡双待机器的设计过程中经常出现手机重启(重新搜索网络)的现象。本文针

2021-04-05 08:46:00

疯壳-MTK智能穿戴入门篇-平台框架

目录一、MTK开发环境搭建3二、MTK平台框架6三、MTK编译指令11四

2020-09-29 15:41:36
7天热门专题 换一换
相关标签