您好!
现在我没有传感器集线器、但我等待我的、所以我想 问有多少值(波特率?) 如果我使用 TM4C1294和传感器集线器 Booster Pack 和 Tera Term、我可以从 MPU 9150的加速计接收一秒钟的时间。 我上次使用这些组件时知道、TeraTerm 中的波特率最高可达115 200、并且 acclerometer 范围为+/- 2g 到+-16G。 此外、我需要更改范围。
时间:)
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
现在我没有传感器集线器、但我等待我的、所以我想 问有多少值(波特率?) 如果我使用 TM4C1294和传感器集线器 Booster Pack 和 Tera Term、我可以从 MPU 9150的加速计接收一秒钟的时间。 我上次使用这些组件时知道、TeraTerm 中的波特率最高可达115 200、并且 acclerometer 范围为+/- 2g 到+-16G。 此外、我需要更改范围。
时间:)
请注意、400kHz 的使用(仅限)应用于 I2C 主器件的"SCL"时钟线-它远非有效的数据传输速率!
实际传输速率可能介于"一个和两个"数量级"之间(接近2个)-这会受到您在每个 I2C 数据传输期间采集的数据值的数量(和数据大小/位数)的极大影响...
您可能会注意到、"I2C"是一种"便利"(由于接口(2个连接)减少)-并且不会被识别为"设置任何土地速度记录-任何时候很快。" (海龟被发现"经过"I2C 控制的小型遥控车-通常在"高发球"汽车之后(我的道路上)!...)
CB1、您好、 现在我有自己的连接 launchpad 和传感器集线器、所以我继续进行测量。 MPU_9150的示例。 以下是 TeraTerm 的测量日志文件:
你(们)好。
我无法真正解释您的日志文件、因为没有用于定义/描述或使大量数据变得有序的标签。
以下是您的第一行数据在我这边的显示方式:
"0.323 0.244 9.765 0.030 0.020 0.018 10.500 -8.099 54.900 -1.163 1.859 36.384 0.949 0.014 0.012 0.312 0.356 0.190 9.807 0.029 0.019 0.018 9.600 "
请注意、公司/我都没有"传感器集线器"体验、因此我没有数据所代表的"期望"。 (当然、它是传感器数据-但是、"来自哪个传感器"-以及传感器的数据是什么、"到达时间?")
您正在寻求数据流优化-您已经(现在)演示了数据采集、但没有数据速率-也没有将数据附加到任何特定传感器。
您的数据(可能)有效吗? 您如何知道? 需要提供更多详细信息。 (魔鬼(总是) lurks -此类细节...)
您好 Bruno、
我在编译器方面遇到了一些问题、现在是5.2.9、没问题。
是的、我知道传感器具有一些功能。 我在 MATLAB 中看到、有 I2C 数据传输选项。 是的、我需要 MATLAB 中的浮点数、因为我想计算线性速度是否为积分(加速度)和位移(加速度的积分为2倍)。 现在、使用光传感器为每个数据发送时间戳、但使用 MPU 示例、测量开始时只有1个时间戳。 我的第一个协议怎么样? :D
DK 报告-它是否是微控制器的警告?
BTW 就是这种情况、其中配置了加速度的范围和频率- g_sMPU9150Inst.pui8Data[2]=(MPU9150_ACCEL_CONFIG_ACCEL_HPF_5Hz | MPU9150_ACCEL_CONFIG_AFS_SEL_2G);
在 MATLAB 中、串行端口的数据类型传输可以是 ASCII、二进制和 binblock。 它与 MATLAB 不是100%必须执行、我只需找到位移-如果可能、在这里移动传感器。
以下是 MATLAB 中的选项:
美好的一天!
[引用 user="bode Miller"]现在它是5.2.9,但没关系。
我不确定编译器版本、但我更喜欢使用 LTS 版本、因为我们承诺它们是长期支持。 当前使用16.9.3LTS 进行项目。
[引用 user="bode Miller"]我在 MATLAB 中看到有用于 I2C 数据传输的选项。[/quot]
很好、但在本例中它不会附加任何内容。 您的传感器连接到中间板、中间板通过串行端口连接到 PC (Matlab)。 从 Matlab 的角度来看、您的采集将是连续的。
我的意思是询问 Matlab 是否可以直接读取 IEEE float、即您可以将 float 串行字节直接发送到 Matlab 接收器。 我尝试的一个示例是一个简单的协议、其中每个封装都具有20字节的固定大小。 内容为:
偏移/格式/描述
0x00 / Int32 /计数器
0x04/浮点/ACCX
0x08/ float / ACCY
0x0C /浮点/ACCZ
0x10/float / light
稍后、我要添加一些标题、内容识别和 CRC、正如我们在这里的内部协议所具有的那样-但这将会起作用。
在 Matlab 中、您需要告诉它哪个字节意味着什么(必须有一种方法来配置这些偏移和格式)。 现在、您只需开始发送串行流。 由于传输丢失和 Matlab 不知道什么是字节0的风险太大、您可能需要添加一组固定的标头或终结器... MATLAB 文档可能会显示可行的选项。
关于计数器的一个注意事项:您很可能需要告诉 Matlab 关于小端字节序与大端字节序的信息、因为 ARM MCU 与 PC 相反。 这不会影响浮点值。
[引用 user="bode Miller"] DK 报告[/引用]
不、这意味着"DigiKey 说..." -在 DigiKey 中查找该传感器代码,它显示为过时。 没有什么技术方面的、也没有与 MCU 相关的!
[引用 user="bode Miller"] MPU9150_ACCEL_CONFIG_ACCEL_HPF_5Hz[/引用]
现在、我不查看传感器库文档、但该参数确实表明您的传感器每秒读数为5次、远远低于您的需求/预期。
我很高兴稍后能与大家分享进展情况。
谢谢
布鲁诺
我不确定是否可以制定协议...可能需要更多时间。
我通过以下方式将.c 程序的代码更改为仅 printf 加速 X Y Z:
UARTprintf ("%3d.%03d"、i32IPart[0]、i32FPart[0]);
UARTprintf ("%3d.%03d"、i32IPart[1]、i32FPart[1]);
UARTprintf ("%3d.%03d"、i32IPart[2]、i32FPart[2]);
我认为:
//accX ACCY accZ//=//accX ACCY accZ//=>/accX ACCY accZ//=>/accX ACCY accZ//=>/accX ACCY accZ//
我在 MATLAB 中读取了数据类型 ASCII 和数据格式%c、因此现在我有用于3轴加速计的数据、但它是字符格式。 我使用 MATLAB 中的函数 str2num 将此字符变为数字。 要为每个轴使用单个 var、我将获取矢量 accXYZ 的每一个第一/第二/第三个环。 那么、现在我有 accZ、我在这里 绘制了它的图:
我的 accZ 值为双精度型。
现在我需要时间变量。 也许我会尝试使用 MATLAB 计算时间、使用 C 可能会更灵活、但我认为使用 MATLAB 会更容易。 然而时间总是不够的,我不得不去,任何建议都是受欢迎的:)
祝你度过美好的一天:)
波特、
您实际上从传感器捕获的频率是多少?
以及如何控制发送到 PC 的消息的输出频率?
时间戳:现在不要过于复杂:只需为您的"时间"使用计数器、而不是实际时间。 假设 CPU 频率足够好。
换句话说,如果您想每秒发送1000个读数,则可以为 MeasureSend()函数配置一个计时器,使其每1000ms 中断一次。 在计时器 ISR 上、使用静态 uint32 msCounter、并将其作为第一个"列"添加到导出的读数中。 每次传输后递增 msCounter。 简单而实用。
回到"字符串"主题、再说一次、我尤其不喜欢这样做、因此我将再次尝试解释:
1) 1)以下是您为每个 AccZ 传输的内容、例如:"009.823\0"。 这是8字节的信息。
2) 2)现在、假设 MCU 上有一个包含传感器读数的浮点值。 存储器中的值为0x411D4FDF (仅4字节、因为它是浮点型)。 首先、传输相同信息所需的通信带宽是其两倍、但实际上会降低精度(无论之后测量的是什么、都将小数位数固定为3)。
3) 3)此外、您浪费了 ARM 处理:将值转换为两个单独的整数、使用 printf 将其转换为字符串。
4) 4)在接收端、您正在浪费 PC 处理:使用 str2num 将字符串值转换为双精度型。 PC 有一个双精度数(让我们实时处理、它是本机的)、您使用8个存储器字节来存储被字符串"损坏"的数字... 假设您有一个出色的传感器、其加速度为9.832345。 完成此传输后、您在 Matlab 中处理的所有数据都将为9.8320000000。
那么、这就是我所说的、您只能传输变量的实际浮点表示。 当您希望实现双集成时、这一点变得更加重要。 您将尝试从加速度读取位移-这会产生大量错误。 请妥善处理您的数字、您的结果将变得更好!
最坏的例子? 另一个轴上的加速度通常非常接近于零(对于层铺物体)。 一组正常的读数可能是000.0232553、000.0273323、如果"远远不是小数点"的振荡确实很重要、那么您将"破坏测量结果"进入0.023和0.027。。。
想要另一个示例? 上面的时间戳! 如果将其作为十六进制 uint32值进行传输、则可以4字节精确地发送4、000、000秒的大值。 作为一个字符串、您将需要发送7个字节(可能加上一个终止零)... 以及所有转换/解压计算。 高效? 不是。。。
现在、让生活变得更糟:我们了解到浮点值并非总是处理 MCU 中值的最有效方式、即使它们具有 FPU 单元也是如此。 在 Tivaware 库中、有一个有关 IQMath 的 PDF 文档-请看。 这是一种完全不同的策略、它允许以更高效的计算方式、更好的分辨率并仍然使用4字节-非常酷的数学算例、"预先定义"值的小数位数。 我不是说您现在应该了解这一点、但如果您要进行动态测量、双集成、传感器每秒需要大量读数、请将其列入您的未来研究列表。
享受并告知我们进度-感谢您发布第一张图表(尽管没有 x 轴信息、但还不意味着太多...)
布鲁诺
你好,Bruno!
我尝试打印 float 类型的数据、但无法打印。 之后、我读取了一些计时器、但可能也无法执行。
我想这是 IQmath.pdf
d1.amobbs.com/.../ourdev_582876DTQPBQ.pdf
感谢您的帮助!
您好、Bode、
[引用 user="bode Miller"]我尝试打印浮点类型数据,但无法打印。
您在哪里尝试打印它?
让我们更详细地了解一下这个主题、让我们获取"人"值9.80665 (以 m/s^2为单位的标准加速度)。 当您将其存储在 float 中时、4个字节将为 0x411CE80A。 我非常确信 Matlab 具有一些允许您接收此类值并在内部使用的功能。
如果您想了解一些有趣的"查看数字的字节"、请查看此转换器 :www.binaryconvert.com/convert_float.html
关于 Tiva 与 PC 的一件事:Tiva 中的标准大小为4字节。 因此、在 Tiva 代码中使用4字节变量将更加高效。 此外、这也是集成数字处理器使用的大小、因此 Tiva 中两个浮点值之间的计算"几乎像两个整数的总和一样简单...
在您的 PC 中、标准大小为8字节。 Matlab 执行的所有操作都是双精度型的。 我们的双精度数相同、即 0x40239D013A92A305 (仅用于说明)。
什么策略更高效? 您的第一个实数是在 Tiva 内获得的、并且鉴于您的传感器没有足够的精度来生成双精度、浮点数足够好-处理速度将更快。 有时、您需要将 float 转换为 double -在 Tiva 内部或 PC 内部。 在 Tiva 内部、它所花费的只是 valueDouble=(double) valueFloat;但这不明智的原因有两个:
1) 1)如果在传输到 PC 之前转换为8个字节、则通信层必须为该值传输8个字节、而不是4个字节。 不明智、对吧?
2) 2) PC 比 Tiva 强大得多、因此让它成为在这种转换过程中浪费能量的 PC!
结论:您只需找到 Matlab 一章、该章教您如何通过串行端口传输接收浮点值。
还有一个用于道路? 您是否尝试过 Octave? MATLAB 是大学和大公司的首选计划、主要是因为供应商在教育级别营销方面表现出色。 但对于小型企业来说、这种方法真的很昂贵。 倍频程应该是一种体面的开源替代方案、具有非常相似的接口和功能集。 我倾向于保护良好的付费软件-但在本例中、我仍然发现 ML 在投资方面过高。
至于您链接的 IQMath 自拍、是的、这是我所讨论的内容-但请注意、您的链接指向2010版本、而当前文档是从2017年2月开始的。 它位于 Tivaware 安装程序的/docs 文件夹中。 更明智地从电流源中学习。
此致
布鲁诺
[引用 user="bode Miller"]我不知道如何通过 UART 浮点数向 printf 编写 C 代码。 [/报价]
我不知道您用于将数组发送到 UART 的 API。
我们更喜欢使用 sprintf 生成文本数组、然后输出到所需的任何目标。 假设使用某种 UARTprint()函数,这将适用于上述特定问题:
字符串数组[64]; 浮点值= 9.80665f; sprintf (stringArray、"这是一个浮点:%010.6f"、值); UARTprint (UART0_BASE、stringArray);
它会将"This is a float:009.806650"发送到您的串行端口。
我不理解您上次提到 IQMath 的另一个部分...
[引用用户="Bruno Saraiva"]
Robert Adsett72.我已经发言,我支持我的发言。
为什么工程师在自己的设备上安装硬件浮点处理器??
[/报价]
布鲁诺,你对我没有说或不是说的事作出反应。 不应使用浮点、而是在接口中存在问题。
[引用用户="Bruno Saraiva">我不再争辩了。 我曾提到过占用较少内存、使用较少的处理能力以及更重要的是、使用较小的带宽来传输这些值。
对于接口、至少这些是错误的。 使用浮点、尤其是 printf 变体需要更多的内存、更多的处理能力和更多的带宽。 还有可重入性问题。 它确实需要较少的思考和设计。 是的、这甚至是与协处理器一起使用的。
我认为没有理由在该代码的处理部分中不使用浮点、但我认为在接口中避免使用浮点是有充分理由的。
Robert
通常、主代码中存在一些浮点问题、但它们是接口的次要问题。 协处理器或多或少地成功解决了性能问题。 适当的库将处理可重入性。 中断开销(和任务切换)仍然是一个潜在的问题、但如果提前考虑的话、它是可以管理的。 更细微的是数字问题、如灾难性减法和浮点提供的较低精度。
[引用用户="Robert Adsett"]布鲁诺,你对我没有说或不是说的事作出反应。
嗨、Robert -不用担心!
我的反应是坦率的:"这个项目的整数可能更好。"
我一直在关注原始任务:读取传感器并将值发送到 PC 以实现 Matlab 可视化、而现在您正在关注通过终端的值的可视输出。
当然、它们有两个完全不同的东西-我看到海报想要在终端上看到价值的唯一原因是调试... 否则、他应该"查看 Matlab 中已经存在的数字"。
谢谢!
布鲁诺