打印
[应用相关]

STM32 ADC 电压输出

[复制链接]
3160|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32  内部 ADC  的简介
STM32 拥有 1~3 个 ADC ( STM32F101/102 系列只有 1 个 ADC),这些 ADC 可以独立
使用,也可以使用双重模式(提高采样率)。 STM32 的 ADC 是 12 位逐次逼近型的模拟数
字转换器。它有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可
以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位
数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀
值。

沙发
chenqiang10|  楼主 | 2018-5-28 14:12 | 只看该作者
STM32F103 系列最少都拥有 2 个 ADC,我们选择的 STM32F103ZET 包含有 3 个 ADC。
STM32 的 ADC 最大的转换速率为 1Mhz,也就是转换时间为 1us(在 ADCCLK=14M,采样周期
为 1.5 个 ADC 时钟下得到),不要让 ADC 的时钟超过 14M,否则将导致结果准确度下降。
STM32 将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。规则通道相当于你正常
运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你
的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完
成之后,规则通道才得以继续转换。

使用特权

评论回复
板凳
chenqiang10|  楼主 | 2018-5-28 14:13 | 只看该作者
通过一个形象的例子可以说明: 假如你在家里的院子内放了 5 个温度探头,室内放了
3 个温度探头; 你需要时刻监视室外温度即可,但偶尔你想看看室内的温度;因此你可以
使用规则通道组循环扫描室外的 5 个探头并显示 AD 转换结果,当你想看室内温度时,通
过一个按钮启动注入转换组(3 个室内探头)并暂时显示室内温度,当你放开这个按钮后,系
统又会回到规则通道组继续检测室外温度。从系统设计上,测量并显示室内温度的过程中断
了测量并显示室外温度的过程,但程序设计上可以在初始化阶段分别设置好不同的转换组,
系统运行中不必再变更循环转换的配置,从而达到两个任务互不干扰和快速切换的结果。

使用特权

评论回复
地板
chenqiang10|  楼主 | 2018-5-28 14:13 | 只看该作者
可以设想一下,如果没有规则组和注入组的划分,当你按下按钮后,需要从新配置 AD 循环扫
描的通道,然后在释放按钮后需再次配置 AD 循环扫描的通道。

使用特权

评论回复
5
chenqiang10|  楼主 | 2018-5-28 14:23 | 只看该作者
上面的例子因为速度较慢,不能完全体现这样区分(规则通道组和注入通道组)的好处,
但在工业应用领域中有很多检测和监视探头需要较快地处理,这样对 AD 转换的分组将简化
事件处理的程序并提高事件处理的速度。

使用特权

评论回复
6
chenqiang10|  楼主 | 2018-5-28 14:23 | 只看该作者
STM32 其 ADC 的规则通道组最多包含 16 个转换,而注入通道组最多包含 4 个通道。
关于这两个通道组的详细介绍,请参考《 STM32 参考手册的》第 155 页,第 11 章。STM32
的 ADC 可以进行很多种不同的转换模式,这些模式在《 STM32 参考手册》的第 11 章也都
有详细介绍,我们这里就不在一一列举了。我们本章仅介绍如何使用规则通道的单次转换模
式。

使用特权

评论回复
7
chenqiang10|  楼主 | 2018-5-28 14:23 | 只看该作者
STM32 的 ADC 在单次转换模式下,只执行一次转换,该模式可以通过 ADC_CR2 寄存器
的 ADON 位(只适用于规则通道)启动,也可以通过外部触发启动(适用于规则通道和注入
通道),这是 CONT 位为 0。以规则通道为例,一旦所选择的通道转换完成,转换结果将被
存在 ADC_DR 寄存器中,EOC(转换结束)标志将被置位, 如果设置了 EOCIE,则会产生中
断。然后 ADC 将停止,直到下次启动 。

使用特权

评论回复
8
chenqiang10|  楼主 | 2018-5-28 14:31 | 只看该作者
介绍一下我们执行规则通道的单次转换,需要用到的 ADC 寄存器。第一
个要介绍的是 ADC 控制寄存器( ADC_CR1 和 ADC_CR2)。 ADC_CR1 的各位描述如图所示


使用特权

评论回复
9
chenqiang10|  楼主 | 2018-5-28 14:31 | 只看该作者
当我们使用 GPIO 作为外部的 ADC 输入的时候,首 先要经过
一个模拟多路开关,然后选择进入哪个通道,一个是规则通道一个是注 入通道。而什么是
规则通道什么是注入通道呢?我们学习过中断,规则通道呢, 就相当于正常程序,而注入
通道呢,就相当于中断。也就是说,注入通道优先规 则通道,先转换。 (毕竟才有 3 个
ADC,但是却有 18 个 ADC 输入,狼多肉少啊, 所以要有时候要抢。 )而规则通道的
和注入通道转换结果的数据的寄存器也是不 一样,规则通道是一次只能保存一个转换结果。

使用特权

评论回复
10
chenqiang10|  楼主 | 2018-5-28 14:32 | 只看该作者
我们大致懂得了 ADC 的结构,接下来我们来看一下怎么操 作 ADC。
在这里我们主要讲解使用规则通道,单次转换模式的操作。 (ADC 可 以开启一次转换一
次,也可以一直循环转换。)

使用特权

评论回复
11
chenqiang10|  楼主 | 2018-5-28 14:32 | 只看该作者
开启时钟
我们开发板上面有三个 ADC, 它们对应的 IO 分别在 GPIOA, 和 GPIOB。 所以
我们要根据自己的开启的 ADC 选择 GPIO 时钟。 我们要使用的是 ADC1 来转换数
据,所以还要打开 ADC1 的时钟。

使用特权

评论回复
12
chenqiang10|  楼主 | 2018-5-28 14:50 | 只看该作者
代码 为:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

使用特权

评论回复
13
chenqiang10|  楼主 | 2018-5-28 14:51 | 只看该作者
  设置 GPIO  口的模式
在做为 ADC 输入的时候,GPIO 口应该配置为是:模拟输入(即:GPIO_Mode_AIN)。

使用特权

评论回复
14
chenqiang10|  楼主 | 2018-5-28 16:16 | 只看该作者
  设置 ADC  时钟分频
这里的分频是根据你的采样时间来决定的,要保持足够的转换时间(即 1us。我们
使用 12MHZ,所以 72 / 6 = 12。所以进行 6 分频。代码为:
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

使用特权

评论回复
15
chenqiang10|  楼主 | 2018-5-28 16:16 | 只看该作者
  接着进行 ADC  模式的初始化。
ADC 的初始化我们可以调用库函数的 ADC_Init()。它有两个输入参数: 第一个参
数是选择你要设置的 ADC, 我们使用 ADC1, 以设置为: ADC1。

使用特权

评论回复
16
chenqiang10|  楼主 | 2018-5-28 16:17 | 只看该作者
第二个参数是
传递一个结构体的指针,它成员有:
ADC_Mode:表示 ADC 的模式,我们使用独立模式,所以我们设置 为:
ADC_Mode_Independent。
ADC_ScanConvMode:表示 ADC 是否使用扫描模式,所谓扫描呢就 是在多通道
时,不用手动切换通道用的。我们这里不使用,所以设 置为:DISABLE。
ADC_ContinuousConvMode:表示 ADC 是否使用连续模式,也就是 一直转换。
我们是单次转换,我们设置为:DISABLE。
ADC_ExternalTrigConv:表示触发方式,ADC 可以使用多种定时器 类型触发,还
可以使用外部中断触发,我们这里是软件触发,所以 设置为:
ADC_ExternalTrigConv_None。
ADC_DataAlign:表示存储数据的对齐方式(上面我们有提到过数据 保存的对齐) 。
我们使用右对齐, 所以设置为: ADC_DataAlign_Right。
ADC_NbrOfChannel:表示顺序进行规则转换的通道数,我们一次只 转换一个通道,
所以我们可以把这个设置为:1。

使用特权

评论回复
17
chenqiang10|  楼主 | 2018-5-28 16:17 | 只看该作者
  开启 ADC  使能
ADC_Cmd(ADC1, ENABLE); //打开 ADC 使能

使用特权

评论回复
18
chenqiang10|  楼主 | 2018-5-28 17:27 | 只看该作者
  复位 ADC  校准,然后检测复位 ADC  校准是否完成
ADC_ResetCalibration(ADC1);//重置指定的 ADC 的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//获取 ADC 重置校准寄存器的状态

使用特权

评论回复
19
chenqiang10|  楼主 | 2018-5-28 18:36 | 只看该作者
  开启 ADC  校准,然后等待 ADC  校准开启成功。
ADC_StartCalibration(ADC1);//开始指定 ADC 的校准状态
while(ADC_GetCalibrationStatus(ADC1));//获取指定 ADC 的校准程序

使用特权

评论回复
20
chenqiang10|  楼主 | 2018-5-28 18:36 | 只看该作者
  设置采样周期和选择通道
我们可以用 ADC_RegularChannelConfig()函数,它有三个参数: 第一个参数表示
选择使用的 ADC。我们选择 ADC1 第二个参数选择你要使用的通道。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

940

帖子

1

粉丝