STM32—ADC多通道采集电压
文章目录
- ADC详解
- 程序说明
- 函数主体
- 引脚配置
- ADC和DMA配置
- 主函数
ADC详解
前面的博客中详细介绍了STM32中ADC的相关信息,这篇博客是对ADC内容的一个总结提升,ADC的详细介绍:ADC详解
程序说明
为了使这次代码阅读方便,博主没有在头文件中宏定义变量,都是直接采样库函数中的规定形参。此次采用多通道采集电压,使用ADC1的通道10、11、12、13、14、15一共六个通道,采用DMA将转换结果传输至内存。
函数主体
引脚配置
引脚配置的时候,将所有引脚一次性配置好,过于简单,不作详细说明。
void ADC_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN ;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;GPIO_Init(GPIOC , &GPIO_InitStruct);
}
ADC和DMA配置
此函数中主要配置了ADC的相关信息和DMA的信息。
uint16_t result[6]={0,0,0,0,0,0};void ADC_DMA_COnfig(void)
{ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/* 复位DMA1的通道1 */DMA_DeInit(DMA1_Channel1);// 配置 DMA 初始化结构体// 外设基址为:ADC 数据寄存器地址DMA_InitStructure.DMA_PeripheralBaseAddr = ( u32 ) ( ADC1_BASE+0x4c);// 存储器地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)result;// 数据源来自外设DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;// 缓冲区大小,应该等于数据目的地的大小DMA_InitStructure.DMA_BufferSize = 6;// 外设寄存器只有一个,地址不用递增DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;// 存储器地址递增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 外设数据大小为半字,即两个字节DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;// 内存数据大小也为半字,跟外设数据大小相同DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;// 循环传输模式DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响DMA_InitStructure.DMA_Priority = DMA_Priority_High;// 禁止存储器到存储器模式,因为是从外设到存储器DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;// 初始化DMADMA_Init(DMA1_Channel1, &DMA_InitStructure);// 使能 DMA 通道DMA_Cmd(DMA1_Channel1 , ENABLE);// ADC 模式配置// 只使用一个ADC,属于单模式ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;// 扫描模式ADC_InitStructure.ADC_ScanConvMode = ENABLE ; // 连续转换模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;// 不用外部触发转换,软件开启即可ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;// 转换结果右对齐ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;// 转换通道个数ADC_InitStructure.ADC_NbrOfChannel = 6; // 初始化ADCADC_Init(ADC1, &ADC_InitStructure);// 配置ADC时钟为PCLK2的8分频,即9MHzRCC_ADCCLKConfig(RCC_PCLK2_Div8); // 配置ADC 通道的转换顺序和采样时间ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 5, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 6, ADC_SampleTime_55Cycles5);// 使能ADC DMA 请求ADC_DMACmd(ADC1, ENABLE);// 开启ADC ,并开始转换ADC_Cmd(ADC1, ENABLE);// 初始化ADC 校准寄存器 ADC_ResetCalibration(ADC1);// 等待校准寄存器初始化完成while(ADC_GetResetCalibrationStatus(ADC1));// ADC开始校准ADC_StartCalibration(ADC1);// 等待校准完成while(ADC_GetCalibrationStatus(ADC1));// 由于没有采用外部触发,所以使用软件触发ADC转换 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
函数开头定义了ADC和DMA的结构体变量,并且打开了俩个外设的时钟(DMA挂载在AHB总线上)。DMA模块可以参考之前写的博客:DMA
这次DMA传输是从外设到内存,直接从ADC的数据寄存器中取数据,然后传输到全局数组变量result中。剩下的都在函数中作了详细注解。
主函数
#include "stm32f10x.h"
#include "usart.h"
#include "adc.h"extern uint16_t result[6];
float voltage[6];void delay(void)
{uint32_t k=0xffffff;while(k--);
}int main(void)
{uint8_t n;/* 配置串口 */DEBUG_USART_Config();/* 有关ADC的函数打包 */ADCx_Init();while(1){for(n=0;n<6;n++){/* 转换为实际电压 */voltage[n]=(float) result[n]/4096*3.3;printf("\n通道%d的值为:%fV\n",n,voltage[n]);}delay();}
}
主函数中也有相应注解。
STM32—ADC多通道采集电压相关推荐
- STM32 ADC多通道采集
ADC多通道采集(阻塞模式.ADC_DMA模式) ADC多通道采集(阻塞模式) ADC多通道采集(DMA模式) ADC多通道采集(阻塞模式) 1.时钟源配置 2.配置RCC时钟(选择第三个选项 Cry ...
- STM32 ADC输入采集电压
#include "stm32f10x.h" // Device header #include "stdio.h" #include "delay. ...
- stm32cubeide 多通道adc_STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项
keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发, L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库). 0.起初,可以参考官 ...
- dma和通道的区别_STM32 定时器触发 ADC 多通道采集,DMA搬运至内存
引言 ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使 ...
- 记录基于MXCube,使用STM32F103RCT6 ADC多通道采集 的学习经验
记录基于MXCube,使用STM32F103RCT6 ADC多通道采集 推荐保存一下参考博客(https://www.cnblogs.com/xingboy/p/10212308.html) ADC转 ...
- STM32f103的数电采集电路的ADC多通道采集程序
STM32拥有1~3个ADC(STM32F101/102 系列只有1个ADC),这些ADC可以独立使用,也可以使用双重模式(提高采样率).STM32 的ADC是12位逐次逼近型的模拟数字转换器.它有1 ...
- STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项
keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发, L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库). 0.起初,可以参考官 ...
- STM32 ADC多通道规则采样和注入采样
layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 什么是ADC? STM ...
- STM32+LTC6804/LTC6811采集电压温度电流/BMS储能采集板
有LTC6804.LTC6811版本,可选SPI\菊花链通信) BMS闲置开发板 凌力尔特LTC6804/6811开发板BMS电池管理评估板,采集板,BMS开发板 12串送源码+BOM+原理图+源码解 ...
- STM32F030 使用CUBEMX配置ADC多通道采集 DMA传输
STM32CubeMX的配置 以下为测试代码 //usart重定向,注意使用前需要包含头文件<stdio.h> int fputc(int ch, FILE *f) {HAL_UART_T ...
最新文章
- Access应用日志一
- Nat.Commun.|使用基于注意力机制的多标签神经网络预测并解释12种RNA修饰
- VC++ _T()宏学习
- iftop 监控linux服务器网卡流量
- java运行字符串代码
- div固定在浏览器顶部_关于浏览器的兼容问题
- 前端开发css禁止选中文本
- 【Filebeat】windows下安装filebeat
- SpringBoot-@ConfigurationProperties注解
- 海量图片去重算法-局部分块Hash算法
- 入门级XML学习(三)
- 抖音python上的代码_抖音代码舞python实例代码
- CCS+C6678LE开发记录14:多核协作之OMP与IPC方式的较量
- java过滤空号了停机号_手机号码空号检测
- 视频教程-人工智能-必备数学基础视频教程-机器学习
- Oracle 12c 中修改PDB数据库的日志归档模式
- c语言辗转求最小公倍数,c语言:辗转相除法求最大公约数、最小公倍数
- 王者荣耀8月6日服务器维护,8月6日体验服停机更新公告
- 消失的梯度问题(vanishing gradient problem)
- 不会吧不会吧,不会真有人还不会算时间复杂度吧?用十分钟让你明白如何计算时间复杂度