STM32F103_ADC-DMA通道采集
DMA简介
ADC简介
单通道采集
简介:ADC采集数据通过DMA通道发送到内存
.c文件
#include "adc.h"
uint16_t ADC_ConvertedValue; //ADC通道1或通道3数据16位
void GPIO_Config(void)
{ RCC_APB2PeriphClockCmd(ADC_GPIO_RCC, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = ADC_GPIO_PIN ;GPIO_InitStruct.GPIO_Mode = ADC_GPIO_MODE ;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(ADC_GPIO_PORT , &GPIO_InitStruct);
}void DMA_Config(void)
{RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel_x); DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) (&(ADC_x->DR)); // DMA 外设基地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; ; // 内存基地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为数据的来源DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不递增DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Disable ; //内存地址也不变DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度16位 ADC输出16位数据DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度16位 ADC输出16位数据DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel_x, &DMA_InitStructure); DMA_Cmd(DMA1_Channel_x,ENABLE); //使能MAS6}
void ADC_Config(void)
{GPIO_Config();DMA_Config();RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);ADC_DeInit(ADC_x); //初始化ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //工作在独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC_x, &ADC_InitStructure); RCC_ADCCLKConfig(RCC_PCLK2_Div8); //设置时钟ADC_RegularChannelConfig(ADC_x, ADC_Channel_12, 1, ADC_SampleTime_55Cycles5); //设置指定 ADC 的规则组通道ADC_DMACmd(ADC_x,ENABLE); //使能DMA __ADCADC_Cmd(ADC_x,ENABLE);ADC_ResetCalibration(ADC_x); // 初始化ADC 校准寄存器 while(ADC_GetResetCalibrationStatus(ADC_x)); // 等待校准寄存器初始化完成ADC_StartCalibration(ADC_x);while(ADC_GetCalibrationStatus(ADC_x));ADC_SoftwareStartConvCmd(ADC_x,ENABLE); //软件使能}
.h文件
#ifndef _ADC_H_
#define _ADC_H_#include "stm32f10x.h"#define ADC_GPIO_RCC RCC_APB2Periph_GPIOC
#define ADC_GPIO_PORT GPIOC
#define ADC_GPIO_PIN GPIO_Pin_2 //ADC通道12
#define ADC_GPIO_MODE GPIO_Mode_AIN //模拟输入#define DMA1_Channel_x DMA1_Channel1 //DMA1通道1 对应ADC1
#define ADC_x ADC1
void ADC_Config(void);
#endif
main .c
#include "main.h"
extern uint16_t ADC_ConvertedValue;
int main()
{float ADC_ConvertedValueLocal;Usart1_Init(115200);printf("测试开始\r\n");ADC_Config(); //ADC初始化
while(1)
{**加粗样式**
ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的AD值printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue); printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal); Delay_ms(1000);
}
}
多通道采集
简介:同时采集多个IO口的ADC模拟输出值。通过DMA发送到内存
.c文件
#include "adc.h"
uint16_t ADC_ConvertedValue[channel_number]; //ADC通道1或通道3数据16位
void GPIO_Config(void)
{ RCC_APB2PeriphClockCmd(ADC_GPIO_RCC, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = ADC_GPIO_PIN0|ADC_GPIO_PIN1|ADC_GPIO_PIN2|ADC_GPIO_PIN3|ADC_GPIO_PIN4|ADC_GPIO_PIN5 ;GPIO_InitStruct.GPIO_Mode = ADC_GPIO_MODE ;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(ADC_GPIO_PORT , &GPIO_InitStruct);
}void DMA_Config(void)
{RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel_x); DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) (&(ADC_x->DR)); // DMA 外设基地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; // 内存基地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为数据的来源DMA_InitStructure.DMA_BufferSize = channel_number; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不递增DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Enable ; //内存地址递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度16位 ADC输出16位数据DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度16位 ADC输出16位数据DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在循环DMA_InitStructure.DMA_Priority = DMA_Priority_High; //高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel_x, &DMA_InitStructure); DMA_Cmd(DMA1_Channel_x,ENABLE); //使能MA6}
void ADC_Config(void)
{GPIO_Config();DMA_Config();RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);ADC_DeInit(ADC_x); //初始化ADC_InitTypeDef ADC_InitStructure; 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 = channel_number; //规则转换的 ADC 通道的数目ADC_Init(ADC_x, &ADC_InitStructure); RCC_ADCCLKConfig(RCC_PCLK2_Div8); //设置时钟ADC_RegularChannelConfig(ADC_x, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5); //设置指定 ADC 的规则组通道ADC_RegularChannelConfig(ADC_x, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC_x, ADC_Channel_12, 3, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC_x, ADC_Channel_13, 4, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC_x, ADC_Channel_14, 5, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC_x, ADC_Channel_15, 6, ADC_SampleTime_55Cycles5);ADC_DMACmd(ADC_x,ENABLE); //使能DMA __ADCADC_Cmd(ADC_x,ENABLE);ADC_ResetCalibration(ADC_x); // 初始化ADC 校准寄存器 while(ADC_GetResetCalibrationStatus(ADC_x)); // 等待校准寄存器初始化完成ADC_StartCalibration(ADC_x);while(ADC_GetCalibrationStatus(ADC_x));ADC_SoftwareStartConvCmd(ADC_x,ENABLE); //软件使能}
.h文件
#ifndef _ADC_H_
#define _ADC_H_#include "stm32f10x.h"#define ADC_GPIO_RCC RCC_APB2Periph_GPIOC
#define ADC_GPIO_PORT GPIOC#define ADC_GPIO_PIN0 GPIO_Pin_0 //ADC通道10
#define ADC_GPIO_PIN1 GPIO_Pin_1 //ADC通道11
#define ADC_GPIO_PIN2 GPIO_Pin_2 //ADC通道12
#define ADC_GPIO_PIN3 GPIO_Pin_3 //ADC通道13
#define ADC_GPIO_PIN4 GPIO_Pin_4 //ADC通道14
#define ADC_GPIO_PIN5 GPIO_Pin_5 //ADC通道15
#define ADC_GPIO_MODE GPIO_Mode_AIN //模拟输入#define DMA1_Channel_x DMA1_Channel1 //DMA1通道1 对应ADC1
#define ADC_x ADC1
#define channel_number 6
void ADC_Config(void);
#endif
main.c
#include "main.h"
extern uint16_t ADC_ConvertedValue[channel_number];int main()
{u8 i;float ADC_ConvertedValueLocal[channel_number];Usart1_Init(115200);printf("测试开始\r\n");ADC_Config(); //ADC初始化while(1)
{for(i=0;i<channel_number;i++){ADC_ConvertedValueLocal[i] =(float) ADC_ConvertedValue[i]/4096*3.3; // 读取转换的AD值}for(i=0 ;i<channel_number;i++)
{printf(" The %d channel current AD value = 0x%04X \r\n",i, ADC_ConvertedValue[i]); printf(" The %d channel current AD value = %f V \r\n",i,ADC_ConvertedValueLocal[i]); printf("\r\n\r\n");
} Delay_ms(1000);
}
}
STM32F103_ADC-DMA通道采集相关推荐
- STM32F4 ADC+DMA单通道采集
背景:对锂电池电压进行采集,由于电池电压为12V,已经提前对12V进行分压,保证ADC采集电压的范围为0~3.3V.对电池电压的采集不用太过频繁,循环模式下的ADC+DMA对一直采集电压浪费资源.于是 ...
- stm32l151 ADC通过DMA通道定时采样电池电量
最近在使用stm32l151开发一个项目,我的项目需求是ADC采集电池电量,通过DMA通道传送出来.然而我并不是得到了电池电量数据后就立马连续输出,而是通过tim4定时器每1s访问一次采样得到的电 ...
- STM32——多通道ADC的DMA方式采集方法
前言: 最近在调试STM32F205芯片ADC多通道DMA方式采集数据,总结下STM32多通道ADC的DMA方式采集的使用方法. 硬件平台:STM32F205 软件平台:keil v5 函数库:标准库 ...
- 用ADC0809实现八通道采集
ADC0809完成八通道采集 1.ADC0809的概述 1.1芯片特点 1.2引脚介绍 1.3工作过程 2.使用原理图仿真 2.1实验仿真概述 2.2原理图 3.解析原理图 3.1晶振和复位模块 3. ...
- ku115上实现adc12dj3200 配置,jesd204b接口,单通道采集模式
ku115上实现adc12dj3200 配置,jesd204b接口,单通道采集模式,204b设置为8lane,6G采样率,ad和时钟芯片配置代码,完整一套vivado2017.4工程 编号:34300 ...
- FPGA udp纯逻辑编写,Xilinx ise14.7平台,工程验证千兆无丢包 加200k128通道采集
FPGA udp纯逻辑编写,Xilinx ise14.7平台,工程验证千兆无丢包 加200k128通道采集 ID:221000630637522274gaoisgod
- 模数转换器ADS1118 四通道采集电压 stm32f103
模数转换器ADS1118 四通道采集电压 stm32f103 寄存器配置 uint16_t cha0_count=0xD08B;//0xC08B 0xD08B 0xE08B 0xF08B uint16 ...
- stm32f103c8t6 AD DMA连续采集8个通道
AD采集不住,需要在开始采集之前进行校准,校准函数如下: HAL_ADCEx_Calibration_Start(); 时钟设置如下 AD基本8个通道设置 AD DMA 设置 回调函数重写 uint1 ...
- 基于DMA通道的连续ADC扫描读取
ADC ADC即是模数转换器,将电压信号转换为数字信号. 以stm32f407为例,其拥有18个12位ADC转换通道,其中16个外部通道以及俩个内部通道. ADC有单次,连续,扫描或间断模式执行转换, ...
最新文章
- 【转载】Asp.Net 全生命周期
- linux怎么创建用户教程,在Linux中如何手动创建一个用户
- leetcode-26. Remove Duplicates from Sorted Array
- 覆盖网络 Flannel 0.7
- 运行程序时java后面跟的是文件名对吗_运行程序时java命令后面跟的是文件名。...
- 行先知 为您的办公室管理提供方便
- 《Adobe Photoshop CS6中文版经典教程》—第1课1.4节在Photoshop中还原操作
- JavaScript图片幻灯片显示效果
- php递归实现层级树状展开,PHP递归实现层级树状展开,php递归层级树状_PHP教程...
- @程序员,你的 996,可能是给公司无能的管理背锅
- Daily Report 2012.11.2 刘宇翔
- Flash/Flex学习笔记(50):3D线条与填充
- CNCF:Kubernetes 已“跨越鸿沟”,逆袭成为主流
- 无法打开网上邻居计算机,win7网上邻居在哪 无法访问怎么办【图文】
- 【转】performSelector延时调用导致的内存泄露
- 关于3dmax模型导入到u3d中时,坐标会旋转的问题
- 三菱FX5U系列PLC内置模拟量使用方法和输入输出信号接线
- png格式图片 转 icns格式图标
- sja1000 CAN驱动学习、调试记录(基于PeliCan Mode)
- 查看mysql数据库引擎
热门文章
- python 获取麦克风声音_如何使用python和ffmpeg或simi读取实时麦克风音频音量
- php自动打印小票_服装店专用小票机自带进销存
- MySQL 日期时间类型
- java实现数据库主键的更新_Java获取数据库自增主键表中插入数据的ID
- mysql convertgrp_Mysql中几种sql的常见用法
- flask Form表单数据传递与取值
- Markdown 添加emoji
- 向量距离汇总(连续值与离散值),Latex与Python实现
- flutter-dart
- C++ 洛谷 P2704 [NOI2001]炮兵阵地