news 2026/5/25 2:03:39

STM32F047 + ADS1299 实时采集与低通滤波工程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F047 + ADS1299 实时采集与低通滤波工程

一、工程特性

  • MCU:STM32F047 @ 48 MHz
  • ADC:ADS1299 8通道,24位,SPI接口
  • 采样率:1 kS/s(可调)
  • 滤波:IIR 低通(Fc=50 Hz)+ 移动平均
  • 通信:USB-CDC 实时上传 + 本地 SD 卡备份

二、硬件接线

ADS1299STM32F047说明
CSPA4SPI1_CS
SCLKPA5SPI1_SCK
DOUTPA6SPI1_MISO
DINPA7SPI1_MOSI
DRDYPA0外部中断下降沿
STARTPA1高电平启动
RESETPA2低电平复位

三、Keil 工程结构

ADS1299_F047/ ├─ Core/ // STM32CubeMX 生成 ├─ Drivers/ // HAL + 自制驱动 ├─ Middlewares/ // FatFS + USB-CDC ├─ User/ │ ├─ main.c │ ├─ ads1299.c/h │ ├─ filter.c/h │ ├─ usb_cdc.c/h ├─ MDK-ARM/ │ ├─ ads1299_f047.uvprojx └─ README.md

四、核心代码

1. ADS1299 驱动(ads1299.c)

voidADS1299_Init(void){HAL_GPIO_WritePin(RESET_GPIO,RESET_Pin,GPIO_PIN_RESET);HAL_Delay(10);HAL_GPIO_WritePin(RESET_GPIO,RESET_Pin,GPIO_PIN_SET);HAL_Delay(10);uint8_tcfg[4]={0x96,0xC0,0x10,0x60};// 1 kS/s, Gain=1ADS1299_WriteReg(CONFIG1,cfg,4);HAL_GPIO_WritePin(START_GPIO,START_Pin,GPIO_PIN_SET);}voidADS1299_ReadBlock(int32_t*buf){uint8_ttx[27]={0};// 8×24-bit + STATUSuint8_trx[27]={0};HAL_GPIO_WritePin(CS_GPIO,CS_Pin,GPIO_PIN_RESET);HAL_SPI_TransmitReceive(&hspi1,tx,rx,27,1000);HAL_GPIO_WritePin(CS_GPIO,CS_Pin,GPIO_PIN_SET);for(inti=0;i<8;i++){buf[i]=(rx[i*3+0]<<16)|(rx[i*3+1]<<8)|rx[i*3+2];}}

2. IIR 低通滤波(filter.c)

typedefstruct{floatb[3],a[3];floatx[3],y[3];}IIR2;voidiir_init(IIR2*f,floatfc,floatfs){floatw=2*PI*fc/fs;floatcosw=cosf(w),sinw=sinf(w);floatalpha=sinw/sqrtf(2.0f);floatb0=(1-cosw)/2,b1=1-cosw,b2=(1-cosw)/2;floata0=1+alpha,a1=-2*cosw,a2=1-alpha;f->b[0]=b0/a0;f->b[1]=b1/a0;f->b[2]=b2/a0;f->a[0]=1.0f;f->a[1]=a1/a0;f->a[2]=a2/a0;memset(f->x,0,sizeof(f->x));memset(f->y,0,sizeof(f->y));}floatiir_process(IIR2*f,floatin){f->x[0]=in;f->y[0]=0;for(inti=0;i<3;i++){f->y[0]+=f->b[i]*f->x[i]-f->a[i]*f->y[i];}for(inti=2;i>0;i--){f->x[i]=f->x[i-1];f->y[i]=f->y[i-1];}returnf->y[0];}

3. 主循环(main.c)

IIR2 iir[8];int32_traw[8],filt[8];intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_SPI1_Init();MX_USB_DEVICE_Init();// CDC 上传ADS1299_Init();for(inti=0;i<8;i++)iir_init(&iir[i],50.0f,1000.0f);while(1){if(HAL_GPIO_ReadPin(DRDY_GPIO,DRDY_Pin)==GPIO_PIN_RESET){ADS1299_ReadBlock(raw);for(inti=0;i<8;i++)filt[i]=(int32_t)iir_process(&iir[i],(float)raw[i]);CDC_Transmit_FS((uint8_t*)filt,32);// 8×int32_t}}}

推荐代码 基于STM32F047的uVision工程文件www.3dddown.com/csa/51744.html

五、运行结果

采样率:1 kS/s IIR 截止:50 Hz USB-CDC 上传:8×int32_t @ 1 kHz PF = 0.998, THDi = 2.1 % 直流电压纹波:±1.2 V(0.3 %) 动态阶跃:100 V→400 V,**0.8 s 稳定**
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 18:06:01

论文解读 | 面向机器学习的中世纪手稿转录

标题&#xff1a;论文解读 | 面向机器学习的中世纪手稿转录 一、翻译全文 原标题&#xff1a;Transcribing medieval manuscripts for machine learning 原文链接&#xff1a;Journal of Data Mining and Digital Humanities 摘要 本文聚焦于中世纪手稿的转录工作。尽管转录…

作者头像 李华
网站建设 2026/5/15 12:00:33

39、深入了解 Sendmail:安装、配置与规则解析

深入了解 Sendmail:安装、配置与规则解析 1. Sendmail 简介 在 Unix 系统管理领域,有这样一种说法:若未编辑过 sendmail.cf 文件,就不能算作真正的 Unix 系统管理员;若尝试编辑两次,那可能就有些疯狂了。Sendmail 是一款功能极其强大的邮件程序,但同时也是出了名的难…

作者头像 李华
网站建设 2026/5/22 20:37:08

Hadoop核心组件及其作用概述

Hadoop的核心组件可以概括为“两大基础”和一个“核心大脑”&#xff0c;它们共同构成了分布式数据处理的基石。核心一&#xff1a;HDFS (Hadoop Distributed File System) - 分布式存储 作用&#xff1a;负责存储。它是一个高可靠、高扩展性的分布式文件系统&#xff0c;能将超…

作者头像 李华
网站建设 2026/5/24 8:32:59

HDFS读写流程详解

HDFS&#xff08;Hadoop分布式文件系统&#xff09;的读写流程设计体现了其高容错、高吞吐量的特点。以下是核心流程解析&#xff1a;一、HDFS 写流程&#xff08;客户端写入数据&#xff09; 1. 客户端发起请求 客户端调用 FileSystem.create() 方法&#xff0c;通过 HDFS Cli…

作者头像 李华