stm32-模拟数字转化器ADC

 

 接线图:

#include "stm32f10x.h"                  // Device header
		//1: 开启RCC时钟,包括ADC和GPIO的时钟
		//2:配置GPIO将GPIO配置为模拟输入模式
		//3:配置多路开关将左边的通道接入到规则组中
		//4:配置ADC转换器,单次转换,连续转换,扫描还是非扫描
		//5:开关控制调用ADC_COM参数ADC配置完成就能正常工作
void AD_Init(void){
// void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); RCC_ADCCLKConfig配置ADCCLK分频器
// void ADC_DeInit(ADC_TypeDef* ADCx); 恢复缺省配置
// void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); Init初始化
// void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); 结构体初始化
// void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); 给ADC上电
// void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); 开始DMA输出信号
// void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); // 中断输出控制
// void ADC_ResetCalibration(ADC_TypeDef* ADCx); 复位校准
// FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);获取复位校准状态
// void ADC_StartCalibration(ADC_TypeDef* ADCx); 开始校准
// FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx); 获取开始校准状态
// void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); ADC软件开始转换函数用于软件触发的函数
// FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); ADC获取软件开始转换状态
// void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); 配置间断模式每隔几个通道间断一次
// void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); 是否启用间断模式
// void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); ADC规则组通道配置
// void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); ADC外部触发转换控制是否允许外部触发转换
// uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); ADC获取外部触发转换值
// uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); 获取ADC转换的数据寄存器,读取电平转换结果需要使用这个函数
// uint32_t ADC_GetDualModeConversionValue(void); ADC_获取双模式转换值,ADC双模式读取转换结果的函数
// 以下的三个函数是对模拟看门狗进行配置的函数:第一个是是否启动模拟看门狗,第二个是配置高低阈值,第三个是配置看门的通道
// void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
// void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
// void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
// void ADC_TempSensorVrefintCmd(FunctionalState NewState); ADC温度传感器,内部参考电压控制
// 以下的4个函数:第一个是获取标志位状态,第二个是清除标志位,第三个获取中断状态,第四个清除中断挂起位
// FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
// void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
// ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);
// void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);
	
	
}

AD.C代码

#include "stm32f10x.h"                  // Device header
		//	  1: 开启RCC时钟,包括ADC和GPIO的时钟
		//    2:配置GPIO将GPIO配置为模拟输入模式
		//	  3:配置多路开关将左边的通道接入到规则组中
		//    4:配置ADC转换器,单次转换,连续转换,扫描还是非扫描
		//	  5:开关控制调用ADC_COM参数ADC配置完成就能正常工作
		 
void AD_Init(void){
	  
	  // 开启ADC的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	  // 开启GPIOA的时钟
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	  // 配置ADC_CLK,72MHz/6 = 12MHz
	  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	  // 配置GPIO
	  GPIO_InitTypeDef GPIO_InitStructre;
	  // 将GPIO的模式引用出来
	  GPIO_InitStructre.GPIO_Mode =GPIO_Mode_AIN;       //  选择GPIO的模式,设置为AN模拟输入的模式在AIN模式下GPIO口是没有效果的
	  GPIO_InitStructre.GPIO_Pin = 	GPIO_Pin_0;         //  选择GPIO的输出模式,选择输出的管脚
	  GPIO_InitStructre.GPIO_Speed = GPIO_Speed_50MHz;  //  选择GPIO的时钟频率
	  GPIO_Init(GPIOA,&GPIO_InitStructre);              //  初始化GPIO
	
	  // 第二步 ---》 选择规则组的输入通道,参数二:指定通道,参数三:规则组序列器里面的次序1-16之间,参数4:指定通道的采样时间
	  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); 
	  
	  // 第三步 ---> 使用结构体初始化ADC
	  ADC_InitTypeDef ADC_InitStructure;
	  // 引出结构体成员
	  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE ;                //  配置扫描的模式
		ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;              //  配置ADC的数据对齐方式
		ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //  配置ADC的外部触发转换选择:这里使用内部软件触发的方式
		ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                  //  配置ADC的工作模式为独立模式
		ADC_InitStructure.ADC_NbrOfChannel = 1;                             //  配置通道数目
		ADC_InitStructure.ADC_ScanConvMode = DISABLE;                       //  配置扫描的模式
	  ADC_Init(ADC1,&ADC_InitStructure);
	
	  // 以下还可以配置中断和模拟看门狗,根据自己的需求进行配置
		
		
		// 开启ADC设置,第一个ENABLE第二个开启ADC的电源
		ADC_Cmd(ADC1,ENABLE); 
	  // 对ADC进行校准,这里分别有四个函数可以进行配置
		ADC_ResetCalibration(ADC1);  						              // 复位校准
		while(ADC_GetResetCalibrationStatus(ADC1) == SET);    // 返回复位校准的状态
	  ADC_StartCalibration(ADC1);                           // 启动校准
		while(ADC_GetCalibrationStatus(ADC1) == SET);         // 获取校准后的状态        
	  

}
uint16_t AD_GetValue(void){
    // 1: 软件触发转换 2:等待触发完成也就是等待EOC标志位设置为1,3:读取ADC数据寄存器
	  ADC_SoftwareStartConvCmd(ADC1,ENABLE); 
	  // 获取标志位状态共有5个参数,
	  // 第一个参数AWD模拟看门狗标志位,
	  // 第二个参数EOC规则组转换完成标志位,
	  // 第三个参数JEOC注入组转换完成标志位,
	  // 第四个参数:JSTRT:注入组开始转换标志位,
	  // 第五个参数:STRT规则组开始转换标志位
	  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 这里添加一个while空循环实现一个等待的过程
    // 获取ADC的结果--->使用ADC获取转换值的方式
	  return ADC_GetConversionValue(ADC1);
}


AD.H代码

#ifndef __AD_H
#define __AD_H

uint16_t AD_GetValue(void);
void AD_Init(void);

#endif

main函数代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"

uint16_t ADValue;
float Votage;
int main(void)
{
  // 初始化oled
	OLED_Init();
	AD_Init();
	
	OLED_ShowString(1,1,"ADVALUE!");
  OLED_ShowString(2,1,"Votage:0.00V");
	
	while (1)
	{
	  ADValue = AD_GetValue();
		Votage = (float)ADValue / 4095 * 3.3;
		OLED_ShowNum(1, 9, ADValue, 4); 
		OLED_ShowNum(2, 9, Votage,  1); 
		OLED_ShowNum(2, 11, (int)(Votage * 100) % 100,  1);
		Delay_ms(100);
	}
}

切换为连续转换模式需要修改的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/467268.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper安装配置

zookeeper是什么 ZooKeeper是一个分布式的, 开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是 ​​​​​​​Hadoop和Hbase的重要组件。它是一个为​​​​​​​分布式应用提供一致性服务的软件,提供的功能…

redis学习-Set集合类型相关命令及特殊情况分析

目录 1. sadd key value1 value2 ... 2. smembers key 3. sismember key value 4. scard key 5. srem key value1 value2 ... 6. srandmember key num 7. spop key num 8. smove key1 key2 value 9. sdiff key1 key2 key3 ... 10. sinter key1 key2 ... 11. sunion key1 key2 .…

mybatis缓存(学习笔记17)

1、什么是缓存:存在内存中的临时数据 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘(关系数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决…

分析云星空数据用奥威-金蝶BI,快且直观

财务指标计算难,数量太大,报表需求太多,报表根本做不完?如果云星空用户遇到这种情况,建议用奥威-金蝶BI方案。预设分析模型和BI报表,注册、下载并执行方案,立得200多张BI数据可视化分析报表&…

MS16_016 漏洞利用与安全加固

文章目录 环境说明1 MS16_016 简介2 MS16_016 复现过程3 MS16_016 安全加固 环境说明 渗透机操作系统:kali-linux-2024.1-installer-amd64漏洞复现操作系:cn_windows_7_professional_with_sp1_x64_dvd_u_677031 1 MS16_016 简介 MS16_016 漏洞产生的原因…

【题目】【网络系统管理】2022年甘肃省职业院校技能大赛-网络构建-试卷

极安云科专注职业教育技能竞赛培训4年,包含信息安全管理与评估、网络系统管理、网络搭建等多个赛项及各大CTF模块培训学习服务。本团队基于赛项知识点,提供完整全面的系统性理论教学与技能培训,成立至今持续优化教学资源与讲师结构&#xff0…

代码随想录刷题day27|组合总和II组合总和II分割回文串

文章目录 day27学习内容一、组合总和-所选数字可重复1.1、代码-正确写法1.1.1、为什么递归取的是i而不是i1呢? 二、组合总和II-所选数字不可重复2.1、和39题有什么不同2.2、思路2.2.1、初始化2.2.2、主要步骤2.2.3、回溯函数 backTracking 2.3、正确写法12.3.1、为什…

NB-IoT模块

目录 一. NB-IoT模块实物图 二. BC20/NB-IoT模块产品规格 三. 指令顺序 1. AT判断BC20模组是否正常 2. ATE0返回OK,已经返回回显 3. ATCSQ 4. AT_CEREG? 5. ATCGATT? 6. ATCGATT? 四. OneNet 连接 1. AT 查看 NB(当前NB),云平台根据这两个…

【全网最详细】ComfyUI下,Insightface安装指南-聚梦小课堂

🥮背景 ComfyUI下使用IP-adapter下的faceID模型的时候,大家可能会遇到如下错误: Error occurred when executing InsightFaceLoader: No module named insightface File "F:\ComfyUI-aki\execution.py", line 151, in recursive_…

寻找可能认识的人

给一个命名为:friend.txt的文件 其中每一行中给出两个名字,中间用空格分开。(下图为文件内容) 题目:《查找出可能认识的人 》 代码如下: RelationMapper: package com.fesco.friend;import or…

【mysql】聚簇索引和非聚簇索引(B树和B+树)

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: mysql 目录 一、索引分类 二、索引的数据结构 2.1 B树:改造二叉树 2.2 B树:改造B树 三、Mysql索引实现—InnoDB引擎 3.1 主键索引(聚簇索引) 3.2 …

在Python中执行分位数回归

线性回归被定义为根据给定的变量集构建因变量和自变量之间关系的统计方法。在执行线性回归时,我们对计算响应变量的平均值感到好奇。相反,我们可以使用称为分位数回归的机制来计算或估计响应值的分位数(百分位数)值。例如&#xf…

每日OJ题_牛客HJ12 字符串反转(IO型OJ)

目录 牛客HJ12 字符串反转 解析代码 牛客HJ12 字符串反转 字符串反转_牛客题霸_牛客网 解析代码 #include <iostream> using namespace std; int main() {string str "";cin >> str;int left 0, right str.size() - 1;while (left < right){ch…

Python——字典

一、字典特性介绍 字典在 Python 中极为重要&#xff0c;是属于映射类型的数据结构。 字典有⼀对⼉⼤括号组成 {} , 字典内的元素都是成对⼉出现的 {"a":1} , 他们⽤英⽂的冒号( : )隔开, 左边叫做键(key),右边的叫值(value), 通常叫做键值对⼉。 每个元素⽤英⽂的逗…

Java项目:62 基于ssm的校园驿站管理系统+jsp

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员管理快递仓库信息&#xff0c;管理待发货信息&#xff0c;管理已收快递&#xff0c;管理物流以及留言信息&#xff0c;管理员工和用户资…

PSCA复位控制集成之复位管理

电源模式转换 进入任何使域中的组件变为非功能性的电源模式的关键要求是确保静止状态。与其他电源域的所有未完成交互&#xff0c;如总线事务&#xff0c;必须已经完成&#xff0c;并且组件必须保持静止状态&#xff0c;而不管其边界的活动如何。 在支持的情况下&#xff0c;…

新克隆的项目对IDEA配置进行哪些配置(超详细)

大家有没有遇到和我一样的这种情况&#xff0c;每次克隆一个新新项目&#xff0c;代码都是飘红&#xff0c;依赖找不到&#xff0c;项目没法运行。然后就是对idea一通设置&#xff0c;我基本都是胡乱搞一通&#xff0c;也不知道哪些设置起作用了&#xff0c;反正是最后搞半天项…

挖到宝了!这些内容管理平台是企业的最佳选择

内容管理系统&#xff0c;不再只是专业人士的语言&#xff0c;而是已经突破到普通人的视野中。简单易懂的解释就是&#xff0c;内容管理平台就像是一个大货仓&#xff0c;你可以在这里存储、整理和搜索你的所有资料。那么今天&#xff0c;我要向你推荐的是三款强大的内容管理平…

macbookpro系统数据清理,2024年有哪些清理MacBook数据恢复

清理MacBook Pro系统数据的方法包括&#xff1a; 优化储存空间。在Mac的系统设置中&#xff0c;可以查看和管理储存空间的使用情况&#xff0c;包括iCloud云盘、照片、音乐、文稿等不同类别的数据。 转移或删除文件。可以将文件移动到外部驱动器或清空“废纸篓”来释放空间&…

JS练习题+对象(函数封装、数组)

function some(ele, arr []) {let flat false;for(let i0;i<arr.length;i){if(ele arr[i]){flat true;break}}return flat;} let re some(荔枝, [苹果, 香蕉, 橘子, 荔枝, 梨子]) console.log(re) // true let re1 some(榴莲, [苹果, 香蕉, 橘子, 荔枝, 梨子]) consol…