文章目录

  • 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多通道采集电压相关推荐

  1. STM32 ADC多通道采集

    ADC多通道采集(阻塞模式.ADC_DMA模式) ADC多通道采集(阻塞模式) ADC多通道采集(DMA模式) ADC多通道采集(阻塞模式) 1.时钟源配置 2.配置RCC时钟(选择第三个选项 Cry ...

  2. STM32 ADC输入采集电压

    #include "stm32f10x.h" // Device header #include "stdio.h" #include "delay. ...

  3. stm32cubeide 多通道adc_STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项

    keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发, L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库). 0.起初,可以参考官 ...

  4. dma和通道的区别_STM32 定时器触发 ADC 多通道采集,DMA搬运至内存

    引言 ADC 的功能是将模拟信号采样得到数字信号,而有些时候,我们需要使用到定时采样,比如在计算一个采集的波形的频率的时候,我们需要精确的知道采样频率,也就是 1 s 内采集的点数,这个时候,就需要使 ...

  5. 记录基于MXCube,使用STM32F103RCT6 ADC多通道采集 的学习经验

    记录基于MXCube,使用STM32F103RCT6 ADC多通道采集 推荐保存一下参考博客(https://www.cnblogs.com/xingboy/p/10212308.html) ADC转 ...

  6. STM32f103的数电采集电路的ADC多通道采集程序

    STM32拥有1~3个ADC(STM32F101/102 系列只有1个ADC),这些ADC可以独立使用,也可以使用双重模式(提高采样率).STM32 的ADC是12位逐次逼近型的模拟数字转换器.它有1 ...

  7. STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项

    keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发, L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库). 0.起初,可以参考官 ...

  8. STM32 ADC多通道规则采样和注入采样

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 什么是ADC? STM ...

  9. STM32+LTC6804/LTC6811采集电压温度电流/BMS储能采集板

    有LTC6804.LTC6811版本,可选SPI\菊花链通信) BMS闲置开发板 凌力尔特LTC6804/6811开发板BMS电池管理评估板,采集板,BMS开发板 12串送源码+BOM+原理图+源码解 ...

  10. STM32F030 使用CUBEMX配置ADC多通道采集 DMA传输

    STM32CubeMX的配置 以下为测试代码 //usart重定向,注意使用前需要包含头文件<stdio.h> int fputc(int ch, FILE *f) {HAL_UART_T ...

最新文章

  1. Access应用日志一
  2. Nat.Commun.|使用基于注意力机制的多标签神经网络预测并解释12种RNA修饰
  3. VC++ _T()宏学习
  4. iftop 监控linux服务器网卡流量
  5. java运行字符串代码
  6. div固定在浏览器顶部_关于浏览器的兼容问题
  7. 前端开发css禁止选中文本
  8. 【Filebeat】windows下安装filebeat
  9. SpringBoot-@ConfigurationProperties注解
  10. 海量图片去重算法-局部分块Hash算法
  11. 入门级XML学习(三)
  12. 抖音python上的代码_抖音代码舞python实例代码
  13. CCS+C6678LE开发记录14:多核协作之OMP与IPC方式的较量
  14. java过滤空号了停机号_手机号码空号检测
  15. 视频教程-人工智能-必备数学基础视频教程-机器学习
  16. Oracle 12c 中修改PDB数据库的日志归档模式
  17. c语言辗转求最小公倍数,c语言:辗转相除法求最大公约数、最小公倍数
  18. 王者荣耀8月6日服务器维护,8月6日体验服停机更新公告
  19. 消失的梯度问题(vanishing gradient problem)
  20. 不会吧不会吧,不会真有人还不会算时间复杂度吧?用十分钟让你明白如何计算时间复杂度

热门文章

  1. Proteus与emu8086实现流水灯联调
  2. IDEA 2018.2.5最新版破解到2100年图解教程
  3. VsCode下载,使用国内镜像秒下载
  4. 等价类划分法测试用例
  5. 表妹教你进程调度算法
  6. iOS 将PCM格式转换为WAV格式 播放wav音频或者直接播放pcm文件
  7. Git命令行和Puttygen生成公钥私钥的方法和区别
  8. ElasticSearch6.0.1 拼音搜索,并且高亮显示结果 —6.X版本
  9. 简单实用的易语言短信接口demo
  10. uniapp 微信小程序生成二维码