STM32——ADC

目录

 

1、ADC的介绍

2、ADC主要特征

3、ADC结构与引脚

4、ADC配置流程

5、示例(光敏电阻的ADC采样)

6、提示

7、结语:


 

1、ADC的介绍

12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。

2、ADC主要特征

● 12位分辨率

● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断

● 单次和连续转换模式

● 从通道0到通道n的自动扫描模式

● 自校准

● 带内嵌数据一致性的数据对齐

● 采样间隔可以按通道分别编程

● 规则转换和注入转换均有外部触发选项

● 间断模式

● 双重模式(带2个或以上ADC的器件)

● ADC转换时间: ─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs) ─ STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz为1.55μs) ─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs ─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)

● ADC供电要求:2.4V到3.6V

● ADC输入范围:VREF- ≤ VIN ≤ VREF+

● 规则通道转换期间有DMA请求产生。

3、ADC结构与引脚

1e587ba16ffb4b05a5ac489907129f6f.png

491d220a257f4d5b8321a4f1d5e8a49f.png

4、ADC配置流程

 

  1. 时钟使能: 首先需要使能ADC的时钟。这通常涉及到修改RCC寄存器,具体操作取决于你的芯片型号。例如,RCC_APB2Periph_ADC1 (假设ADC1)。 你需要查阅你的芯片数据手册确定正确的寄存器和位。

  2. ADC复位: 通常需要复位ADC,这可以通过设置相应的寄存器位来实现。

  3. ADC配置: 这一步是最关键的,你需要配置ADC的各个参数,这主要通过操作ADC的寄存器来完成。 重要的寄存器包括:

    • ADC_CR1 (控制寄存器1): 配置ADC的模式(单次转换、连续转换)、扫描模式、数据对齐等。
    • ADC_CR2 (控制寄存器2): 配置ADC的触发方式、转换完成中断等。
    • ADC_SMPR1/SMPR2 (采样时间寄存器): 配置ADC的采样时间。
    • ADC_SQR1/SQR3 (正则顺序寄存器): 配置ADC的转换顺序,如果进行多通道转换。
    • ADC_DR (数据寄存器): 读取转换结果。
    • ADC_CSR (校准状态寄存器): 进行ADC校准。
  4. 通道选择: 选择要使用的ADC通道。这通常涉及到设置ADC_SQR1 或 ADC_SQR3寄存器。

  5. ADC校准 (可选): 为了提高精度,可以进行ADC校准。 这通常涉及到设置ADC_CR2寄存器中的CAL位。

  6. ADC使能: 使能ADC,这通常涉及到设置ADC_CR2寄存器中的ADON位。

  7. 启动转换: 启动ADC转换,这通常涉及到设置ADC_CR2寄存器中的SWSTART位,或者通过触发方式启动转换。

  8. 读取数据: 从ADC_DR寄存器读取转换结果。

  9. ADC关闭 (可选): 转换完成后,可以关闭ADC以节省功耗。

5、示例(光敏电阻的ADC采样)

ADC.h

#ifndef _ADC_H_
#define _ADC_H_void Light_Init(void);
int Light_Getval(void);#endif

ADC.c

#include "ADC.h"
#include "stm32f10x.h"//PB0--ADC1_IN8
void Light_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);GPIO_InitTypeDef GPIOB_Struct;GPIOB_Struct.GPIO_Mode = GPIO_Mode_AIN;GPIOB_Struct.GPIO_Pin = GPIO_Pin_0;//GPIOB_Struct.GPIO_SpeedGPIO_Init(GPIOB,&GPIOB_Struct);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//6分频 clock=12mhzADC_InitTypeDef ADC_Struct;ADC_Struct.ADC_ContinuousConvMode = DISABLE;ADC_Struct.ADC_DataAlign = ADC_DataAlign_Right;ADC_Struct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_Struct.ADC_Mode = ADC_Mode_Independent;ADC_Struct.ADC_NbrOfChannel = 1;ADC_Struct.ADC_ScanConvMode = DISABLE;ADC_Init(ADC1,&ADC_Struct);//校准ADC_Cmd(ADC1,ENABLE);//复位校准ADC_ResetCalibration(ADC1);//等待复位结束while(RESET != ADC_GetResetCalibrationStatus(ADC1)){static int count = 0;count++;if(count > 10000){break;}}//开启校准ADC_StartCalibration(ADC1);//等待校准结束while(RESET != ADC_GetCalibrationStatus(ADC1)){static int count = 0;count++;if(count > 10000){break;}}
}int Light_Getval(void)
{//转换顺序,通道选择,采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_55Cycles5);//软件触发ADC_SoftwareStartConvCmd(ADC1,ENABLE);//等待转换结束while(SET != ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)){static int count = 0;count++;if(count > 10000){return -1;}}//获取转换结果uint16_t ret = ADC_GetConversionValue(ADC1);//ret 0~4096return 100 - (ret/41);
}

6、提示

keil经常会报警告

ADC.h(8): warning:  #1-D: last line of file ends without a newline

解决办法:在最后一行多敲一行空行

原理:

在Keil MDK中,最后一行添加空行并非强制要求,也不是Keil编译器本身的规定。 它更多的是一种编程风格和习惯,并没有实际的功能影响。 一些人认为这样做可以提高代码的可读性和整洁性,方便阅读和维护。

虽然没有强制要求,但这种习惯在嵌入式开发中比较常见,原因如下:

  • 避免潜在的编译器警告或错误: 虽然极少见,但某些编译器在处理文件结尾时可能会有特殊的处理方式,添加空行可以避免一些不必要的警告或错误,特别是对于一些比较老旧的编译器。

  • 版本控制系统: 在使用版本控制系统(如Git)时,在文件末尾添加空行可以避免不必要的冲突,因为不同的编辑器可能会在文件末尾添加不同的换行符。

  • 代码美观和可读性: 这可能是最主要的原因。一个干净整洁的代码文件,在结尾处留一个空行,视觉上会更舒服,也更易于阅读和理解。 这是一种良好的编程习惯,有利于团队合作和代码维护。

  • 习惯: 很多程序员都习惯在文件末尾添加空行,这已经成为一种约定俗成的习惯。

总而言之,在Keil中最后一行加空行主要是一种代码风格和习惯问题,对编译和运行没有任何实际影响,但有助于提高代码的可读性和可维护性。 是否添加完全取决于个人或团队的代码规范。

我的个人意见:好像与团队项目中,代码移植之类的有关系,如果是个人项目,完全可以忽略,如果是团队项目,好像是最后一行会有一些缓存之类的操作,可能团队项目时,整合会发生别人的代码的第一行和你的最后一行在一行里;所以团队项目可以加上空行 

7、结语:

还有很多东西没有讲解:比如双adc,比如注入与规则通道等;

本文的目的在于辅助上手;具体的原理在芯片手册中有完整的讲解;有兴趣的同学可以自行查阅

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js——fs模块-同步与异步

本文的分享到此结束,欢迎大家评论区一同讨论学习,下一篇继续分享Node.js的fs模块文件追加写入的学习。

Python | Leetcode Python题解之第528题按权重随机选择

题目: 题解: class Solution:def __init__(self, w: List[int]):self.pre list(accumulate(w))self.total sum(w)def pickIndex(self) -> int:x random.randint(1, self.total)return bisect_left(self.pre, x)

道品科技的水肥一体化智能灌溉:开启现代农业的创新征程

水肥一体化智能灌溉作为一种现代农业技术,其通过对水分与养分供应的有效整合,致力于营造作物的最佳生长环境。此项技术的核心要义在于凭借智能化系统精准把控灌溉与施肥的流程,进而提升水资源的利用效率,降低肥料的浪费程度&#…

GitHub个人主页美化

效果展示 展示为静态效果,动态效果请查看我的GitHub页面 创建GitHub仓库 创建与GitHub用户名相同的仓库,当仓库名与用户名相同时,此仓库会被视作特殊仓库,其README.md(自述文件)会展示在GitHub个人主页…

QT5串口多线程--派生类加moveToThread

QT5串口多线程--派生类加moveToThread Chapter1 QT5串口多线程--派生类加moveToThread前言新建工程源码serialobject.hserialobject.cppmanager.hmanager.cppwidget.hwidget.cpp 测试 Chapter2 QT在PC开发中多串口通信有哪些方法方法实现方案一:需要注意的是&#x…

框架学习01-Spring

一、Spring框架概述 Spring是一个开源的轻量级Java开发框架,它的主要目的是为了简化企业级应用程序的开发。它提供了一系列的功能,包括控制反转(IOC)、注入(DI)、面向切面编程(AOP)…

十年码农的编程心得分享

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【网络安全】|nessus使用

1、扫描结果分析: Sev:漏洞的严重性级别 CVSS:量化漏洞严重性的标准,通过计算得出一个分数,分数越高表示漏洞越严重。 VPR:基于风险的评分系统,帮助组织优先处理风险最高的漏洞。 EPSS&#xf…

为什么越来越多人开始用云电脑?网友道出了真相

近期,3A游戏大作《黑神话:悟空》的横空出世,成功激起大多数人对国产游戏的兴趣。然而,没有一台高配置的电脑,就无法在《黑神话:悟空》中获得震撼的游戏体验。想要配齐处理器、显卡、内存等硬件,…

W6100-EVB-Pico2评估板介绍

目录 1 简介 2 硬件资源 2.1 硬件规格 2.2 引脚定义 2.3 工作条件 3 参考资料 3.1 RP2350 数据表 3.2 W6100 数据表 3.3 原理图 原理图 & 物料清单 & Gerber 文件 3.3 尺寸图(尺寸:mm) 3.4 参考例程 认证 CE FCC 4 硬…

VUE2升级成VUE3的优化与区别

大家好,我是小编阿贤。欢迎各位大神关注《全栈技术圈》,让技术更加简单易懂。 1. vue2和vue3实例区别 1.1 创建一个vue2实例 在vue2里面的Vue是一个构造函数,通过该构造函数创建一个Vue实例,data选项可以是对象,也可以…

ProLightsfx新的出发–从CSDN到WordPress

原文链接:ProLightsfx新的出发--从CSDN到WordPress_ProLightsfx的技术分享 (https://www.prolightsfxjh.com/article/article-new-start/) 大概有差不多2年时间没有在csdn发布文章了。可能主要是最近几年工作有些疲惫、精神有些懈怠&#xff…

「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现

自定义动画让开发者可以设计更加个性化和复杂的动画效果,适合表现独特的界面元素。鸿蒙提供了丰富的工具,支持通过自定义路径和时间控制来创建复杂的动画运动。本篇将带你学习如何通过自定义动画实现更多样化的效果。 关键词 自定义动画动画路径贝塞尔曲…

GPIO子系统中Controller驱动源码分析

往期内容 本专栏往期内容: Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体Pinctrl子系统中c…

【Linux系统编程】第四十二弹---多线程编程全攻略:涵盖线程创建、异常处理、用途、进程对比及线程控制

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、线程创建 2、线程异常 3、线程用途 4、进程 VS 线程 5、线程控制 5.1、创建和等待线程 1、线程创建 线程能看到进程的大…

Qt入门基础分享

文章目录 学习 Qt 语言之前的基本知识1. 编程基础语法:面向对象编程(OOP):基本数据结构:了解数组、链表、栈、队列、树(如二叉树、平衡树)、图(如邻接矩阵、邻接表)等。算法:熟悉常见的排序算法(如快速排序、归并排序、冒泡排序)和查找算法(如线性查找、二分查找)…

超萌!HTMLCSS:超萌卡通熊猫头

效果演示 创建了一个卡通风格的熊猫头 HTML <div class"box"><div class"head"><div class"head-copy"></div><div class"ears-left"></div><div class"ears-right"></di…

使用 AMD GPU 的 ChatGLM-6B 双语语言模型

Using the ChatGLM-6B bilingual language model with AMD GPUs — ROCm Blogs 2024 年 4 月 4 日&#xff0c;作者&#xff1a; Phillip Dang. ChatGLM-6B 是一个开源的中英双语语言模型&#xff0c;拥有 62 亿参数。它基于通用语言模型 (GLM) 架构&#xff0c;针对中文对话进…

计算并联电阻的阻值

计算并联电阻的阻值 C语言代码C代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 对于阻值为r1和r2的电阻&#xff0c;其并联电阻阻值公式计算如下&#xff1a; R1/(1/r11/r2) 输入 两个电阻阻抗大小&#xff0c;浮…

创建线程时传递参数给线程

在C中&#xff0c;可以使用 std::thread 来创建和管理线程&#xff0c;同时可以通过几种方式将参数传递给线程函数。这些方法包括使用值传递、引用传递和指针传递。下面将对这些方法进行详细讲解并给出相应的代码示例。 1. 值传递参数 当你创建线程并希望传递参数时&#xff…