stm32学习-AD单通道

配置流程

初始化 

1.开启RCC时钟(ADC、GPIO和ADCCLK的预分频器的时钟)

void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
作用:配置预分频器系数。(可以对APB2的72MHz时钟选择2/4/6/8分频,输入到ADCCLK中)

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
作用:外设时钟控制(根据外设连接的总线选择要开启的时钟)

RCC_AHBPeriph/RCC_APB2Periph/RCC_APB1Periph:选择外设

NewState:使能/使能

2.配置GPIO(把需要的GPIO配置为模拟输入的模式)

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
作用:用结构体的参数初始化GPIO。

用法:先定义一个结构体变量,再给变量赋值,最后调用这个函数即可(这个函数就会自动读取结构体的值,然后自动把外设的各个参数配置好)。      

3.配置多路开关(把左边通道接到后边的规则组列表里)

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
作用:ADC规则组通道配置

ADCx:选择的ADC外设

ADC_Channel:指定ADC通道

Rank:序列几的位置

ADC_SampleTime:指定通道的采样时间

4.配置ADC转换器和AD数据寄存器

void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
作用:用结构体的参数初始化ADC。

(如果需要模拟看门狗的话,可以通过库函数配置阈值和监测通道;如果想开启中断,就在中断输出控制里用ITConfig函数开启对应的中断输出,然后在NVIC里配置优先级,就可以触发中断了)

我们本篇先不需要配置看门狗和中断

5.开启ADC

void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
作用:开启ADC

6.校准

(根据手册要求,在配置完后我们需要对其进行校准)

void ADC_ResetCalibration(ADC_TypeDef* ADCx);

作用:复位校准

FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);

作用:获取复位校准状态

void ADC_StartCalibration(ADC_TypeDef* ADCx);

作用:开始校准

FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);

作用:获取开始校准状态

获取AD值

流程:

1.软件触发转换

void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
作用:ADC软件开始转换状态(用于软件触发)

2.等待转换完成(EOC标志位置1)

FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

作用:获取标志位状态

void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);

作用:清除标志位状态

获取EOC的标志位,判断是否置1 

3.读取ADC数据寄存器

uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
作用:ADC获取转换值(获取AD转换的数据寄存器,读取转换结果就需要使用这个库函数)

代码

AD.c

#include "stm32f10x.h"                  // Device header

void AD_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	ADC_InitStructure.ADC_NbrOfChannel = 1;
	ADC_Init(ADC1, &ADC_InitStructure);
	
	ADC_Cmd(ADC1, ENABLE);
	
	ADC_ResetCalibration(ADC1);
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
}

uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
	return ADC_GetConversionValue(ADC1);
}

AD.h

#ifndef __AD_H
#define __AD_H

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

#endif

例题

通过电位器调节电压,调节后的AD值和电压值显示在OLED上。

接线

main.c

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

uint16_t ADValue;
float Voltage;

int main(void)
{
	OLED_Init();
	AD_Init();
	
	OLED_ShowString(1, 1, "ADValue:");
	OLED_ShowString(2, 1, "Volatge:0.00V");
	
	while (1)
	{
		ADValue = AD_GetValue();
		Voltage = (float)ADValue / 4095 * 3.3;
		
		OLED_ShowNum(1, 9, ADValue, 4);
		OLED_ShowNum(2, 9, Voltage, 1);
		OLED_ShowNum(2, 11, (uint16_t)(Voltage * 100) % 100, 2);
		
		Delay_ms(100);
	}
}

其他重要库函数

void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
作用:开启DMA输出信号(如果使用DMA转运数据,就得调用这个函数)

void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
作用:中断输出控制(用于控制某个中断能不能通往NVIC)

FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);
作用:获取软件开始转换状态(一般不用)

void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
作用:配置间断模式(ADC_DiscModeChannelCountConfig是每隔几个通道间断一次;ADC_DiscModeCmd函数是确定要不要启用间断模式)

void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
作用: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温度传感器内部电压控制(用于开启内部的两个通道)

ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);

作用:获取中断状态

void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);

作用:清除中断挂起位

有什么问题欢迎在评论区里提出来




 

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

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

相关文章

连续数组 ---- 前缀和

题目链接 题目: 分析: 如果我们直接做这道题, 有点麻烦如果我们将所有的0都变成1, 那么找到数量相同的0和1的最长连续子数组, 就是找最长连续子数组的和为0, 那么就和之前的题目<找到和为k的子数组>有点像, 需要用前缀和哈希表来完成在[0,i-1]区间找到前缀和 sum[i] - …

Android 逆向学习【1】——版本/体系结构/代码学习

#Android 历史版本 参考链接&#xff1a;一篇文章让你了解Android各个版本的历程 - 知乎 (zhihu.com) 三个部分&#xff1a;api等级、版本号、代号&#xff08;这三个东西都是指的同一个系统&#xff09; API等级&#xff1a;在APP开发的时候写在清单列表里面的 版本号&…

2024年短视频评论区批量爬取采集软件

一、背景说明 前言 评论区引流&#xff0c;顾名思义&#xff0c;是通过在视频下方进行留言评论、回复评论&#xff0c;吸引用户的注意&#xff0c;从而和你的账号产生互动、交易。比如&#xff0c;在一个关于健身的视频下方&#xff0c;留言分享自己的健身经验或者提出问题。…

瞄准金融行业的远控木马:SpyNote

Android 间谍软件是最常见的恶意软件之一&#xff0c;攻击者通过 Android 间谍软件来跟踪用户位置、检查 Web 浏览记录&#xff0c;甚至窃取敏感信息&#xff08;密码和信用卡号等&#xff09;&#xff0c;其对银行机构与客户构成的威胁与 Android 银行木马相媲美。间谍软件还可…

【智能算法】青蒿素优化算法(AO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;C Yuan受到青蒿素药物治疗疟疾过程启发&#xff0c;提出了青蒿素优化算法&#xff08;Artemisinin Optimization, AO&#xff09;。 2.算法原理 2.1算法思想 AO灵感来…

spring-boot 3.2 + spring-boot-starter-quartz + HikariCP配置

第一步&#xff0c;添加 spring-boot-starter-quartz 的 maven 依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> 第二步&#xff0c;在 ap…

dp背包问题

英雄联盟游戏中新出n个英雄&#xff0c;用长度为n的教组 costs 表示每个英雄的定价&#xff0c;其中 costs[i]表示第i个英雄的点券价格。假如你一共有coins点券可以用于消费&#xff0c;且想要买尽可能多的英雄并日选择英雄按costs[i]给出顺序获取。给你价格数组 costs 和金币量…

会声会影2024旗舰版神器,让你的视频秒变大片,小白也能轻松上手

在数字时代&#xff0c;视频已经成为了人们表达自我、记录生活的重要方式。无论是旅行中的美景&#xff0c;还是生活中的点滴瞬间&#xff0c;我们都渴望能够用镜头捕捉下来&#xff0c;并通过精心剪辑&#xff0c;将这些美好的画面永远珍藏。然而&#xff0c;对于大多数人来说…

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文介绍了 IP-Adapter&#xff0c;一种 高效地将预训练的图像到图像转换模型适应到新领域 的方法。它通过在预训练模型的 输入端 添加一个…

软件测试和开发比例

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

UOS1060e分离ssh与sftp服务

文章目录 原理一、sftp 用户与目录二、ssh 和 sftp 服务分离三、启动与停止四、验证 原理 SFTP是SSH的一部分&#xff0c;SFTP没有单独的守护进程&#xff0c;它必须使用SSHD守护进程&#xff08;端口号默认是22&#xff09;来完成相应的连接操作。 通过新建另一个‘sshd’进程…

C++ 函数模板与模板函数

一 代码重用技术 函数 类与对象 继承与派生 多态&#xff08;函数重载、运算符重载、虚函数、纯虚函数与抽象类&#xff09; 泛型程序设计 通用的代码需要补受数据类型的影响&#xff0c;并且可以自动适应数据类型的变化&#xff0c;这种程序设计类型称为泛型程序设计。 二 模…

Day 40 Web容器-Tomcat

Tomcat 一&#xff1a;Tomcat简介 1.简介 ​ Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目 ​ Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器 ​ Tomcat是WEB容器/WE…

增值税发票智能识别API,提升财税处理效率

智能识别技术是当今科技发展中的重要一环&#xff0c;可以帮助我们提升工作效率&#xff0c;更好地应对金融与财税领域的挑战。在财税处理中&#xff0c;增值税发票智能识别API的应用&#xff0c;不仅能够减少人工处理的时间和成本&#xff0c;还能够提高数据的准确性和安全性。…

酷开科技大屏营销,多元需求唤醒“客厅经济”

随着科技的发展和消费者习惯的变化&#xff0c;OTT大屏营销正逐渐成为客厅经济的新风向。OTT不仅改变了人们获取信息和娱乐的方式&#xff0c;也为品牌营销提供了新的机遇和挑战&#xff0c;OTT大屏营销已经成为客厅经济的重要组成部分。酷开科技通过其自主研发的智能电视操作系…

Python 脚本化 Git 操作:简单、高效、无压力

前言 如何判定此次测试是否达标&#xff0c;代码覆盖率是衡量的标准之一。前段时间&#xff0c;利用fastapi框架重写了覆盖率统计服务&#xff0c;核心其实就是先获取全量代码覆盖率&#xff0c;然后通过diff操作统计增量代码覆盖率&#xff0c;当然要使用diff操作&#xff0c…

【leetcode2028. 找出缺失的观测数据(自己写出来了)】

给你一个长度为 m 的整数数组 rolls &#xff0c;其中 rolls[i] 是第 i 次观测的值。同时给你两个整数 mean 和 n 。返回一个长度为 n 的数组&#xff0c;包含所有缺失的观测数据&#xff0c;且满足这 n m 次投掷的 平均值 是 mean 。如果存在多组符合要求的答案&#xff0c;只…

Qt QScript 之 C++/JavaScript相互调用

文章目录 Qt Script什么是ECMAScriptQt 中JavaScriptclass 详解Basic UsageQObject对脚本引擎可用使用信号槽connect 三种模式访问属性, 子对象使c++对象可用于用Qt Script编写的脚本C++ 类成员函数可用于脚本C++ 类属性可用于脚本对脚本中的c++对象信号的反应函数对象和本机函…

Android跨进程通信--Binder机制及AIDL是什么?

文章目录 Binder机制Binder是什么&#xff1f;Binder相对于其他几种跨进程通信方式&#xff0c;有什么区别&#xff1f;谈一下 Binder IPC 通信过程&#xff1a;具体的通讯过程是什么&#xff1f;Binder如何处理发送请求与接收请求?Binder是通过什么方式来进行内存映射的&…

决策树|随机森林 GBDT XGBoost|集成学习

文章目录 1 决策树模型1.1 决策树模型简介1.2 决策树模型核心问题1.2.1 分类划分标准1.2.1.1 信息增益1.2.1.2 增益率1.2.1.3 基尼系数 1.2.2 停止生长策略1.2.3 剪枝策略 1.3 决策树 - python代码1.3.1 结果解读1.3.2 决策树可视化1.3.3 CV - 留一法 2 集成学习2.1 Boosting2.…