【Day8】:ADC电压采集

类比输入

自然界当中的讯号几乎为连续的,也就是我们常说的类比讯号,而对於单晶片或着电脑来说,我们能够接收的不外乎就是0与1,因此就有了ADC的诞生,ADC全名为Analog-To-Digital Converter,类比转数位转换器,透过短时间重复采样,将连续寻号转换为离散的。可以想像如果我们采集的频率越高,越能完整的描述这个连续的讯号,这也就是取样率的概念
https://ithelp.ithome.com.tw/upload/images/20210905/20141525qDNFowZCpe.png
而另一个重要的概念就是解析度,如果我们能够将固定的范围切的更细,那麽我们也就能更好的描述这个类比讯号。
还记得以前在Arduino使用analogRead他回传的值为0~1023也就是切成1024等分,我们将其称为10位元解析度的A/D转换器(1024为2的10次方)。而STM32为12的解析度高达12位元,输出为0~4095,分成4096等分。不过要注意的是Arduino是将0~5V切成1024等分,而STM32是将0~3.3V分成4096等分。稍微计算一下可以发现3.3/4096=0.000806,一个等分约为0.806mV。

ADC使用

STM32F429ZI单晶片总共有3个ADC转换器(ADC1~ADC3),而每个转换器有高达19个通道。
是不是完全听不懂一下3个、一下19个、又通道...。我们可以想像ADC转换器就是一台机器,可以将类比讯号转换为数位讯号,而这台机器有19个开口来接收类比讯号(当然一次还是只能接收一个啦),但这台机器运作的速度非常快(根据我简单的测量,转换一次的时间约为11微秒左右),因此就算你19个通道全部都在输入,那也只需要11X19=209微秒就可以测量完所有的通道,相当的快。
底下为每个ADC转换器各个通道所对应到的脚位
https://ithelp.ithome.com.tw/upload/images/20210906/20141525mjAoQgbCEq.jpg

单通道转换

首先我们先来看单通道的转换

  1. 一样进入.ioc档,今天我们终於要来使用左边那排看起来很复杂的类别了。选Analog底下的ADC1,右边出现许多框框勾选IN0,现在我们就已经把ADC1的第一个通道打开了。(我们往下滑会发现怎麽只有IN0~IN15,不是说有19个通道吗?怎麽只有16个呢?其实这块板子对於外部脚位只有配置16个通道,剩下的3个通道供单晶片内部使用,像是温度感测等)
  2. 再来底下的Configuration完全不用配置,都使用预设的即可!这样就完成设定啦~接下来我们来写程序,实际的来使用看看ADC功能。不过除了上面所说查表的方式可以知道该通道对应的脚位以外,我们也可以再Configuration的地方点GPIO Settings,底下的PinName就是脚位名称啦,与查表的方式得到的答案相同ADC1的IN0对应的脚位为PA0
  3. https://ithelp.ithome.com.tw/upload/images/20210906/20141525lbuW57NGw2.jpg
  4. 接下来我们要使用3个函式来完成ADC的转换
HAL_ADC_Start(ADC_HandleTypeDef* hadc)
HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)

我们依序来介绍。
第一个函式的功能就是启用ADC转换器,就像你要使用一台机器前要先把开关打开的道理相同
第二个函式的功能是等待转换完成後再继续执行程序。不要忘了这台机器转换是需要时间的,虽然很快(~11us),因此这个函式就是等待转换完成後再继续执行。但如果这台机器出错,转换失败呢?整个程序就一直卡在这里那还得了,因此Timeout这个参数就是告诉这台机器最多要等多久,单位是ms。
第三个函式看名字就知道,它会回传转换的结果

/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1,1);
    value = HAL_ADC_GetValue(&hadc1);
}

记得在全域宣告一个整数变数value
每次转换前都要将ADC转换器启用(只要转换完成就会关掉,因此要放在while回圈)。
执行後我们就可以用现场表达是来监看转换完成的value啦


<<:  Day 7 Odoo的Tree View

>>:  Day 07 - Transduce I

Day21 TensorFlow&OpenCV简介

我的目的 学习图像辨识,顺便拯救专题,再顺便参加铁人赛,一鱼三吃,真香。 图像辨识的原理 简单说就是...

前端工程学习日记第12天

使用绝对定位 / 相对定位 设计版型 https://ithelp.ithome.com.tw/up...

Day16 Laravel - migrate

Docker及Laravel为以後每个专案都会用到的搭配,所以这种时候就将它做成一个类似模板的环境并...

Day09:09 - User服务(4) - 前端 - JWT token、修改个人资料

Hola,我是Charlie! 在Day08当中,我们完成了後端的JWT机制还有修改个人资料,在今天...

#29 Electron 打包应用程序

今天我们来用 electron-forge 打包程序。 新增 electron-forge 到专案 ...