(转) STM32--ADC

原标题:STM32之ADC+步骤小技巧(英文)

 

看到标题,别吓到哈、并不是要用英文写、至于原因是什么、请往下看:

       言归正传:STM32的ADC模块的特色

      1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈

           STM32F103系列:在56MHz时转换时间为:1μs

                                    在72MHz时转换时间为:1.17μs

      2、转换范围:0~3.6V  (3.6v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.6)

      3、ADC供电要求:2.4V~3.6 V(可千万别接到 5V 的石榴裙子底下呀)

      4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有)

      5、双重模式(带2个ADC的设备): 8种转换模式

      6、最多有18个通道:16个外部通道

                                 2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)

   ......

      12、DMA功能(仅ADC1有)

      本博客里,由于篇幅、所以就以独立模式下的单次转换为例哈、打开参考手册可以看到这段话:

       单次转换模式下,ADC只执行一次转换。

       该模式既可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0。

       一旦选择通道的转换完成:

       ● 如果一个规则通道被转换: ─ 转换数据被储存在16位ADC_DR寄存器中 ─ EOC(转换结束)标志被设置 ─ 如果设置了EOCIE,则产生中断。

       ● 如果一个注入通道被转换: ─ 转换数据被储存在16位的ADC_DRJ1寄存器中 ─ JEOC(注入转换结束)标志被设置 ─ 如果设置了JEOCIE位,则产生中断。

       然后ADC停止。

      

 

     对于以上的寄存器:

     1、ADC状态寄存器(ADC_SR) 

     

 

    2、ADC控制寄存器1(ADC_CR1)

 

    3、ADC控制寄存器2(ADC_CR2)

       EXTSEL[2:0]:选择启动规则通道组转换的外部事件 (External event select for regular group)

       ALIGN:数据对齐 (Data alignment)

       RSTCAL:复位校准 (Reset calibration)

       CAL:A/D校准 (A/D Calibration)

       CONT:连续转换 (Continuous conversion)

       ADON:开/关A/D转换器 (A/D converter ON / OFF)

    4、ADC采样时间寄存器1(ADC_SMPR1)

       SMPx[2:0]:选择通道x的采样时间 (Channel x Sample time selection)

    5、ADC规则序列寄存器1(ADC_SQR1)

       L[3:0]:规则通道序列长度 (Regular channel sequence length)

       SQ1[4:0]:规则序列中的第1个转换 (1st conversion in regular sequence)(ADC规则序列寄存器3(ADC_SQR3))

    6、ADC规则数据寄存器(ADC_DR)    

    DATA[15:0]:规则转换的数据 (Regular data) 

 (由于寄存器过于多,我们就不在这一一列举了哈、、因为我主要是用库,所以寄存器相关的位都不具体介绍了哈、请大家参照中文手册)

   在这里,向大家介绍下:数据对齐:

                                              ALIGN位用于设置对齐方式:右或左;

                                              对于注入通道,转换结果是减去偏移量的值,可以为一个负数,在右对齐时扩展位为符号位。

 

    那我们现在要怎么来实现呢??这个问题、相信大家在看了那么多的寄存器之后急迫想要知道的吧、、前面的只是个热身、、接下来步骤如下:

    1、开启ADC1的时钟,由于ADC1是在PA1上,所以同时也要打开PA的时钟,并进行相关的配置、对于这个配置,要把PA1设置成模拟输入,为什么呢??大家打开中文参考手册可以看到

    啊哈、、这下子清楚了吧、

   2、复位ADC1,设置ADC1的分频因子,(记住,这里的ADC的时钟不能超过14MHZ),而且其采样周期长点会好点,

        ADCCLK---最快可达14MHz, 时钟来自经过分频器的PCLK2(2、4、6、8分频)

        整个转换时间 = 采样时间 + 12.5个周期(固定时间)

       在14MHz和采样时间位1.5周期时  转换时间:1μs (14个周期 cycles)

       当ADCCLK=14MHz和1.5周期的采样时间:

        TCONV = 1.5 + 12.5 = 14周期 = 14×(1 / (14 × 1000000)) = 1μs

       其采样周期一览表:

 

    涉及到采样周期、这里来看看转换序列:

    最多达16个转换通道且可以采样不同的顺序排列,不同的采样时间和过采样的可能性。

例如:- 转换通道:1、2、8、4、7、3、11
                            - 不同的采样时间;
                            - Oversampling of channel 7。

 

3、初始化ADC1的参数、设置ADC1的工作模式和规则序列的相关信息;

       大家通过打开"stm32f10.adc.h"可以看到:  

1 typedef struct
2 {
3   uint32_t ADC_Mode;                      //设置ADC模式-->独立模式
4   FunctionalState ADC_ScanConvMode;       //设置是否开启扫描模式 --->否
5   FunctionalState ADC_ContinuousConvMode; //设置是否开启连续转换模式 ---->否
6   uint32_t ADC_ExternalTrigConv;          //设置启动规则转换组转换模式---->软件触发              
7   uint32_t ADC_DataAlign;                 //设置数据对齐方式----->右对齐
8   uint8_t ADC_NbrOfChannel;               //设置规则序列的长度---->顺序进行规则转换的ADC通道数目1
9 }ADC_InitTypeDef;

 4、使能ADC并校准

注:在设置完了以上信息后,使能AD转换器,执行复位校准和AD校准(这两步校准一定要,否则数据将不准)

还有记住,每次进行校准之后都要等待校准结束,但是通过什么方式知道校准结束呢?

这里是通过获取校准状态来判断是否校准结束,相关的库函数请看代码

      分别的库函数请看待会的代码。(请用比较老外的方式去看,也就是用英语啦,为什么呢?请看下文)

 5、读取AD的值

    当然,这里说读取AD值并不是那么的简单,以上我们只是准备好了AD,还没有设置相关的规则序列通道,采样顺序,以及采样周期,设置完之后启动AD转换就行了、然后才直接读取哈、、

      相关的库函数请看代码

 1 void Adc_Init(void)
 2 {
 3 
 4     ADC_InitTypeDef ADC_InitStructure;
 5     GPIO_InitTypeDef GPIO_InitStructure;
 6 
 7    /* Enable ADC1 and GPIOA clock */
 8     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
 9 
10     RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12MHZ 
11     
12   /* Configure PA.1 (ADC Channel) as analog input -------------------------*/
13   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
14   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
15   GPIO_Init(GPIOA, &GPIO_InitStructure);
16     
17     //ADC_DeInit(ADC1);//在这里复位被我注释掉了、至于为什么,我待会会说
18     
19       /* ADC1 configuration ------------------------------------------------------*/
20   ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//这里对应上面所讲的配置,在这里就不给出注释了
21   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
22   ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
23   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
24   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
25   ADC_InitStructure.ADC_NbrOfChannel = 1;
26   ADC_Init(ADC1, &ADC_InitStructure);
27     
28     /* Enable ADC1 *///知道我为啥要在上面提醒大家要用老外的方式来看了吧、因为这里的注释都是用英文的
29   //请不要以为我装逼,我这样做是有原因的、、原因我待会会说、你也会明白我最初的标题为何那样写
30 
31   ADC_Cmd(ADC1, ENABLE);
32 
33   /* Enable ADC1 reset calibration register */   
34   ADC_ResetCalibration(ADC1);
35   /* Check the end of ADC1 reset calibration register */
36   while(ADC_GetResetCalibrationStatus(ADC1));
37 
38   /* Start ADC1 calibration */
39   ADC_StartCalibration(ADC1);
40   /* Check the end of ADC1 calibration */
41   while(ADC_GetCalibrationStatus(ADC1));
42 }

 

 1 u16 Get_val(u8 ch)
 2 {
 3     u16 DataValue; //又是英文注释、、啊哈    
 4 /* ADC1 regular channel14 configuration */ 
 5   ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
 6     
 7     /* Start ADC1 Software Conversion */ 
 8   ADC_SoftwareStartConvCmd(ADC1, ENABLE);
 9     
10     /* Test if the ADC1 EOC flag is set or not */ 
11     
12     while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
13     //FlagStatus Status;
14     //Status = ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC);
15     //while(!Status);---->这样做实现不了、请注意
16 /*Returns the ADC1 Master data value of the last converted channel*/
17  DataValue = ADC_GetConversionValue(ADC1); 
18 return DataValue; 
19 } 
20 
21 u16 ADC_Get_aveg(u8 ch,u8 n) 
22 { 
23 u32 ad_sum = 0; 
24 u8 i; 
25 for(i=0;i<n;i++) 
26 { 
27 ad_sum += Get_val(ch);
28  delay_ms(5); 
29 } 
30 return (ad_sum / n);
31  }
32 
33 adcx=ADC_Get_aveg(ADC_Channel_1,10);//获取AD数值(0~4095)
34 
35 temp=(float)adcx*(3.3/4096);//获取相应的电压值

 

       到了这一步,我们已经完成了AD采集数据的任务、接下来,有人可能有时候会觉得很纳闷,为什么有些人知道要完成特定的功能,它的步骤是怎么样的、为什么我就不知道??这个问题嘛、、接下来我讲的希望能稍微帮你,也希望你能好好的借鉴、

     步骤小技巧:其实也没啥的、大家知道下载库的文件的时候,里面都有包含每个模块的例子和一个模版、拿ADC这个模块来举例:

  

点击main.c可以看到神奇的一幕:

   大家仔细看看,可以发现在官方给的历程中的步骤里并没有复位ADC的函数,个人觉得所以没有必要去复位当然复位也不是什么坏事哈、看你个人、、看到这、应该明白了我前面的说法了吧、还有、大家应该也注意到了、都是英文的注释、、所以看到这大家也清楚了,前面不是我装逼、、所以呢、其实英语对于我们来说还是很重要的、、那有人问,时钟的分频因子呢?怎么没有设置??不急哈、、请看:

对于分频因子的设置,也在这个函数里:而这个RCC_Configuration()在最开始已经使用 了、、

  所以大家要好好利用官方给的历程。

 

转载于:https://www.cnblogs.com/zwdly/p/8193044.html

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

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

相关文章

嗨,那里有回调!

因为是我的书包&#xff0c;所以我喜欢JavaScript 。 实际上&#xff0c;我已经开始喜欢JavaScritp的面向异步回调的编程风格 。 因此&#xff0c;当我发现自己处于非JavaScript环境中时&#xff08;例如Java&#xff09; &#xff0c;我往往会错过使用回调的机会。 好消息是…

GC内存可视化器教程–第一部分

正如您从以前的文章中可能已经读到的那样&#xff0c;要获得的Java程序员的一项关键技能就是理解和评估JVM的运行状况的能力&#xff0c;例如Java堆内存占用量以及垃圾回收过程。 为了实现上述目标&#xff0c;所有JVM供应商&#xff08;Oracle&#xff0c;IBM等&#xff09;都…

设置表格边框颜色

1、源码如下&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><title>设置表格边框颜色</title><meta http-equiv"keywords" content"keyword1,keyword2,keyword3"…

java se程序设计_JavaSE--Java 的基本程序设计结构

Java 对大小写敏感Java 中定义类名的规则很宽松。名字必须以字母开头&#xff0c;后面可以跟字母和数字的任意组合。长度基本上没有限制。但是不能使用 Java 保留字作为类名。标准的命名规范为&#xff1a;类名是以大写字母开头的名词。如果名字由多个单词组成&#xff0c;每个…

Python开发【第十九篇】:Python操作MySQL

本篇对于Python操作MySQL主要使用两种方式&#xff1a; 原生模块 pymsqlORM框架 SQLAchemypymsql pymsql是Python中操作MySQL的模块&#xff0c;其使用方法和MySQLdb几乎相同。 下载安装 1pip3 install pymysql使用操作 1、执行SQL 123456789101112131415161718192021222324252…

20180705 考试记录

T1 货物运输弱化版 题解&#xff1a; 倒着跑最短路就行没仔细看题凉凉 code: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #define F(i,a,b) for(register int i(a);i<(b);i) using namespace std;int rd() {int x…

mysql集群跨地域同步部署_跨地域冗余 - 跨数据中心部署方案 - 《TiDB v2.1 用户文档》 - 书栈网 · BookStack...

跨数据中心部署方案作为 NewSQL 数据库&#xff0c;TiDB 兼顾了传统关系型数据库的优秀特性以及 NoSQL 数据库可扩展性&#xff0c;以及跨数据中心(下文简称“中心”)场景下的高可用。本文档旨在介绍跨数据中心部署的不同解决方案。三中心部署方案TiDB, TiKV, PD 分别分布在 3 …

使用Maven进行硒测试自动化

今天&#xff0c;我想帮助您更好地管理自动GUI测试&#xff08;Selenium&#xff09;。 在过去&#xff0c;我已经看到人们处理此问题的许多不同方式。 有些人只是使用Selenium-IDE编写这些普通HTML TestCases&#xff0c;将其存储在HDD上的某个位置&#xff0c;并在需要时手动…

js小练习题

1.2018年01月5日 11:40:30 星期三 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>Title</title>6 <script>7 8 function getCurrentDate(){9 //1. …

OC之OBJC2_UNAVAILABLE

OC之OBJC2_UNAVAILABLE】 1、What is OBJC2_UNAVAILABLE macro mean&#xff1f; 意即在OBJC2.0中&#xff0c;这些东西将被删除。 转自 https://www.cnblogs.com/tekkaman/archive/2013/04/24/3040727.html转载于:https://www.cnblogs.com/-WML-/p/9269067.html

使用prismjs为网站添加代码高亮功能

prismjs 是一款轻量、可扩展的代码语法高亮库&#xff0c;使用现代化的 Web 标准构建&#xff0c;使用 Prismjs 可以快速为网站添加代码高亮功能&#xff0c;支持超过113中编程语言&#xff0c;还支持多种插件&#xff0c;是简洁、高效的代码高亮解决方案。科技爱好者博客就是使…

Mockito – JAXB的RETURNS_DEEP_STUBS

很抱歉没有写一段时间&#xff0c;但是我正忙于为DZone编写JBoss Drools Refcard&#xff0c;而且我正在写一本有关Mockito的书&#xff0c;因此我没有太多时间来写博客了…… 无论如何&#xff0c;最近在我当前的项目中&#xff0c;我对使用Mockito和JAXB结构进行单元测试有一…

协作机器人(Collaborative-Robot)安全碰撞的速度与接触力

协作机器人&#xff08;Collaborative-Robot&#xff09;的安全碰撞速度和接触力是一个非常重要的安全指标。在设计和使用协作机器人时&#xff0c;必须确保其与人类或其他物体的碰撞不会对人员造成伤害。 对于协作机器人的安全碰撞速度&#xff0c;一般会设定一个上限值&…

jackson - @JsonProperty的使用

jackson的maven依赖 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.5.3</version> </dependency> 所以引入这一个依赖就可以了 JsonProperty 此注解用于属…

python 表达式求值数据结构_python 数据结构与算法

python 数据结构与算法1 python常见数据结构性能1.1 List1.1.1 安索引取值和赋值1.1.2 列表append和__add__()1.1.3 使用timeit模块测试执行时间1.1.4 List基本操作的大O数量级1.2 Dict1.2.1 dict数据类型2 线性结构 Linear Structure2.1 栈Stack2.1.1 抽象数据类型Stack2.1.2 …

CSS3新特性罗列

接触CSS3这么久了&#xff0c;总是到要用的时候直接拿来用&#xff0c;却没有好好地总结归纳一下&#xff0c;那就在这里好好梳理一下吧。 CSS3边框&#xff1a; 圆角边框&#xff1a; 关键&#xff1a;border-radius <!DOCTYPE html> <html> <head> <…

Log4j 2:性能接近疯狂

最近&#xff0c;Apache社区中一位受人尊敬的成员尝试了Log4j 2并在Twitter上写道&#xff1a; TheASF &#xff03;log4j2摇摇欲坠 &#xff01; 性能接近疯狂^^ http://t.co/04K6F4Xkaa — Mark Struberg&#xff08;struberg&#xff09; 2013年5月7日 &#xff08;来自M…

Uncaught SyntaxError: Invalid Unicode escape sequence异常处理

今天碰到一个问题&#xff0c;页面报错&#xff1a;Uncaught SyntaxError: Invalid Unicode escape sequence ,{index:operate,name:operate,label:<s:text name"com.vrv.cems.ptp.installSoft.operate"></s:text>,width:getPerWidth(0.1),formatter:fun…

26、jQuery

一. jQuery简介 (一) jQuery是什么&#xff1a; 是一个javascript代码仓库 是一个快速的简洁的javascript框架&#xff0c;可以简化查询DOM对象、处理事件、制作动画、处理Ajax交互过程。 (二) jQuery优势 体积小&#xff0c;使用灵巧(只需引入一个js文件)方便的选择页面元素(模…

玩转ajax

1.什么是ajax&#xff1f; Ajax 是 Asynchronous JavaScript and XML&#xff08;以及 DHTML 等&#xff09;的缩写。 2.ajax需要什么基础? HTML 用于建立 Web 表单并确定应用程序其他部分使用的字段。 JavaScript 代码是运行 Ajax 应用程序的核心代码&#xff0c;帮助改…