ESE模块13 I2C 总线
本章节的学习需要一个温度传感器插件Temperatursensor Add-On也是mySTM32 Board Light板的扩展。
现场总线系统在许多微控制器应用中起着重要作用。一方面,这些数字通信通道使智能传感器和执行器成为可能,另一方面,它允许开发人员使用引脚数量相对较少的控制器,并因此保持占用空间较小。I²CI²C Bus 总线支持高数据传输速率,即使在标准模式下,也可以在一个总线上寻址超过100个设备。I²C总线仅需要两根导线,即控制器上的两个引脚。有数千种I²C设备tausende I²C Devices ,涵盖了广泛的应用领域。事实上,几乎每个现代微控制器系列都支持此标准。I²C最初是由飞利浦公司用于设备内部通信,例如电视内部通信而开发的。因此,可以推断出该总线系统并非用于长距离传输,而是设计用于几厘米到几米的距离。在接下来的章节中,您将了解另一种现场总线系统,即CAN总线,该总线可以可靠地传输最少40米,根据特定条件甚至可以达到500米的数据。即使在小型的mySTM32 Board light上,您也会找到这种总线。
任务
准备工作
如果有一个类图已打开,请在该图的上下文菜单(鼠标右键)中选择菜单项“上”。 如果该项目已关闭,请重新打开SiSy UML项目。 进行以下准备工作:
- 创建一个新的类图
- 目标语言 ARM C++
- 目标平台STM32F042 mySTM32板灯HAL
- 为PEC的应用模板(XMC,STM32,AVR)加载应用程序的基本结构
- 为STM32F0分配驱动程序包
- (可选)分配模板stm32F042_48Mhz
解决路径
任务是通过I²C总线读取数字温度传感器,然后通过UART将数据发送到PC终端。可以得出用于系统架构设计的专业系统模块。
除其他I²C设备外,还有用于LM75温度传感器Temperatursensor LM75相应的库模块。以下摘自PEC库的类模型,显示了PecLm75块与相应的I²C总线组件PecI2cBus之间的关系。
对于应用在这些构建块中的两项操作对我们很重要。可以使用getTemp()操作读取整数温度(来自传感器的温度数据转换为整数)。传感器本身以0.125°C(第8度)的步长传递温度。此外现代微控制器可以具有多个I²C总线接口。因此必须将设备及其地址分配给特定总线。这是通过操作connect(…)完成的,有两种选择,操作connect(…)可以在设备中或总线中。
可以从学到的知识中得出以下所需的微控制器解决方案的设计图:
用简单的语言,解释设计图:
- 控制器Controller是stm32F042_48MHz
- 控制器Controller有SensorBus
- SensorBus 是一个PecI2CBus
- Controller控制器有一个终端 Terminal
- Terminal 终端是PecUart
具体资源的分配必须在实施中进行。
注意:为BUS = DEVICE分配地址
实现
实现应包括上述设计图中描述的元素。 此外还必须分配控制器的专用资源。 完成类模型与下图匹配,清晰地排列元素。
首先必须建立与总线的连接并分配设备地址。 一条总线最多可寻址8个LM75。 附加组件上有一个跳线,用于配置设备地址。确保地址跳线位于附加组件上,
如下所示(全部设置为0 = 0x90):
在Controller类的onStart()操作中输入以下代码:
Controller::onStart():voidsensorBus.connect(sensorBus.temperaturSensor,0x90);
数字传感器的当前温度以API级别读出,类似于模拟传感器API-Ebene 的过程。请注意,温度传感器相对较慢。 使用小的等待例程,以便于跟踪终端上的数据。
在Controller类的onWork()操作中写下以下代码:
Controller::onWork():voidtemperatur=sensorBus.temperaturSensor.getTemp(); terminal.writeByte(temperatur); waitMs(10);
这段代码是一个名为 `Controller` 的类中的 `onWork()` 方法。
1. temperatur=sensorBus.temperaturSensor.getTemp();: 这一行代码调用了 `sensorBus` 对象的 `temperaturSensor` 成员的 `getTemp()` 方法,用于获取温度传感器的温度值,并将其存储在名为 `temperatur` 的变量中。
2. terminal.writeByte(temperatur);: 这一行代码调用了名为 `terminal` 的对象的 `writeByte()` 方法,将温度值以字节的形式写入终端或其他输出设备。
3. waitMs(10);: 这一行代码使程序等待10毫秒,可能是为了等待下一个周期的工作开始。
总的来说,这段代码的作用是在 `Controller` 类的 `onWork()` 方法中获取温度传感器的温度值,并将其写入终端或其他输出设备中,然后等待10毫秒,是为了控制程序的执行速度或与其他操作同步。现在可以创建和测试该应用程序。
测试
翻译程序。将可执行程序传送到控制器的程序存储器中。
- 1. 创建(编译和链接)
- 2. 烧录
- 3. 将温度传感器附件连接到mySTM32 Board灯
- 4. 注意地址跳线的正确位置
- 5. 使用适当的跳线激活上拉电阻
- 6. 注意SiSy ControlCenter中的设置
变体
更改应用程序,以便将原始传感器数据(原始值)发送到PC。 为了提高可读性,请将10位原始数据转换为文本。 更改类Controller中onWork()的操作代码:
Controller::onWork():voiduint16_t temp; temp=sensorBus.temperaturSensor.getRawValue(); String txt; txt.format("\nRawValue=%d",temp); terminal.writeString(txt); waitMs(100);
这段代码是一个名为 `Controller` 的类中的 `onWork()` 方法。
1. uint16_t temp;: 声明一个名为 `temp` 的16位无符号整数变量,用于存储从传感器获取的原始值。
2. temp=sensorBus.temperaturSensor.getRawValue();: 调用了 `sensorBus` 对象的 `temperaturSensor` 成员的 `getRawValue()` 方法,用于获取温度传感器的原始值,并将其存储在名为 `temp` 的变量中。
3. String txt;: 声明一个名为 `txt` 的字符串对象,用于存储格式化后的文本输出。
4. txt.format(“\nRawValue=%d”,temp);: 使用格式化字符串将原始值格式化为字符串,并存储在 `txt` 中,格式为 “\nRawValue=原始值”。`\n` 表示换行符。
5. terminal.writeString(txt);: 调用了名为 `terminal` 的对象的 `writeString()` 方法,将格式化后的文本 `txt` 写入终端或其他输出设备中。
6. waitMs(100);: 这一行代码使程序等待100毫秒,是为了控制程序的执行速度或与其他操作同步。
总的来说,这段代码的作用是在 `Controller` 类的 `onWork()` 方法中获取温度传感器的原始值,并将其写入终端或其他输出设备中,然后等待100毫秒。
创建,传输和测试应用程序, 比较俩种方式。
视频总结
- 1.创建并打开类图
- 2.选择PEC应用程序的图模板
- 3.加载正确的驱动程序包
- 4.在资源管理器中找到所需的块并将其拖到图中
- 5.聚合类,构成组件
- 6.在操作中创建必要的源代码
- 7.在类图中创建并烧录ARM应用程序
练习 11
使用液晶显示屏显示传感器数据!