STM32F745ZG与ADS1015L高精度数据采集系统设计

基于价值的深度强化学习:DQN 本文主要是介绍DQN原理和算法伪代码和代码实现,算法实现包括pytorch版本和stable-baselines3版本 阅读详情

1. 项目背景与核心器件选型

在工业控制、医疗设备和消费电子等领域,模拟信号的高精度数字化转换一直是关键需求。ADS1015L作为德州仪器(TI)推出的一款12位ΔΣ型模数转换器(ADC),以其低功耗、高集成度和灵活的I2C接口特性,成为中小规模信号采集系统的理想选择。STM32F745ZG则是STMicroelectronics基于ARM Cortex-M7内核的高性能微控制器,内置硬件I2C外设和丰富的内存资源,能够高效处理ADC采集的数据。

这个组合的独特优势在于:

  • ADS1015L提供±6.144V的宽输入范围,支持单端和差分输入模式
  • 内置可编程增益放大器(PGA)实现信号调理
  • I2C接口简化硬件连接,400kHz通信速率满足实时性要求
  • STM32F745ZG的216MHz主频和硬件浮点单元确保数据处理效率

2. 硬件系统设计与连接

2.1 电路原理图解析

典型连接方案中,ADS1015L与STM32F745ZG通过I2C总线通信,硬件连接包含以下关键点:

  1. 电源配置:

    • ADS1015L工作电压2.0-5.5V,建议使用3.3V稳压供电
    • STM32F745ZG的I/O电压需与ADC匹配(3.3V)
    • 在VDD和GND间放置0.1μF去耦电容
  2. I2C接口连接:

    • SDA线连接PB9(GPIOB pin9)
    • SCL线连接PB8(GPIOB pin8)
    • 总线需配置4.7kΩ上拉电阻
  3. 模拟输入保护:

    • 输入信号超过VDD+0.3V时需添加分压电路
    • 高频干扰环境下建议增加RC低通滤波

2.2 地址配置与中断处理

ADS1015L支持通过ADDR引脚配置I2C地址:

  • ADDR接地:0x48(默认)
  • ADDR接VDD:0x49
  • ADDR接SDA:0x4A
  • ADDR接SCL:0x4B

ALERT引脚可配置为转换就绪中断输出,连接至STM32的外部中断引脚(如PG6),实现事件驱动型数据采集。

3. 软件驱动开发与配置

3.1 I2C外设初始化

使用STM32CubeMX配置I2C1外设:

hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 400000; // 400kHz标准模式
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
    Error_Handler();
}

3.2 ADS1015L寄存器配置

关键寄存器操作函数示例:

#define ADS1015_ADDR 0x48
#define CONFIG_REG 0x01

uint16_t readADS1015Reg(uint8_t reg) {
    uint8_t data[2];
    HAL_I2C_Mem_Read(&hi2c1, ADS1015_ADDR<<1, reg, 1, data, 2, 100);
    return (data[0] << 8) | data[1];
}

void writeADS1015Reg(uint8_t reg, uint16_t value) {
    uint8_t data[2] = {value >> 8, value & 0xFF};
    HAL_I2C_Mem_Write(&hi2c1, ADS1015_ADDR<<1, reg, 1, data, 2, 100);
}

3.3 转换模式设置

单次转换模式配置示例(测量AIN0-AIN1差分输入):

void startSingleEndedConversion(uint8_t channel) {
    uint16_t config = 0x8583; // 默认配置
    config |= (channel << 12); // 设置输入通道
    writeADS1015Reg(CONFIG_REG, config);
}

4. 数据采集与处理优化

4.1 原始数据读取与转换

读取转换结果并转换为电压值:

float readVoltage(uint8_t channel) {
    startSingleEndedConversion(channel);
    while(!HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_6)); // 等待转换完成
    
    uint16_t raw = readADS1015Reg(0x00);
    raw = (raw >> 4) & 0x0FFF; // 12位有效数据
    
    float fsr = 6.144f; // 根据PGA设置调整量程
    return (raw * fsr) / 2048.0f; // 12位有符号转换
}

4.2 采样率优化策略

通过调整数据速率寄存器(DR[7:5])平衡速度与精度:

  • 128SPS:最高精度,低噪声
  • 1600SPS:平衡模式
  • 3300SPS:最高速度,噪声增加

实测建议:

// 设置1600SPS采样率
uint16_t config = readADS1015Reg(CONFIG_REG);
config &= ~(0xE0); // 清除DR位
config |= (0x04 << 5); // 设置1600SPS
writeADS1015Reg(CONFIG_REG, config);

5. 系统集成与性能测试

5.1 多通道采集方案

利用ADS1015L的4通道输入实现轮询采集:

#define NUM_CHANNELS 4
float channelVoltages[NUM_CHANNELS];

void pollAllChannels() {
    for(int i=0; i<NUM_CHANNELS; i++) {
        channelVoltages[i] = readVoltage(i);
        HAL_Delay(2); // 通道切换稳定时间
    }
}

5.2 噪声抑制与精度验证

实测数据表明,在3.3V供电、1600SPS设置下:

  • 输入短接时RMS噪声:~0.5mV
  • INL(积分非线性):±2LSB
  • 有效分辨率:11.3位(典型值)

提高精度的技巧:

  1. 使用差分输入模式抑制共模噪声
  2. 在MCU端添加移动平均滤波
  3. 避免数字信号线与模拟线平行走线

6. 高级应用与扩展

6.1 阈值比较器应用

配置ADS1015L内置数字比较器实现硬件触发:

void setupComparator(uint16_t highThresh, uint16_t lowThresh) {
    writeADS1015Reg(0x02, highThresh << 4); // HI_THRESH寄存器
    writeADS1015Reg(0x03, lowThresh << 4);  // LO_THRESH寄存器
    
    uint16_t config = readADS1015Reg(CONFIG_REG);
    config |= 0x0001; // 启用比较器模式
    writeADS1015Reg(CONFIG_REG, config);
}

6.2 低功耗设计技巧

对于电池供电应用:

  1. 使用单次转换模式(降低90%功耗)
  2. 采样间隔期间关闭MCU外设
  3. 利用ALERT引脚唤醒MCU

实测电流消耗:

  • 连续模式:150μA(典型)
  • 单次模式:0.5μA(休眠状态)

7. 常见问题排查

7.1 I2C通信失败诊断

典型故障处理流程:

  1. 用逻辑分析仪检查总线波形
  2. 验证上拉电阻值(4.7kΩ最佳)
  3. 检查地址配置(示波器观察ACK信号)
  4. 测试不同时钟速度(从100kHz开始)

7.2 数据异常分析

异常现象与可能原因:

  • 读数跳变大:电源噪声→加强去耦
  • 固定偏移:接地不良→检查地回路
  • 饱和失真:输入超量程→调整PGA

调试建议:

// 诊断代码:读取所有寄存器值
void debugReadAllRegs() {
    for(int i=0; i<4; i++) {
        uint16_t val = readADS1015Reg(i);
        printf("Reg%d: 0x%04X\n", i, val);
    }
}

这个组合在实际项目中展现出极高的性价比,特别适合需要4通道中精度采集的场景。经过优化后,系统可实现±0.5%的测量精度,满足大多数工业检测需求。对于需要更高精度的应用,可考虑ADS1115(16位版本),但其采样率会相应降低。

18|AI 辅助精准测试:让平台会解释、会总结、会推荐 本文介绍 AI 在精准测试平台中的落地方式,包括变更摘要、风险解释、补测建议和报告总结。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。从报告中提取变更文件、未覆盖行、推荐用例。拼成结构化 JSON。让 AI 生成 200 字质量摘要。把摘要展示在报告顶部。读完本文后,可以复制下面的 Prompt,让 AI 生成一个报告总结练习。你是一名 AI 应用开发专家和测试架构师。 阅读详情

相关推荐

基于STM32F103的二维码识别项目——OV7670篇

此系列用于记录做过的项目,这篇文章介绍基于STM32F103的二维码识别项目之OV7670FIFO模块。

beyourself_he的博客 4288

hdu4652(概率DP,推公式)

地址:http://acm.hdu.edu.cn/showproblem.php?pid=4652 Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 344    Accepted Submission(s): 22

ten_three 1596

光耦CTR参数实战:如何避免误触发与功耗陷阱(附计算公式)

本文深入解析光耦CTR参数在电路设计中的关键作用,探讨如何平衡误触发风险与功耗表现。通过TLP521、PC817等常见型号的实测数据对比,提供不同工作状态下的选型策略和计算公式,帮助工程师优化设计,提升系统稳定性和能效。

2a4s6d8f0g的博客 323

hdu 4652 Dice(dp)

题目链接:hdu 4652 Dice代码#include <cstdio> #include <cstring> #include <cmath> #include <algorithm>using namespace std; const int maxn = 1e6 + 5;/* * k = 0, 设dp[i]表示连续出现i的一样的次数期望 * 设xi = dp[i] - dp[i-1]

不慌不忙、不急不躁 719

Ubuntu终端AI编程助手配置:Claude Code接入DeepSeek模型全攻略

在软件开发领域,AI编程助手正成为提升开发效率的重要工具。其核心原理是通过大语言模型理解自然语言指令,生成、解释或调试代码。这类工具的技术价值在于将AI能力无缝集成到开发工作流中,减少上下文切换,实现更流畅的人机协作。常见的应用场景包括代码生成、错误调试、代码重构和技术问答等。本文聚焦于在Ubuntu系统中,将流行的终端AI助手Claude Code的后端模型从原版Claude替换为DeepSeek。通过配置环境变量实现API端点和模型的映射,这一过程涉及Node.js环境管理、npm包安装和关键环境变量设

weixin_42527654的博客 378

Redis中什么是Big Key(大key)问题?如何解决Big Key问题?

通俗易懂的讲,Big Key就是某个key对应的value很大,占用的redis空间很大,本质上是大value问题。key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。redis中这些Big Key对应的value值很大,在序列化/反序列化过程中花费的时间很大,因此当我们操作Big Key时,通常比较耗时,这就可能导致redis发生阻塞,从而降低redis性能。用几个实际的例子对大Key的特征进行描述:● 一个String类型的Key,它的值为5MB(数据过大); ● 一

weixiaohuai的博客 3万+

HDU 4652 Dice 概率DP,推式子

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4652 题意 询问0mn,1mn。 0mn代表m面骰子投出连续n个相同期望次数 1mn代表m面骰子投出连续n个各不相同期望次数 思路 期望DP 一卷数列压轴 话不多说看图 教训/收获 TMD 代码 #include<cstdio> #include<iostream> #include<iomanip> #include<map> #include<unor

TheSunspot的博客 231

别再让CPU干GPU的活了:CST Studio Suite GPU加速深度调优指南(从驱动版本到任务管理器监控)

本文深入探讨了CST Studio Suite的GPU加速深度调优方法,从NVIDIA驱动版本选择到系统级资源管理,再到实时监控与瓶颈诊断技术。通过科学的驱动优化、GPU资源管理策略和高级调优技巧,显著提升仿真效率,特别适合电磁仿真工程师和硬件加速需求的专业用户。

weixin_28740299的博客 166

HDU 4652(Dice)

题意:给定一个 m面的色子,求连续摇到 n 次相同的点数 和 连续摇到 n 个两两不相同的点数 需要掷色子次数的期望。 分析:推公式题,设 dp[ i ] 为当前已经连续掷出 i 个相同 / 两两不相同的点数的情况下,完成游戏需要掷色子次数的期望。 ①:相同 dp[ 0 ] = 1 + dp[ 1 ]; dp[ 1] = 1 + 1/m * dp[ 2 ] + (m-1)/...

Joker & Liar的博客 480

stata:stata软件教程(人大十八讲)(1) 第一章 stata入门

第一章 stata入门1.1 安装1.2 启用和退出1.3 打开和查看数据1.4 寻求帮助与网络资源1.5 命令示例1.6 几个环境设置1.7 复习与练习1.8 附录 注:教材为:Stata 统计分析教程 stata软件教程(人大十八讲) 中国人民大学出版社 陈传波 1.1 安装 1.2 启用和退出 1.3 打开和查看数据 1.4 寻求帮助与网络资源 1.5 命令示例 1.6 几个环境设置 1.7 复习与练习 1.8 附录 ...

qq_47805483的博客 1万+

车载测试工程师必备:5分钟搞定CANoe台架搭建(附DBC导入技巧)

本文为车载测试工程师提供快速搭建CANoe测试台架的实用指南,涵盖硬件连接、DBC文件导入及常见报错解决方案。通过详细步骤和高效技巧,帮助工程师在5分钟内完成台架搭建,提升车载测试效率,特别适合紧急功能验证场景。

potato的博客 813

hdu 4652(概率dp)

/*     hdu 4652     题目大意是     有一个m个面的骰子     然后根据输入求     连续出现n个相同面     以及n个不同面的期望     以往的概率dp都是考虑     dp[i]由什么组成,然后列出递推方程     而这题考虑,dp[i]会变化成什么     1.连续出现n个相同面的期望     设dp[n]表示已经掷出n个相

a892573486的博客 347

ZYNQ GP总线实现PS与PL交互

3,完成 ZYNQ7 Processing System 的配置更改后,回到 Diagram 界面中,可以看到新出现了名为 M_AXI_GP0_ACLK、M_AXI_GP0 和 FCLK_CLK0 的接口,下面我们要对这些接口进行连接或引出。此处的偏移量,AXI的相邻寄存器偏移量相差4个字节,默认slv_reg0的偏移量是0,可以推导出slv_reg1,slv_reg2的偏移量分别为4和8,这里只用到了slv_reg0,所以偏移量为0。当然了,窗口数量的增加,势必会使得单个窗口的采样深度变小。

wangjie36的博客 7094

HDU4652Dice(概率DP)

HDU4652Dice(概率DP)2013 Multi-University Training Contest 5

追梦赤子心 1682

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

hdu 4652(概率dp)

题目链接:点击打开链接; 题意:给定一个m个面的骰子然后给定两种询问,0 m n,表示求丢多少次使得最后丢的n次都相同的期望,1 m n表示求最后丢的n次两两不相同的期望。; 题目分析: 我们设dp[i]为当前为i个连续的数还需投掷次数的期望搭dp[0]就是解 在相同的情况: dp[i] 记录的是已经连续i个相同,到n个不同需要的次数的数学期望 dp[0]= 1+dp[1] dp[1

北门的智慧 518

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

hdu 4652 Dice(期望)

http://acm.hdu.edu.cn/showproblem.php?pid=4652 掷一枚骰子,有m个面,问掷出连续出现n个相同的面以及连续出现n个两两不同的面的期望。 设dp[i]表示已经掷出i个相同/不同的面的期望,可以确定终态dp[n] = 0, 对于出现连续n个相同的面有 dp[i] = 1/m * dp[i+1] + (m-1)/m*dp[1] + 1 再列一

1388

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

hdu 4652 经典概率题+公式推导

#include #include #include #include #include #include #include using namespace std; typedef complex dcomp; dcomp s[1000040]; int main () { int T;scanf("%d",&T); while(T--) {

Jackyguo1992的专栏 1221

期望的逆推 及 HDU 4652 Dice

Problem HDU Solution 鉴于Rayment的期望dp实在是太差了,他只好写一些套路的水题了…… 什么叫期望的逆推呢。。? 那就是对于现在的状态S,我们去考虑它的所有后继状态T1,T2⋯TmT1,T2⋯Tm{T_1,T_2\cdots T_m},且各个后继发生的概率是p1,p2⋯pmp1,p2⋯pmp_1,p_2\cdots p_m和它们分别的转移代价c1,c2⋯cmc1...

Rayment的博客 755

hdu4652 概率DP

比赛的时候题目都看不懂,感觉被虐残了!今天搞了一下午加一晚上终于把它搞定了,概率这东西不是一般人能玩的啊! ACcode: #include #include #include const int NS=1000010; int n,m,op; double ans; double det[NS]; int main() { for (int T;~scanf("%d",&

丿Smilē 丶晨星灬 939

HDU 4652 Dice(概率dp)

Problem Description You have a dice with m faces, each face contains a distinct number. We assume when we tossing the dice, each face will occur randomly and uniformly. Now you have T query to answer

左眼皮跳跳 834

【hdu4652】Dice 期望dp 推公式

Dice 题目描述 题目传送门 一个骰子有 mmm 面,现在要求掷出如下情形的期望次数: 连续 nnn 次结果都相同 连续 nnn 次结果都不同 数据范围: n≤m≤106n \le m \le 10^6n≤m≤106 题解 没啥好说的= =就推推公式 问题1 f(0)=1+f(1)f(i)=1+1mf(i+1)+m−1mf(1)=1m+1mf(i+1)+(1−1m)f(0)(i=0,1,.....

function2的博客 309

HDU 4652 Dice (概率DP)

Dice Problem Description You have a dice with m faces, each face contains a distinct number. We assume when we tossing the dice, each face will occur randomly and uniformly. Now you ha...

weixin_30593443的博客 190

hdu4652_Dice_概率DP

题目大意给以m个面的色子,求:0.多次抛掷中最后n次点数相同的抛掷次数的期望1.多次抛掷中最后n次点数各不相同的抛掷次数的期望思路0.概率DP的倒推求法,设dp[i]为最后i次点数相同直到最后n次点数相同还需要抛掷的次数的期望dp[i] = 1 / m * dp[i + 1] + (1 - 1 / m) * dp[1] + 1边界:dp[n] = 0可用等比数列求和公式求通项1.设dp[i]为最后...

Sangria's Blog 306

【HDU4652】Dice(数学期望,动态规划)

题面Vjudge 有一个mm面骰子 询问,连续出现nn个相同的时候停止的期望 连续出现nn个不同的时候停止的期望题解考虑两种分开询问来算。第一种: 设f[i]f[i]表示已经有连续的ii个相同时,到达目标状态的期望。 f[i]=1mf[i+1]+m−1mf[1]+1f[i]=\frac{1}{m}f[i+1]+\frac{m-1}{m}f[1]+1 相邻两项作差,得到 m(f[i+1]

小蒟蒻yyb的博客 1055

HDU4652:Dice

题面 传送门 题意 mmm面的骰子 求连续出现nnn个相同面的期望次数 或者 求连续出现nnn个不同面的期望次数 Sol 设f[i]f[i]f[i]表示已经出现了iii~nnn这些面相同的期望次数 g[i]g[i]g[i]指iii~nnn这些面不同的期望次数 那么显然有 f[i]=1mf[i+1]+m−1mf[1]+1f[i]=1mf[i+1]+m−1mf[1]+1f[i]=...

Cyhlnj 387

Two Matchings(有趣的一道简单dp)

文章目录[E.Two Matchings ](https://ac.nowcoder.com/acm/contest/5668/E)这里直接放一位大佬的题解吧本题所得代码 E.Two Matchings 这里直接放一位大佬的题解吧 本题所得 当一个数列在计算的时候,出现了多种状态的时候,不能只顾头尾不管中间,这时候需要用的dp去慢慢的选择每一步中最优的状态! 代码 #include<bits/stdc++.h> using namespace std; typedef long long ll

qq_43750980的博客 244
上一篇: STM32与TDA7468实现高性价比音频处理方案
下一篇: AI技术驱动新零售转型:智能选址、巡店与精准营销实战
dingdi3021
博客等级 码龄11年 1粉丝 230原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值