STM32 一通道单次转换
之前弄过ADC连续转换,还配了DMA传输,项目上不希望这样做,因为有其他设备用到DMA传输,就会不停的抢占优先级,效率低。
按照需求改成ADC单次转换,非连续,用的时候只需调下函数执行一次转换即可。
GPIO配置:
/**********************************************************************************************/
//ADC 配置
//PA3 - ADC123_IN3 可以使用ADC1的通道3、ADC2的通道3或ADC3的通道3,这里选择ADC1
//单通道和多通道转换时需修改几个地方
//ADC_InitStructure.ADC_NbrOfConversion = N;//N=1.2.3...N=1时,1个转换通道,N=2,2个通道连续转换
//ADC_InitStructure.ADC_ScanConvMode = DISABLE单通道扫描,ENABLE多通道扫描
//The total conversion time:Tconv = Sampling time + 12 cycles(固定值)
//Tconv = (ADC_SampleTime_84Cycles + 12) * ADCCLK = (84+12) * 1/15 = 6.4us ,ADCCLK = ADC_Prescaler_Div4 = 60M/4 = 15M
/*********************************************************************************************/
#include "ADC_DMA.h"
#define SIZE 1
#define ADC1_DR_Address ((u32)0x4001204C) //外设地址 void ADC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* Configure ADC1 Channel 3 (PA3)pin as analog input ******************************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure); /* ADC Common Init **********************************************************/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; //60M/4=15M max value is 30MHz
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //12bit
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //非连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfConversion = SIZE; //通道数量
ADC_Init(ADC1, &ADC_InitStructure); // The total conversion time:Tconv = Sampling time + 12 cycles(固定值)
// Tconv = (84 + 12) * ADCCLK = 96 * 1/15 = 6.4us ,ADCCLK = ADC_Prescaler_Div4 = 60M/4 = 15M
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, , ADC_SampleTime_84Cycles); //采样时间,时间越长,数据越稳定
// ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); /* Enable DMA request after last transfer (Single-ADC mode) */
// ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 DMA */
// ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 */ }
单次转换函数:
/****************************************************/
//参数: number,转换次数
//功能: 获取ADC单次转换累加后的均值
//返回值:ADC转换后的均值
/****************************************************/
uint16_t Get_ADC_Convert_Average_Result(uint8_t number)
{
uint8_t i = number;
uint16_t adc_ConversionValue = ; while(i--)
{
ADC_Cmd(ADC1, ENABLE);
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
ADC_SoftwareStartConv(ADC1);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
adc_ConversionValue += ADC_GetConversionValue(ADC1);
ADC_Cmd(ADC1, DISABLE);
} adc_ConversionValue = adc_ConversionValue/number;
return adc_ConversionValue;
}
获得转换值后,在进行数据转换,转换电压形式格式:
uint16_t ADC_Value = Get_ADC_Convert_Average_Result(ADC_Convert_Number);
float adc_voltage_value = (ADC_Value/4096.0)*3.3;
printf("ADC_value = %d ,V = %4.4fV \r\n",ADC_Value,adc_voltage_value);
经测试OK,已放置在项目上使用。
STM32 一通道单次转换的更多相关文章
- STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)
Ⅰ.概述 上一篇文章讲述的内容是:三通道逐次转换(单次.单通道软件触发),也就是说3条通道要三次软件触发才能完成转换,而且是通过软件读取转换数值. 本文讲述三通道DMA连续转换(3通道.软件单次触发) ...
- STM32 之ADC单次转换模式和连续转换模式
一.背景 在STM32中的AD的单通道采样中可以设置成单次转换模式和连续转换模式,如何理解这两个转换模式的区别,通过程序又是怎样实现的? 二.正文 首先理解单次转换模式,即ADC进行单次转换(单样本) ...
- 在一般处理程序中,把Form Post过来的表单集合转换成对象 ,仿 MVC post,反射原理
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.L ...
- stm32cube--ADC单次转换
stm32cube的ADC配置 ① ② ③ ④ ⑤ 二:用到的函数 HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleType ...
- sqlserver2012一直显示正在还原(Restoring)和从单用户转换成多用户模式(单用户连接中)
如果不需要还原,则使用: restore database test with recovery如果只需要还原,则使用: restore database test with norecovery U ...
- STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)
Ⅰ.概述 本文讲述关于STM32功能比较强大的ADC模块.ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述“三 ...
- [置顶]
STM32的ADC1采集多条通道,可以不使用DMA功能吗?
类似的问题 为什么我采集5条通道的电压,而采集到的值却都是第一条的呢? 我什么时候需要使用DMA功能? Ⅰ关于ADC的一些知识 STM32的ADC是一种12位逐次逼近型的模拟数字转换器.它有多达18条 ...
- stm32 引脚映射 和 ADC
老是弄不明白ADC的输入到底在哪,看了stm32F103Ve的datasheet,将引脚和通道的映射关系贴在下面: 好了,写到这,我已经看了中文手册一上午了,可是啥都没看懂,下午接着看,写代码不重要, ...
- msp430学习笔记-ADC12
本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013748.HTM MSP430单片机的ADC12模块是一个12位精度的A/D转换模块,它具有高速度,通用性等特 ...
随机推荐
- jquery常用的选择器
jquery用选择器来得到jquery对象,进而进行一些操作. 一.基本选择器 1.id选择器.示例:选择id为one的元素 var $one = $("#one"); 2.类选择 ...
- 导航栏底部黑线隐藏 UINavigationBar hidden Bottom Line
3种方法: 1.大杀器 ,iOS 10.2 最新系统亲测无问题( 添加导航栏分类) https://github.com/samwize/UINavigationBar-Addition/ 2.io ...
- struts2.3 创建工程
1:在该网站下载struts2.3.16.3,目前为最新版.http://www.struts.apache.org/download.cgi 不妨下载“Full Distribution”版本 下载 ...
- vsphere安装虚拟机
新建虚拟机完成后,启动虚拟机,打开启动虚拟机控制台,选择CD/DVD驱动器 选择iso镜像,可以是本地或存储中心的iso,选择后点击虚拟机--客户机--发送Ctrl+Alt+Del,接下来就是正常的操 ...
- 《JavaScript高级程序设计》读书笔记 ---创建对象
虽然Object 构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码.为解决这个问题,人们开始使用工厂模式的一种变体. 工厂模式工厂 ...
- GPS定位开发
1.概述 在iOS开发中,要想加入地图和定位功能这2大功能,必须基于2个框架进行开发 (1)Map Kit :用于地图展示 (2)Core Location :用于地理定位 2个热门专业术语: LBS ...
- $.ajax({})方法success,error,complete,beforeSend使用例子及解释
在与后台交互的时候,经常使用到jquery的$.ajax()方法来请求数据: 回调函数用的比较多的是success,但是complete.beforeSend.error函数也是很有用的: 下面是使用 ...
- NYIST OJ 题目20 吝啬的王国
DFS水题.题意说明了这是一颗树,那么只要按照根节点DFS下去就好了,DFS的时候记录一下当前在哪个结点,还有父节点是谁,就AC了! #include<cstdio> #include&l ...
- wps使用积累
1.word加批注: 选中文字--插入--批注
- 8.Hibernate的多对多关联映射
1.创建如下数据库脚本 --1.1 项目表 create table PROJECT ( proid ) not null, proname ) ) ; --1.2 项目表主键 alter table ...