ESE模块8 ADC 模拟数字转换器
对于嵌入式系统,捕获和处理模拟数据通常至关重要。PEC框架提供了一系列类和模板,可以轻松完成围绕模数转换器的各种任务。许多问题,包括捕获、处理模拟值,并随后执行某些操作,通过8位分辨率完全可以解决。因此,在这个例子中,我们首先只想周期性地捕获一个8位值,并通过UART发送到控制中心。其中的诀窍在于,8位值非常容易通过UART进行传输,因为UART以每8位的数据字发送数据。
在扩展练习中,我们将不直接发送值作为8位原始数据(二进制原始数据),而是将值转换为可读的字符(ASCII),并将其作为字符串发送到计算机。之前的UART练习可以作为参考。
任务
开发一个微控制器应用程序,其中将模拟电位器的模拟值数字化,并发送到计算机。
解决方案要求:
- UART 连接 A9/A10
- 数据传输速率19200 BAUD
- 8位ADC转换精度
- 引脚A7上的电位计或亮度传感器
准备工作
进行以下准备工作:
- 创建一个新的类图
- 目标语言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提供了PecAdcSingle和PecAdcChannel模块。
小型构建块PecAdcSingle完全可以满足要求。 我们不必在练习中“节省”,因此我们可以使用稍微更复杂的库模块PecAdcChannel。 这使我们能够在以后方便地捕获多个模拟通道。解决方案的系统和库组件设计图如下所示:
注意:控制器上的信号(电压)=最高达到电源电压!!!
实现
实现中应包括上述设计图中描述的元素。此外我们还必须分配控制器的专用资源。 在上一节UART中我们用了uart1portA9_stm32f0中的已知配置。 这次应该将ADC连接到PinA7。我们也可以使用其他引脚,但是引脚A7是最靠近板上的模拟输入设备。我们再查看一下参考卡。
引脚A7也是ADC通道7。我们已经有完成解决方案设计所需的所有信息。 下面是一个简短的总结:
- 系统模块控制器的基本结构
- 创建系统模块传感器和终端
- 将新的系统模块与控制器连接(聚合)
- 分配库块PecUart和PecAdcChannel(实现)
- 使用波特率19200和uart1portA9_stm32f0正确配置终端模块
- 使用adcResolution8bit和adc1ch07_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类中补充一个名为buffer的String类型属性。
更改onWork操作的代码,如下所示:
这段代码执行以下操作:
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
视频总结
练习
在练习中扩展应用程序,增加一个ErrorLED。当传感器值低于100时,ErrorLED应该点亮。