首页

如何在STM32F103C8T6中使用ADC ?STM32 ADC教程

在本教程中,我将向您展示如何使用ADC在STM32F103C8T6蓝色药丸板测量输入模拟电压。在之前的教程中,我已经向您展示了如何将16×2 LCD与STM32 Blue Pill连接起来。在这个项目中我将使用LCD来显示ADC的结果。

(adsense1)

简介

几乎所有的嵌入式应用程序都需要至少一个传感器与微控制器进行接口。它可能是一个温度传感器或位置传感器。如果我们知道一件关于传感器的事,那就是几乎所有的传感器(在其基本形式中)本质上都是模拟的。这意味着传感器从自然界(如温度)读取模拟值并产生模拟电压。

但微控制器(STM32F103C8T6或Arduino)的问题是,它们是数字“存在”,不能使用模拟值。因此,我们必须首先转换模拟值转换为数字值然后再交给微控制器进行进一步处理或分析。模拟到数字转换器用于这一目的。

如果你在8051微控制器,那么您可能已经使用外部ADC IC(如ADC0804 IC)将输入的模拟信号转换为数字值。但大多数现代微控制器,如Arduino或STM32F103C8T6都内置了ADC。因此,我们不需要任何外部组件。我们所要做的就是配置内部ADC并将模拟值转换为数字值。

在这个项目/教程中,我将演示如何连接一个电位器,这是可变模拟电压的最简单的来源,并配置一个模拟引脚来读取电压,使用ADC将其转换为数字值并在LCD上显示结果。

(adsense2)

在STM32蓝色药丸ADC

如果你参考STM32F103C8T6单片机的数据表,那么你可以看到STM32F103C8T6单片机的ADC是12位分辨率,是一个逐次逼近型ADC。MCU支持多达16个外部通道测量模拟信号。

但是STM32蓝丸板中的ADC配置为10通道,即您可以使用10个模拟输入管脚测量10个不同的模拟电压。

如何在STM32F103C8T6中使用ADC ?

如前所述,STM32 Blue Pill中的ADC的分辨率为12位。因此,STM32F103C8T6中的ADC值的范围是从0到212- 1,即0至4095。基于模拟电压,该值将逐步增加。

电压/阶跃或分辨率可以用下面的公式计算。

电压/步长=参考电压/ 212

参考电压通常为3.3 V。因此,可以检测到的最小电压变化为

电压/步长= 3.3 / 4096 = 0.8056 mV /步长

现在,输入模拟电压可以计算如下:

输入电压= (ADC值/ ADC分辨率)*参考电压

线路图

下图为STM32F103C8T6中ADC配置项目电路图。

如何在STM32F103C8T6电路图中使用ADC

如果电路图中STM32蓝丸板的引脚看不清楚,可参考下图。

STM32F103C8T6针

组件的要求

  • 基于STM32F103C8T6单片机的STM32蓝丸板
  • 16×2液晶显示器
  • 10KΩ POT x 2
  • USB到UART转换器(如果通过UART编程)
  • 连接电线

电路的解释

如前所述,在STM32蓝色药丸板上有10个模拟输入。它们是PA0到PA7 (ADC0到ADC7)和PB0和PB1 (ADC8和ADC9)。

您可以在项目中使用任何模拟输入通道。对于这个演示,我将使用ADC0即PA0引脚作为模拟输入引脚。在这个引脚上,我已经连接了10KΩ电位器的中心(雨刷)端子,而POT的其他两个端子连接3.3 V和GND。

我使用16×2液晶显示器作为输出设备。在“STM32F103C8T6接口16X2 LCD”项目中,我已经解释了STM32蓝色药丸板和16×2 LCD之间的连接。我在这里也使用了同样的联系方式。

编程STM32蓝色药丸

如果你已经跟随我的“通过USB编程STM32蓝色药片”教程,那么你不需要USBUART转换器,您可以使用板载USB上传程序。

说到程序,首先,初始化引脚的LCD和模拟输入。然后初始化LCD并显示一些介绍性信息。在回路部分,从模拟输入引脚(PA0)读取模拟电压,使用类比读取函数,并将值存储在名为类比val的变量中。

现在,用上面提到的公式,你可以计算输入电压。使用Float变量保存计算输入电压的值。

float inputVoltage = ((float) analogVal) / 4096 * 3.3

在LCD上显示计算出的模拟电压和计算出的ADC值。你可以不断地改变POT,相应的模拟电压将由STM32F103C8T6中的ADC读取并计算电压。

代码

/*
* LCD VSS引脚到GND
* LCD VDD引脚到5V
* LCD VO引脚到POT
* LCD RS引脚到数字引脚PB11
* LCD RW引脚到GND
* LCD EN引脚到数字引脚PB10
* LCD D0到D3引脚未使用
* LCD D4引脚到数字引脚PB0
* LCD D5引脚到数字引脚PB1
* LCD D6引脚到数字引脚PA7
* LCD D7引脚到数字引脚PA6
* LCD LED+引脚到5V
* LCD LED引脚到GND
* /
# include < LiquidCrystal.h >

const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PA7, d7 = PA6;
液晶显示器(rs, en, d4, d5, d6, d7);

const int类比输入= PA0;
无效的设置()

液晶显示器。开始(16日2);
lcd.clear ();
液晶显示器。setCursor (0,0);
液晶显示器。打印(“电子中心”);
液晶显示器。setCursor (0,1);
液晶显示器。打印(“ADC in STM32”);
延迟(2000);
lcd.clear ();

无效循环()

int analogVal = analogRead(类比输入);
float inputVoltage = (float(analogVal)/4096) * 3.3;
液晶显示器。setCursor (0,0);
液晶显示器。打印(“ADC值:”);
lcd.print (analogVal);
液晶显示器。setCursor (0,1);
电压lcd.print(“:”);
lcd.print (inputVoltage);

结论

本课题对基于STM32蓝丸板的STM32F103C8T6单片机上的ADC工作进行了简单演示。

留下一个回复

您的电邮地址将不会公布。

Electronicshub图标
<\/i>","library":""}}" data-widget_type="nav-menu.default">
Baidu