【实验室乱记】基于 STM32 的采集 Adc 与 SD 卡储存
杂
- 序
- 实验室
- 简介
- 调用的资源:Adc
- 调用的外设:SD卡
- 实现过程
- Adc
- SD 卡
- 主函数代码
序
这篇文章向大家介绍下基于 STM32F4 的 Adc 采集与 SD 卡储存
实验室
学长的要求是利用 STM32 采集 Adc 值转存于 SD 中 后利用 Matlab 进行快速傅里叶变化分析频率(FFT 天下第一 )
简介
ST(意法半导体)推出了以基于 ARM® Cortex™-M4为内核的 STM32F4 系列高性能微控制器,其采用了90 纳米的NVM 工艺和 ART(据说以后可以操作学长的 28 nm工具FPGA )。
/这里用的是某点原子
调用的资源:Adc
模拟数字转换器即A/D转换器,简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。
调用的外设:SD卡
SD 卡相对于 u 盘、flash 来说是比较适合于单片机系统的大容量存储设备,容量选择尺度大(几十 M 到几十 G ) 、更换简单、移动方便,是单片机大容量外部存储器的首选。
实现过程
Adc
ADC 的通道与引脚的对应关系在 STM32F4 的数据手册可以查到,这里使用 ADC1 的通道 5
首先初始化 IO 设置为模拟输入
__HAL_RCC_ADC1_CLK_ENABLE(); //使能 ADC1 时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启 GPIOA 时钟
GPIO_Initure.Pin=GPIO_PIN_5; //PA5
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟
GPIO_Initure.Pull=GPIO_NOPULL; //不带上下拉
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //
初始化 ADC 设置 ADC 分频系数、分辨率、模式、扫描方式、对齐方式等信息
在 HAL 库中,初始化 ADC 是通过函数 HAL_ADC_Init 来实现的,该函数声明为:
HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc);
入口参数 hadc 为 ADC_HandleTypeDef 结构体指针类型,结构体定义为:
//结构体 ADC_HandleTypeDef
typedef struct
{ADC_TypeDef *Instance; //ADC1/ ADC2/ ADC3ADC_InitTypeDef Init; //初始化结构体变量__IO uint32_t NbrOfCurrentConversionRank; //当前转换序列DMA_HandleTypeDef *DMA_Handle; //DMA 方式使用HAL_LockTypeDef Lock;__IO HAL_ADC_StateTypeDef State;__IO uint32_t ErrorCode;
}ADC_HandleTypeDef;
//结构体 ADC_InitTypeDef
typedef struct
{uint32_t ClockPrescaler; //分频系数 2/4/6/8 分频 ADC_CLOCK_SYNC_PCLK_DIV4uint32_t Resolution; //分辨率 12/10/8/6 位:ADC_RESOLUTION_12Buint32_t DataAlign; //对齐方式:左对齐还是右对齐:ADC_DATAALIGN_RIGHTuint32_t ScanConvMode; //扫描模式 DISABLEuint32_t EOCSelection; //EOC 标志是否设置 DISABLEuint32_t ContinuousConvMode; //开启连续转换模式或者单次转换模式 DISABLEuint32_t DMAContinuousRequests;//开启 DMA 请求连续模式或者单独模式 DISABLEuint32_t NbrOfConversion; //规则序列中有多少个转换 1uint32_t DiscontinuousConvMode;//不连续采样模式 DISABLEuint32_t NbrOfDiscConversion; //不连续采样通道数 0uint32_t ExternalTrigConv; //外部触发方式 ADC_SOFTWARE_STARTuint32_t ExternalTrigConvEdge; //外部触发边沿
}ADC_InitTypeDef;
在设置完了以上信息后,就可以开启 AD 转换器了(通过 ADC_CR2 寄存器控制)
HAL_ADC_Start(&ADC1_Handler); //开启 ADC
配置通道,读取通道 ADC 值
在完成上面的步骤后,ADC 已经准备好。接下来设置规则序列 1 的通道,然后启动 ADC 转换。在转换结束后,读取转换结果值。
设置规则序列通道以及采样周期的函数是:
HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc,ADC_ChannelConfTypeDef* sConfig);
第一个参数就不用多说了,第二个入口参数 sConfig,它
是 ADC_ChannelConfTypeDef 结构体指针类型,结构体定义如下:
typedef struct {uint32_t Channel; //ADC 通道
uint32_t Rank; //规则通道中的第几个转换
uint32_t SamplingTime; //采样时间
uint32_t Offset; //备用,暂未用到
}ADC_ChannelConfTypeDef;
//实例
ADC1_ChanConf.Channel= ADC_CHANNEL_5; //通道 5
ADC1_ChanConf.Rank=1; //第 1 个序列,序列 1
ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES; //采样时间
ADC1_ChanConf.Offset=0;
HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); //通道配置
配置好通道并且使能 ADC 后,接下来就是读取 ADC 值。采取的是查询方式读取(最近期末时间紧迫 下次尝试 DMA ), 所以还要等待上一次转换结束。此过程 HAL 库提供了专用函数 HAL_ADC_PollForConversion,函数定义为:
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
等待上一次转换结束之后,接下来就是读取 ADC 值,函数为:
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);
SD 卡
通过今天的学习主要了解 SD 卡与文件系统 FATFS 的使用,具体实现原理可参考以下博客讲解
https://blog.csdn.net/vca821/article/details/80738151?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1
https://blog.csdn.net/nulidehahafr/article/details/84146148
hal 库 SD 卡支持源文件 stm32f4xx_hal_sd.c 和 stm32f4xx_II_sdmmc.h 以及对应头文件 stm32f4xx_hal_sd.h 和 stm32f4xx_II_sdmmc.h
而要想真正应用SD卡就必须使用文件系统管理,使用 FATFS 来管理 SD 卡实现 SD 卡文件的读写等。
FatFs 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现 FAT 文件系统。 FatFs 组件的编写遵循 ANSI C(C89),完全分离于磁盘 I/O 层,因此不依赖于硬件平台。它可以嵌入到资源有限的微控制器中,如 8051, PIC, AVR, ARM, Z80, RX等等,不需要做任何修改。
FATFS 是一个完全免费开源的 FAT 文件系统模块它完全用标准 C 语言编写,所以具有良好的硬件平台独立性。
FATFS 的源码可在http://elm-chan.org/fsw/ff/00index_e.html下载。
应用层的函数 f_open f_read f_write f_close 等,可以像在 PC 上读/写文件那样简单。(具体函数应用参考主函数代码)
主函数代码
核心代码如下
f_opendir((u8 *)"0:/"); //打开目录
delay_ms(5); //延迟 5ms(开心就好
f_open((u8 *)"xdpnb.txt",2); //打开目录下文件(模式2 r+) (Xdp牛逼
for(t = 0; t < 2048; t++){ //采样2048次adcx=Get_Adc_Average(ADC_CHANNEL_5,1); //获取Adc通道5的转换值 1次取平均rui[t] = adcx; //存于Rui数组
}for(t = 0; t < 2048; t++){ //为了保证采样质量 区分采集与转存过程myitoa(rui[t],tem,10); //调用自定义数字转字符函数 存于临时数组f_write((u8 *)tem,0X4); //向SD卡写入数组 长度4f_write((u8 *)"\r\n",0X2); //换行符(用于Matlab解析
}
f_close(); //关闭文件!
//整形转字符 32不支持标准的itoa 这里自己实现
/*** @brief 整数转换到字符串** @param value 整数数值* @param string 接收字符串的指针* @param radix 目标进制* * @return 字符串指针* * @property 仅支持10进制,100000-1数值以下的转换*/
char *myitoa(int value, char *string, int radix)
{int i, d;int flag = 0;char *ptr = string;/* This implementation only works for decimal numbers. */if (radix != 10){*ptr = 0;return string;}if (!value){*ptr++ = 0x30;*ptr = 0;return string;}/* if this is a negative value insert the minus sign. */if (value < 0){*ptr++ = '-';/* Make the value positive. */value *= -1;}for (i = 10000; i > 0; i /= 10){d = value / i;if (d || flag){*ptr++ = (char)(d + 0x30);value -= (d * i);flag = 1;}}/* Null terminate the string. */*ptr = 0;return string;
(Ps:打开文件后一定要 close close close)
模拟采集的 adc 数值为实验室信号源所产生的正弦波
具体项目、实验现象与原理移步学长博客
TerayTech
离线式数字信号处理(一)—— 使用 Matlab 读取TXT文件并做FFT分析
离线式数字信号处理(二)——使用 Matlab 对 STM32F4 ADC 采集到的数据进行分析
(即将接手学长的 28nm) Xilinx ZYNQ 学习笔记(一)——使用PS读写SD卡
【实验室乱记】基于 STM32 的采集 Adc 与 SD 卡储存相关推荐
- 基于stm32温湿度采集平台开发
基于stm32温湿度采集平台开发 ==这里记录一下自己以前课设报告,但是论文中图片和文字.公式太多了,懒得粘贴了,需要完整的私信== 摘 要 关键词 第一章 绪论 1.1 研究背景 1.1.1国内研究 ...
- 基于stm32单片机RFID门禁刷卡/指纹识别系统
基于stm32单片机RFID门禁刷卡/指纹识别系统 采用两种模式 1:通过rfid卡识别,读取卡号 2:通过指纹识别模块进行录入,对比 标价为资料设计编号,需要实物可问我 资料包含 原理图,程序,元器 ...
- STM32利用FATFS文件系统给SD卡读写数据
STM32利用FATFS文件系统给SD卡读写数据 注:FATFS文件系统官方网址(内含各种函数具体功能及参数配置): FATFS文件系统官方网址 1. 所需.c和.h文件 FATFS中的文件的作用如下 ...
- STM32使用SPI方式读写SD 卡
掌握SD卡协议原理,用STM32F103 完成对SD卡的数据读取(FAT文件模式). 文章目录 一.前言 1.SD卡 2.FATFS 二.工程分析 1.代码分析 2.连线 3.编译工程并烧录 4.验证 ...
- 基于STM32单片机采集数据数据上云
前言 以往采集数据均是采用Arduino开发板.esp32wifi模块等,本次实验采用的是STM32单片机,STM32系列基于专为要求高性能.低成本.低功耗的嵌入式应用专门设计的ARM Cortex- ...
- 基于stm32的DHT11温湿度采集LCD显示Proteus仿真
*本设计:* 基于stm32温湿度采集Proteus仿真(仿真+程序) 仿真图protues 8.9 程序编译器:keil 5 编程语言:C语言 *设计编号:C0041* *功能描述:* 通过STM3 ...
- 基于STM32的多路电压测量设计方案
基于STM32的多路电压测量设计方案 本设计提出一种基于STM32芯片的多路电压测量设计方案,测量 范围在0-10V之间.把STM32内置A/D对多路电压值进行采样,得到相应的数字量.然后按照数字量和 ...
- 【STM32调试(三)】采集bmp图像保存在SD卡
将图像保存在SD卡 一.思路 二.移植文件系统 三.保存图片 四.实验结果 一.思路 这里保存的是BMP图像,需要先连接bmp图像的数据格式.在STM32上采集的数据格式是RGB565方便在LCD上显 ...
- 基于Stm32的MP3播放器设计与实现
原创博文,转载请注明出处 这是我高级电子技术试验课做的作业,拿来共享一下.项目在安福莱例程基础之上进行的功能完善,里面的部分内容可参考安福莱mp3例程.当然用的板子也是安福莱的板子,因为算起来总共做了 ...
最新文章
- aFleX脚本常见错误
- 一起谈.NET技术,.Net Discovery系列之-深入理解平台机制与性能影响 (中)
- 68页PPT,读懂中、美、德三国智能制造战略!
- Android 编译系统模块 3
- GPU:nvidia-smi的简介、安装、使用方法之详细攻略
- 2018-2019年度总结
- 用户注册的mysql代码_用户的注册登陆流程及代码实现
- P3507-[POI2010]GRA-The Minima Game【dp,博弈论】
- 归并排序 自带时间复杂度测试
- Node.js的基本使用3
- 基于RV1126平台imx291分析 --- 运行设备(VIDIOC_STREAMON)
- 实用软件工程(张海藩)复习笔记
- BCB 第三方组件/控件 ZZ
- 美团开源实时监控系统 CAT 3.0 发布:多语言客户端及多项性能提升
- 如何区分自己mac电脑的CUP型号
- python股票量化交易接口是应用到股票上吗?
- Hash Function 2021牛客暑期多校训练营1 数论 + NTT
- mapreduce软件框架中作业与任务的含义
- 使用Android自带的DownloadManager下载ApK并安装
- Appium 解决不能输入中文字符问题