mcp4728_driver - MCP4728 MicroPython 驱动库
mcp4728_driver - MCP4728 MicroPython 驱动库
目录
- 简介
- 主要功能
- 硬件要求
- 文件说明
- 软件设计核心思想
- 使用说明
- 示例程序
- 注意事项
- 联系方式
- 许可协议
简介
本项目是 MCP4728 四通道 12 位 DAC(数模转换器)的 MicroPython 驱动库,隶属于 GraftSense-Drivers-MicroPython 生态,旨在为 MicroPython 开发者提供简洁、高效的 MCP4728 硬件控制接口,方便在嵌入式项目中实现精准的模拟电压输出。
主要功能
- 支持 MCP4728 的 I2C 通信接口控制
- 提供四通道独立的电压输出配置
- 支持 DAC 输出值的写入与读取
- 兼容主流 MicroPython 开发板与固件版本
- 封装底层寄存器操作,简化上层调用逻辑
硬件要求
- 硬件平台:任意支持 MicroPython 且带有 I2C 外设的开发板(如 ESP32、RP2040、PyBoard 等)
- 外设模块:MCP4728 四通道 12 位 DAC 模块
- 连接方式:通过 I2C 总线连接开发板与 MCP4728 模块(需确认 VCC、GND、SDA、SCL 引脚接线正确)
- 供电要求:MCP4728 模块推荐供电电压为 2.7V - 5.5V,需与开发板供电电平匹配
文件说明
软件设计核心思想
- 模块化封装:将 MCP4728 的硬件寄存器操作封装为独立的 Python 类,隐藏底层 I2C 通信细节,降低开发者使用门槛
- 易用性优先:提供直观的 API 接口(如
set_channel_voltage),无需深入理解硬件寄存器即可快速实现功能 - 兼容性设计:通过抽象 I2C 通信层,兼容不同 MicroPython 开发板的 I2C 实现,支持无特定固件依赖(
fw: all) - 开源协作:遵循 MIT 协议开源,鼓励社区贡献与二次开发,便于在各类嵌入式项目中复用与扩展
使用说明
- 准备工作:将
code/mcp4728.py文件拷贝至 MicroPython 开发板的文件系统中(可通过 mpremote、Thonny 等工具上传) - 初始化 I2C 总线:根据开发板硬件引脚,初始化 MicroPython 的 I2C 对象
- 创建驱动实例:导入
mcp4728模块,传入已初始化的 I2C 对象与 MCP4728 的 I2C 地址(默认地址可查阅芯片手册) - 配置输出:调用驱动 API 设置目标通道的输出电压或 DAC 值
- 运行验证:通过万用表或外设模块验证输出电压是否符合预期
示例程序
# Python env : MicroPython v1.23.0
# -*- coding: utf-8 -*-
# @Time : 2026/3/16 下午2:00
# @Author : hogeiha
# @File : main.py
# @Description : 验证MCP4728四通道DAC模块的输出功能,通过ADC读取DAC通道B的输出电压,确认数值、参考电压、增益等参数设置生效
# ======================================== 导入相关模块 =========================================
import time
from machine import Pin, I2C, ADC
import mcp4728
# ======================================== 全局变量 ============================================
# I2C SCL引脚
I2C_SCL_PIN = 5
# I2C SDA引脚
I2C_SDA_PIN = 4
# I2C通信频率
I2C_FREQ = 400000
# MCP4728目标I2C地址
TARGET_DAC_ADDR = 0x60
# ======================================== 功能函数 ============================================
def verify_dac_output():
"""
验证DAC通道B的输出功能,通过设置不同的数值、参考电压和增益,读取ADC值并转换为实际电压
Args:无
Raises:无
Notes:设置DAC数值后需短暂延时,确保输出电压稳定后再读取ADC值
==========================================
Verify the output function of DAC channel B, set different values, reference voltages and gains, read ADC values and convert to actual voltage
Args:None
Raises:None
Notes:A short delay is required after setting the DAC value to ensure the output voltage is stable before reading the ADC value
"""
# 示例1:设置通道B为12位最大值4095,对应满量程输出电压
dac1.b.value = 4095
# 延时0.1秒,等待DAC输出电压稳定
time.sleep(0.1)
# 读取ADC值,范围0-65535
adc_val = adc.read_u16()
# 将ADC值转换为实际电压,假设ADC参考电压为3.3V
voltage = (adc_val / 65535) * 3.3
# 打印DAC设置值、ADC读取值和实际电压(英文输出)
print(f"DAC Channel B set to 4095 → ADC reading: {adc_val} → Actual voltage: {voltage:.2f}V")
# 示例2:设置通道B为中间值2048
dac1.b.value = 2048
# 延时0.1秒,等待DAC输出电压稳定
time.sleep(0.1)
# 读取ADC值
adc_val = adc.read_u16()
# 转换为实际电压
voltage = (adc_val / 65535) * 3.3
# 打印相关信息(英文输出)
print(f"DAC Channel B set to 2048 → ADC reading: {adc_val} → Actual voltage: {voltage:.2f}V")
# 示例3:使用归一化值(0.0-1.0)设置通道B输出
dac1.b.normalized_value = 0.5
# 延时0.1秒,等待DAC输出电压稳定
time.sleep(0.1)
# 读取ADC值
adc_val = adc.read_u16()
# 转换为实际电压
voltage = (adc_val / 65535) * 3.3
# 打印相关信息(英文输出)
print(f"DAC Channel B set to 0.5 (normalized) → ADC reading: {adc_val} → Actual voltage: {voltage:.2f}V")
# 示例4:修改通道B的参考电压和增益后验证输出
# 设置通道B参考电压为内部2.048V
dac1.b.vref = 1
# 设置通道B增益为2倍(仅内部参考电压生效)
dac1.b.gain = 2
# 设置通道B数值为4095
dac1.b.value = 4095
# 延时0.1秒,等待DAC输出电压稳定
time.sleep(0.1)
# 读取ADC值
adc_val = adc.read_u16()
# 转换为实际电压
voltage = (adc_val / 65535) * 3.3
# 打印相关信息(英文输出)
print(f"DAC Channel B (Vref=2.048V, gain=2) → Actual voltage: {voltage:.2f}V")
# ======================================== 自定义类 ============================================
# ======================================== 初始化配置 ===========================================
# 系统启动延时3秒,确保硬件初始化完成
time.sleep(3)
# 打印初始化完成提示(英文)
print("FreakStudio: MCP4728 DAC output verification via ADC")
# 初始化I2C总线,变量名改为i2c_bus,对齐示例代码风格
i2c_bus = I2C(0, scl=Pin(I2C_SCL_PIN), sda=Pin(I2C_SDA_PIN), freq=I2C_FREQ)
# 新增完整的I2C扫描逻辑,严格对齐示例代码风格
# 开始扫描I2C总线上的设备
devices_list: list[int] = i2c_bus.scan()
print("START I2C SCANNER")
# 检查I2C设备扫描结果
if len(devices_list) == 0:
print("No i2c device !")
raise SystemExit("I2C scan found no devices, program exited")
else:
print("i2c devices found:", len(devices_list))
# 遍历地址列表初始化目标DAC模块
dac1 = None # 初始化DAC变量
for device in devices_list:
if device == TARGET_DAC_ADDR:
print("I2c hexadecimal address:", hex(device))
try:
# 初始化MCP4728 DAC模块
dac1 = mcp4728.MCP4728(i2c_bus=i2c_bus, address=TARGET_DAC_ADDR)
print("Target DAC (MCP4728) initialization successful")
break
except Exception as e:
print(f"DAC Initialization failed: {e}")
continue
# 未找到目标DAC地址时抛出异常
if dac1 is None:
raise Exception("No MCP4728 DAC found on I2C bus")
# 初始化ADC对象,指定引脚26用于读取DAC输出的模拟电压
adc = ADC(Pin(26))
# ======================================== 主程序 ============================================
# 执行DAC输出验证函数
verify_dac_output()
# 读取并打印通道B的电源模式、参考电压、增益参数(英文输出)
print("
Current Channel B power mode: ", dac1.b.pdm)
print("Current Channel B reference voltage: ", dac1.b.vref)
print("Current Channel B gain: ", dac1.b.gain)
注意事项
- I2C 地址确认:MCP4728 的 I2C 地址由硬件地址引脚(A0/A1/A2)决定,使用前需确认实际地址并传入驱动初始化函数
- 电压范围限制:输出电压不得超过 MCP4728 的供电电压与参考电压范围,避免损坏硬件
- 固件兼容性:本驱动无特定固件依赖(
fw: all),但需确保开发板运行的 MicroPython 版本支持machine.I2C模块 - 线程安全:在多线程环境下使用时,需自行处理 I2C 总线的并发访问问题,避免通信冲突
- 参考电压:输出电压计算依赖于参考电压(VREF),使用时需根据硬件电路准确配置 VREF 参数
联系方式
如有任何问题或需要帮助,请通过以下方式联系开发者:
📧 邮箱:liqinghsui@freakstudio.cn
💻 GitHub:https://github.com/FreakStudioCN
许可协议
本项目采用 MIT License 开源,完整协议内容如下:
MIT License
Copyright (c) 2026 FreakStudio
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.