首页 > 代码库 > STM32F10X入门指南---AD转换
STM32F10X入门指南---AD转换
首先,点击下面的链接下载我们需要使用的代码。链接
1.添加必要的文件:
之前我们说过,有三个文件是必须添加的,这三个文件分别是:startup_stm32f10x_xd.s ,stm32f10x_rcc.c ,system_stm32f10x.c。其中,前面的xd是根据你的芯片的容量来选择的。这三个文件都可以在千帆提供的代码中找到。文件路径:Core.rar\Core\STM32\Source\Must 。
另外,如果想操作IO口,必须添加千帆的一个库文件DeviceBase.cpp。文件路径:Core.rar\Core\system。
2.设置Include path
这样可以帮助编译器找到千帆库的头文件。具体的设置方法我们在前面已经说过,下面是链接:我是链接,点我
3.添加AD和串口部分的代码至工程
将千帆库文件中的AD部分的代码添加到工程中(文件:ADConvert.cpp,路径:Core.rar\Core\system)。
将千帆库文件中的串口部分的代码添加到工程中(文件:SerialPort.cpp,路径:Core.rar\Core\system)。
添加完成之后的Project如下图所示:
4.编写代码:
我们的实验是将内置的AD读取到的电压值通过串口发送到电脑端的上位机。如果你的电脑上面没有上位机(串口调试助手,可以点击这里下载)。
新建一个main.cpp(这里一定要写.cpp,而不是.c),在main函数中添加如下的代码:
#include"System.h" ADConvert convert(0); int main() { convert.Start(); while(1) { serial.Print("AD channel 0 :%f \n",convert.ReadVoltage()); Delay(1000); } }
先解释一下STM32F103C8的硬件的AD。千帆这里只使用了他的前8个通道(通道0~通道7)。分别对应PA0~PA7。
首先定义一个ADConvert的变量,这个变量的名字随便起,千帆起了一个convert。后面的参数是你需要使用的通道,这里千帆使用的是通道0,对应于与硬件上面的PA0。
当选定完通道之后就需要启动这次AD转换了,千帆的代码是使用的连续转换,即转换完一次之后接着进行第二次转换,直到你喊停(convert.End()函数)。当开启通道的转换之后如何获取你所需要的转换的电压值呢?千帆这里设置了一个函数convert.ReadVoltage()。这个函数是将你指定通道转换完成的电压值读出来,返回值即是电压值,为一个float类型的数值。读出电压值之后就可以将这一个电压值发送到我们的电脑端进行显示了。下面是千帆电脑上的截图:
STM32的AD转换是一个12位的,转换速度是很精确的。同时转换的速度在us之内,在我们平时的学习中已经足够了。上图一开始测量的是VCC(3.3V)的电压值。方框中是千帆将接口从VCC上面拔下来,查到GND上面时候的测量数据。为什么方框中会出现0.710596这个值呢?因为刚刚拔下的时候电压的测量线是浮空的,这时候没有一个固定的电平,所以说这个测量值肯定是无意义的了。下面的0是测量的GND的电压值。这些结果还是非常满意的。
如果你对serial这个东西不熟悉,可以看下这篇文章:链接
5.如何测量多个通道的电压值
有的人可能想了,如果我的系统中可能需要多个电压源的测量,我该怎么办呢?STM32的硬件上面提供了一个解决方案,规则组和注入组。这个实现起来比较麻烦,千帆没有实现。但是千帆在代码上提出了一种解决方案,通过软件切换的方式可以实现多个通道的电压值的测量。这也是一种分时复用的方法。首先测量0通道的电压值,然后切换电压的通道(比如说通道1),然后测量通道1的电压,周而复始,可以完成多个通道的测量。废话不多说了,下面是代码:
#include"System.h" ADConvert convert(0); int main() { convert.Start(); while(1) { convert.ChangeCh(0); serial.Print("AD channel 0 :%f \n",convert.ReadVoltage()); convert.ChangeCh(1); serial.Print("AD channel 1 :%f \n",convert.ReadVoltage()); Delay(1000); } }
convert.ChangeCh(int)函数可以切换通道,他的参数是需要切换的新的通道。上面的代码中我们使用了通道0和通道1,通过软件切换的方式测量了两个通道,当然这里你也可以将8个通道的电压全部测量,只是添加几句代码的样子。下面是截图:
千帆的通道0接了GND,通道1接了VCC。
通过这样的方式测量电压是不是很简单啊。