• 实验室
  • 简介
    • 调用的资源: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.cstm32f4xx_II_sdmmc.h 以及对应头文件 stm32f4xx_hal_sd.hstm32f4xx_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 卡储存相关推荐

  1. 基于stm32温湿度采集平台开发

    基于stm32温湿度采集平台开发 ==这里记录一下自己以前课设报告,但是论文中图片和文字.公式太多了,懒得粘贴了,需要完整的私信== 摘 要 关键词 第一章 绪论 1.1 研究背景 1.1.1国内研究 ...

  2. 基于stm32单片机RFID门禁刷卡/指纹识别系统

    基于stm32单片机RFID门禁刷卡/指纹识别系统 采用两种模式 1:通过rfid卡识别,读取卡号 2:通过指纹识别模块进行录入,对比 标价为资料设计编号,需要实物可问我 资料包含 原理图,程序,元器 ...

  3. STM32利用FATFS文件系统给SD卡读写数据

    STM32利用FATFS文件系统给SD卡读写数据 注:FATFS文件系统官方网址(内含各种函数具体功能及参数配置): FATFS文件系统官方网址 1. 所需.c和.h文件 FATFS中的文件的作用如下 ...

  4. STM32使用SPI方式读写SD 卡

    掌握SD卡协议原理,用STM32F103 完成对SD卡的数据读取(FAT文件模式). 文章目录 一.前言 1.SD卡 2.FATFS 二.工程分析 1.代码分析 2.连线 3.编译工程并烧录 4.验证 ...

  5. 基于STM32单片机采集数据数据上云

    前言 以往采集数据均是采用Arduino开发板.esp32wifi模块等,本次实验采用的是STM32单片机,STM32系列基于专为要求高性能.低成本.低功耗的嵌入式应用专门设计的ARM Cortex- ...

  6. 基于stm32的DHT11温湿度采集LCD显示Proteus仿真

    *本设计:* 基于stm32温湿度采集Proteus仿真(仿真+程序) 仿真图protues 8.9 程序编译器:keil 5 编程语言:C语言 *设计编号:C0041* *功能描述:* 通过STM3 ...

  7. 基于STM32的多路电压测量设计方案

    基于STM32的多路电压测量设计方案 本设计提出一种基于STM32芯片的多路电压测量设计方案,测量 范围在0-10V之间.把STM32内置A/D对多路电压值进行采样,得到相应的数字量.然后按照数字量和 ...

  8. 【STM32调试(三)】采集bmp图像保存在SD卡

    将图像保存在SD卡 一.思路 二.移植文件系统 三.保存图片 四.实验结果 一.思路 这里保存的是BMP图像,需要先连接bmp图像的数据格式.在STM32上采集的数据格式是RGB565方便在LCD上显 ...

  9. 基于Stm32的MP3播放器设计与实现

    原创博文,转载请注明出处 这是我高级电子技术试验课做的作业,拿来共享一下.项目在安福莱例程基础之上进行的功能完善,里面的部分内容可参考安福莱mp3例程.当然用的板子也是安福莱的板子,因为算起来总共做了 ...

最新文章

  1. aFleX脚本常见错误
  2. 一起谈.NET技术,.Net Discovery系列之-深入理解平台机制与性能影响 (中)
  3. 68页PPT,读懂中、美、德三国智能制造战略!
  4. Android 编译系统模块 3
  5. GPU:nvidia-smi的简介、安装、使用方法之详细攻略
  6. 2018-2019年度总结
  7. 用户注册的mysql代码_用户的注册登陆流程及代码实现
  8. P3507-[POI2010]GRA-The Minima Game【dp,博弈论】
  9. 归并排序 自带时间复杂度测试
  10. Node.js的基本使用3
  11. 基于RV1126平台imx291分析 --- 运行设备(VIDIOC_STREAMON)
  12. 实用软件工程(张海藩)复习笔记
  13. BCB 第三方组件/控件 ZZ
  14. 美团开源实时监控系统 CAT 3.0 发布:多语言客户端及多项性能提升
  15. 如何区分自己mac电脑的CUP型号
  16. python股票量化交易接口是应用到股票上吗?
  17. Hash Function 2021牛客暑期多校训练营1 数论 + NTT
  18. mapreduce软件框架中作业与任务的含义
  19. 使用Android自带的DownloadManager下载ApK并安装
  20. Appium 解决不能输入中文字符问题

热门文章

  1. 微软azure waf简介
  2. 在NVIDIA JetBot Nano小车上更新WIFI驱动
  3. 灿芯股份冲刺科创板上市:计划募资6亿元,中芯国际、小米为股东
  4. 使用Docker快速搭建Hfish蜜罐
  5. 【活动】Bambook程序达人赛——Javaeye绿色通道最新通知
  6. 页面关闭时发起接口请求
  7. 中国剩余定理(c++)
  8. 为什么都喜欢用Python?Python/PHP/Java全面对比
  9. Miller_Rabbin算法判断大素数,Pollard_rho算法进行质因素分解
  10. SQL删除指定条件的重复数据,只保留一条