DE | EN | CN

ESE模块8 ADC 模拟数字转换器

对于嵌入式系统,捕获和处理模拟数据通常至关重要。PEC框架提供了一系列类和模板,可以轻松完成围绕模数转换器的各种任务。许多问题,包括捕获、处理模拟值,并随后执行某些操作,通过8位分辨率完全可以解决。因此,在这个例子中,我们首先只想周期性地捕获一个8位值,并通过UART发送到控制中心。其中的诀窍在于,8位值非常容易通过UART进行传输,因为UART以每8位的数据字发送数据。

在扩展练习中,我们将不直接发送值作为8位原始数据(二进制原始数据),而是将值转换为可读的字符(ASCII),并将其作为字符串发送到计算机。之前的UART练习可以作为参考。

开发一个微控制器应用程序,其中将模拟电位器的模拟值数字化,并发送到计算机。

解决方案要求:

  • UART 连接 A9/A10
  • 数据传输速率19200 BAUD
  • 8位ADC转换精度
  • 引脚A7上的电位计或亮度传感器

SRS ADC

进行以下准备工作:

  • 创建一个新的类图
  • 目标语言ARM C ++
  • 目标平台STM32F042 mySTM32板灯HAL
  • 为PEC应用程序(XMC,STM32,AVR)的下载图模板应用程序框架
  • STM32F0分配驱动程序包
  • (可选)stm32F042_48Mhz

如果我们将任务可视化,那就是使用微控制器记录来自模拟传感器(电位计/亮度传感器)的测量数据,并将其显示在PC上的终端程序中。以下系统组件就是我们解决方案的类模型。


STM32F042具有一个模数转换器ADC,其精度高达12位,最多有10个不同的通道Channel,采集时间为1微秒,用于采集模拟数据。 记录的模拟值电压范围介于电源电压的0V(GND)或ADC 3.3V(AVCC)的参考电压之间。

PEC框架为我们提供了PecUart模块,以及为ADC提供了PecAdcSinglePecAdcChannel模块。

小型构建块PecAdcSingle完全可以满足要求。 我们不必在练习中“节省”,因此我们可以使用稍微更复杂的库模块PecAdcChannel。 这使我们能够在以后方便地捕获多个模拟通道。解决方案的系统和库组件设计图如下所示:

注意:控制器上的信号(电压)=最高达到电源电压!!!

实现中应包括上述设计图中描述的元素。此外我们还必须分配控制器的专用资源。 在上一节UART中我们用了uart1portA9_stm32f0中的已知配置。 这次应该将ADC连接到PinA7。我们也可以使用其他引脚,但是引脚A7是最靠近板上的模拟输入设备。我们再查看一下参考卡。

引脚A7也是ADC通道7。我们已经有完成解决方案设计所需的所有信息。 下面是一个简短的总结:

  • 系统模块控制器的基本结构
  • 创建系统模块传感器终端
  • 将新的系统模块与控制器连接(聚合)
  • 分配库块PecUartPecAdcChannel(实现)
  • 使用波特率19200uart1portA9_stm32f0正确配置终端模块
  • 使用adcResolution8bitadc1ch07_stm32正确配置传感器模块

完成所有的类模型,清晰地排列元素。

周期性采集任务中所需的模拟值并发送到PC,我们在onWork操作中简化操作。 为我们能够跟踪值的变化,并确保在较短的等待时间内数据不会连续发送太快。

Controller::onWork():void
// continuous event from the Mainloop
uint8_t value;
value=sensor.getValue();
terminal.writeByte(value);
waitMs(10);

这段代码是一个连续事件,从主循环中触发。它执行以下操作:

1. value=sensor.getValue();:从传感器获取一个值,并将其存储在名为 value 的变量中。

2. terminal.writeByte(value);:将 value 变量的值作为一个字节写入到终端(或者串行接口)中。这意味着从传感器获取的值会被发送到与 UART(串行接口)连接的计算机。

3. waitMs(10);:等待 10 毫秒。这个语句是为了控制数据发送的速率,使其不要太快发送。

翻译程序。 将可执行程序传送到控制器的程序存储器中。

  • 1.创建(编译和链接)
  • 2.刻录
  • 3.将亮度传感器或电位计连接到引脚A7

启动ControlCenter,并设置COM端口。打开连接后,将视图切换到“ Oszi”。 可以通过Oszi视图的选项选择不同的显示变体。 现在可以在屏幕上跟踪到电位器的每次变更。

为了进行更精确的测量,需要提高ADC的分辨率。STM32F042可以将模拟值数字化为高达12位的分辨率。然而,现在12位的数据不能像以前那样简单地发送到ControlCenter以进行可视化。UART是面向字节的(8位)。如果要将数据组合成多个字节,则接收程序必须准确知道如何组合信息。简单的终端程序无法完成这项任务。一个相对方便的方法是将12位数据转换为文本,然后可以轻松在文本视图中跟踪这些值。请在Controller类中补充一个名为bufferString类型属性

更改onWork操作的代码,如下所示:

Controller::onWork:
uint16_t wert;
wert=sensor.getValue();
buffer.format("Adc=%d\n",wert);
terminal.writeString(buffer);
waitMs(1000);

这段代码执行以下操作:

1. wert=sensor.getValue();:从传感器获取一个值,并将其存储在名为 wert 的变量中。这个值是模拟传感器的读数,是一个16位的整数。

2. buffer.format(“Adc=%d\n”,wert);:将获取到的值格式化为一个字符串,并存储在名为 `buffer` 的字符串变量中。格式化的字符串是 “Adc=” 后跟 `wert` 变量的值,然后是换行符 `\n`。

3. terminal.writeString(buffer);:将存储在 `buffer` 中的字符串通过串行接口发送到终端或计算机。这样,模拟传感器的读数就可以在终端上进行查看。

4. waitMs(1000);:等待1000毫秒,即1秒钟。这个语句是为了控制数据发送的速率,使其不要太快发送。

翻译程序。 将可执行程序传送到控制器的程序存储器中。启动控制中心ControlCenter,记下COM端口的正确设置。激活连接后,将视图设置为文本 测试扩展应用程序并更改电位计的设置。

总结

  • 1.创建并打开类图
  • 2.选择用于PEC应用程序的图模板,为STM32F4加载并插入驱动程序包
  • 3.在资源管理器中搜索所需的类并将其拖到图中
  • 4.汇总类
  • 5.创建一个类的操作
  • 6. 创建类的操作
  • 7.创建一个类的属性
  • 8.将类和模板组装成组件
  • 9.在操作中创建必要的源代码
  • 10. 在类图中创建并刻录ARM应用程序,使用PecAdcChannel库块
  • 11.使用SiSy ControlCenter

视频总结

oder die schnelle Version ohne Sprachkommentare

练习

在练习中扩展应用程序,增加一个ErrorLED。当传感器值低于100时,ErrorLED应该点亮。

继续:

搜索关键词