从我们已经学到的知识可以理解到,单片机是一个范例的数字系统。数字系统只能对输入的数字旗子暗记进行处理,其输出旗子暗记也是数字的。但是在工业检测系统和日常生活中的许多物理量都是仿照量,比如温度、光照、压力、速率等等,这些仿照量可以通过传感器变成与之对应的电压、电流等电仿照量。为了实现数字系统对这些电仿照量的检测、运算和掌握,就须要一个仿照量和数字量之间相互转换的过程。本项目我们就要学习这个相互转换的过程和用来做这类转换的一类传感器——光敏电阻。
【学习目标】
与STM32 ADC有关的信息量不小,为了不让篇幅太长,本章打算分五个部分来讲解,本文是第四部分。

这里为了突出源码的功能细节和排版之需,对源码进行了必要的分割处理。
1)adc.h源码阐发
该文件源码见代码清单2,紧张是ADC初始化和功能函数的声明,每个函数的功能和参数将在阐发adc.c源码时解读。
代码清单2 adc.h文件源码
2)adc.c源码阐发
该文件便是所有ADC驱动函数的定义,下面就逐个进行阐发。
◇ ADCx_Init()函数源码
该函数是对ADC的初始化,它有两个参数:ADCx指哪一个ADC,可以是ADC1、ADC2或ADC3(下同);tempFlag用来选择是否启用内部温度丈量,1启用,0不启用。详细源码见代码清单3,阅读时须要把稳两点:第一,该函数没有对通道引脚进行GPIO初始化,这部分将放到元器件层面的文件(ldr.c)里实现;第二,只有ADC1具有内部温度丈量功能。
代码清单3 ADCx_Init()函数源码
ADC的初始化除了打开对应的外设时钟以及添补初始化构造体参数,还须要设置ADC时钟的预分频系数(第41行),并在启动ADC后进行校准操作(第64~73行)。这里面用到了多个库函数,各函数的详细解释请拜会库函数手册。
◇ ADCx_GetValue()函数源码
该函数用于获取一次ADCx的值,参数ch为指定的通道,可取值为ADC_Channel_0 ~ ADC_Channel_17。详细源码见代码清单4,这里面同样用到了多个库函数,想理解它们的详细解释请拜会库函数手册。
代码清单4 ADCx_GetValue()函数源码
◇ ADCx_GetValueTimes()函数源码
该函数获取多次ADCx的值,并求均匀值。详细源码见代码清单5,它有三个参数,前两个同上,第三个参数times表示转换的次数。返回值为均匀数。
代码清单5 ADCx_GetValueTimes()函数源码
◇ ADCx_GetVoltag()函数源码
该函数将ADCx_GetValueTimes ()函数得到的结果换算成电压值,详见代码清单6。
代码清单6 ADCx_GetVoltag()函数源码
◇ ADC1_GetTemperature()函数源码
该函数采集内部温度通道的ADC值,并打算得到芯片内温度(℃),详细源码见代码清单7,打算公式已在注释中解释。
代码清单7 ADC1_GetTemperature()函数源码
3)ldr.h源码阐发
该文件是光敏电阻的头文件,源码见代码清单8,声明了两个函数,其含义将在ldr.c文件中阐发。
代码清单8 ldr.h文件源码
4)ldr.c源码阐发
大量与ADC有关的配置和功能已在adc.c文件里完成,因此与光敏电阻有关的代码就不多了,只需完成端口的GPIO初始化,并调用adc.c里的功能函数终极完成对应端口上的电压采集即可,详细源码见代码清单9。
代码清单9 ldr.c文件源码
5)main.c源码阐发
主程序比较大略,在完成必要的初始化之后,每隔一定韶光获取一次光敏电阻端口上的电压,详细源码见代码清单10。
代码清单10 main.c文件源码
5.5 验证与测试下载程序上电后,可以看到串口助手在刷新着光敏电阻端口上的电压,前面的图6已对该实验征象进行了呈现,我们这里再把它贴过来。这时你可以用手遮挡光敏电阻,也可以打开手机上的电筒照着光敏电阻,不雅观察数据的变革。有条件的同学还可以用万用表丈量PC3端口的电压,看是否与ADC采集的电压同等。
图6 光敏电阻单通道采集实验效果
(第四部分完,第五部分我们在上述源码的根本上做一些补充和拓展)