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.
您好!
您能否与我分享用于连接 PGA460-Q1的 Arduino 源代码。我已经使用 PGA460-Q1驱动器 IC 和 Murata 传感器设计和开发了超声波传感器模块。我想将此传感器与 Arduino uno 集成以获取距离信息。请为此提供合适的源代码
谢谢、此致
Sreejith S V
Sreenejith、您好!
对于 PGA460软件开发、我建议您从 PGA460软件开发指南 和 PGA460 Energia 库和代码示例 下载开始。 这些示例将帮助指导您了解 Energia 和 Arduino 微控制器套件的 USART (UART 和 SPI)特定示例。
有关 USART 数据包的一般结构的信息、请参考 数据表中的"7.3.6.2.1 USART 异步模式"部分: http://www.ti.com/lit/ds/symlink/pga460-q1.pdf。 请注意 UART 配置的非默认2停止位要求。
感谢 Akeem 的快速响应。我们将仔细查看这些文档、如果需要任何支持、请与您联系。
谢谢、此致
Sreejith
我刚刚浏览了文档、尝试使用 Arduino id 编译代码、遇到了很多错误。我解决 了大部分错误、但仍然存在一些与库函数相关的错误。您可以向我分享适用于 Arduino IDE 和 Arduino 控制器的修改后代码。我的实际代码 目标是使用 Arduino 通过单线通信从传感器获取距离数据。传感器板已准备好使用 pga460和 Murata 传感器。
我刚刚浏览了文档、尝试使用 Arduino id 编译代码、遇到了很多错误。我解决 了大部分错误、但仍然存在一些与库函数相关的错误。您可以向我分享适用于 Arduino IDE 和 Arduino 控制器的修改后代码。我的实际代码 目标是使用 Arduino 通过单线通信从传感器获取距离数据。传感器板已准备好使用 pga460 和 Murata 传感器。
Sreenejith、您好!
Arduino Uno 是否支持 Serial1? 该代码使用两个串行端口:一个用于与 PC 的串行通信、另一个用于与 PGA460的串行/UART 通信。
要使 PGA460 Energia 库在 Arduino Mega 中运行、请执行以下操作:
1) 1)从 PGA460EnergiaLibrary_vx.x.x 库文件夹中删除以下内容:"PGA460_SPI.CPP"、"PGA460_SPI.h"、"utility"文件夹。 PGA460的 SPI 功能专为 MSP430F5529微控制器定制。 SPI 支持仅通过 Energia 启用、目前不支持 Arduino。
2) 2)替换 #include 的所有实例 添加到 #include 在库文件中(PGA40_USSC.h/.cpp)
3) 3)在所有文件中、将"PUSH2"、"GREEND_LED"、"RED_LED"的任何引用更改为 Arduino 引脚编号。 这些指示符特定于 LaunchPad 的 Energia.h 文件。
4) 4)从 PGA460_USSC.CPP 中的 initBoostXLPGA460函数中删除案例3。
尊敬的 Akeem:
感谢您的回复。我已经通过研究代码并为 Arduino IDE 进行了修改来解决了问题。已成功为 Arduino Mega 编译。我的传感器 PCB 制造正在进行中、组装后将使用 Arduino Mega 和传感器板测试此代码。将让您发布状态。
我能否使用相同的代码连接多个传感器?多个传感器接口的接口是什么?
我的假设是通过更改地址、我们可以使用一根导线接口连接多个传感器。为此、我需要在 Arduino 串行和传感器板之间连接串行至单线收发器芯片、并将所有传感器板 IO 线路连接到收发器输出?是这样的、请告诉我
谢谢
Sreejith
Sreenejith、您好!
PGA460提供四种不同的接口:UART、SPI、OWU 和 TCI
OWU 和 TCI 是以高电平电池为基准的汽车接口。 在这种情况下、您将需要一个收发器从 VPWR (即12V)电平转换为5V 以实现逻辑高电平。如果您的应用不是汽车应用、我建议您使用 UART 或 SPI、这样您就可以直接将 PGA460连接到 Arduino、而无需收发器。 不管怎样、UART/SPI 更易于使用。
由于 PGA460具有三位软件地址(UART_ADDR)、因此在同一 UART 或 SPI 总线上最多可以有八个 PGA460s。 有关自动寻址的详细信息、请参阅 PGA460常见问题解答#4.4.11 (www.ti.com/.../slaa733):
4.4.11 PGA460是否支持菊花链? 主控制器能否自动区分 PGA460 UART 地址并对其进行编程? PGA460不支持菊花链自动寻址和自动从节点位置检测(SNPD)。 外部硬件或开关必须与外部主控制器结合使用、以便自动为连接到同一总线的多个 PGA460器件分配地址。 提供的示例可互换 IO 和 TX 引脚。 切换 IO 时、请务必选择额定电压为 VPWR (高达30V)的双向开关。 TX 引脚是一个单向引脚、额定电压为3.3V (默认值)或5.0V
尊敬的 Akeem:
我已经解决了问题、并从传感器获取物体距离数据。以下是问题
1)我使用的是5V 微控制器、因此需要将100k 上拉电阻连接到5V
2) 2) Arduino 中所需的 UART 通信端口为 TX1和 RX1
3)需要启用温度补偿寄存器位、否则请移除 MOSFET 并将接地端连接 到变压器次级引脚4
您能给我建议 一下我的硬件所需的实际配置以及红色标记配置的含义。我正在使用 Murata MA58MF14-7N 传感器
通信模式:0=UART,1=TCI,2=OneWireUART... 0
UART kBaud:0=9.6、1=19.2、2=38.4、3=57.6、4=74.8、 5=115.2...0
P1和 P2阈值:0=%25、1=50%或2=75%的最大值... ?
4.传感器设置:0=Murata MA58MF14-7N,1=Murata MA40H1SR,x=Skip... 0
TVG 范围:0=32-64dB、1=46-78dB、2=52-84dB 或3=58-90dB、x=Skip...?
6.固定 TVG 电平:0=%25、1=50%或2=75%最大值、x=Skip... ?
7.最小距离= 0.1m *字节... ?
8.运行系统诊断程序?:0=No,1=Yes... 0
9.回波数据转储:0=无、1=P1BL、2=P2BL、3=P1LO、4=P2LO、… ?
正在刻录用户 EEPROM?:0=否,1=是... ?
11.命令周期延迟:10ms *字节... ?
12.要检测的对象数(1-8)=字节... 1
13. PGA460的 UART 地址(0-7)=字节... 0
此致
Sreejith
器件型号:PGA460
你(们)好
我还会在有物体或没有物体的情况下获得相同的超声波读数。打开和关闭电源有时会给出不同的测量值。 请为此提供合适的解决方案。
我使用 Arduino MEGA 2560和 Murata MA58MF14-7N 换能器。
此致
Sreejith
Sreenejith、您好!
为了帮助调试您的问题、请提供:
在下电上电之前和之后发送这些项目。
Sreejith、
您标记为红色的项目可描述如下(从 PGA460 Energia 库和代码示例 下载的 PGA460_USSC.cpp 文件中)。
如果您没有从 EVM-GUI 评估中预先确定的 PGA460 EEPROM 寄存器值、请使用阈值和 TVG 设置的中间代码值作为起点。
项目3:
/*----------------- initThresholds ----
|函数 initThresholds
|
|目的:更新两个预设的阈值映射、并执行批量阈值写入
|
|参数:
| THR (IN)--根据最大电平的特定百分比将所有阈值电平更新为固定电平。
|所有时间均为中码(1.4ms 间隔)。
|修改现有的条件语句,或附加其他条件语句以进行自定义用户阈值配置。
|•0 = 25%、第64级、共255个
|•1 = 50%、第128级、共255个
|•2 = 75%级别192、共255个
|
|返回:无
******-------------------------------------------------------------------------------------------- *
项目#5&6:
/*----------------- initTVG --
|函数 initTVG
|
|目的:更新时变增益(TVG)范围和映射、并执行大容量 TVG 写入
|
|参数:
| AGR (IN)--更新 TVG 的模拟增益范围。
|•0 = 32-64dB
|•1 = 46-78dB
|•2 = 52-84dB
|•3 = 58-90dB
| TVG (IN)--根据最大电平的特定百分比将所有 TVG 电平更新为固定电平。
|所有时间均为中码(2.4ms 间隔)。
|修改现有的案例语句、或为自定义用户 TVG 配置附加其他案例语句
|•0 =范围的25%
|•1 = 50%的范围级别
|•2 = 75%级别的范围
|
|返回:无
******-------------------------------------------------------------------------------------------- *
项目7:
Energia 程序将忽略以10cm 为增量读取的小于最小距离值的任何物体。 设置为"0"以禁用此主控制器极短距离屏蔽。 这是在突发和/或衰减特征触发阈值捕获时实施的。
项目9:
/*----------------- runEchoDataDump ----
|函数 runEchoDataDump
|
|用途:运行预设1或2突发和/或监听命令以捕获128字节的回波数据转储。
|切换回波数据转储使能位以启用/禁用回波数据转储模式。
|
|参数:
| PRESET (IN)--确定运行哪个预置命令:
|•0 =预设1突发+监听命令
|•1 =预设2突发+监听命令
|•2 =预设1仅监听命令
|•3 =预设2仅监听命令
|•17 =预设1突发+监听广播命令
|•18 =预设2突发+监听广播命令
|•19 =预设1仅监听广播命令
|•20 =预设2仅监听广播命令
|
|返回:无
******-------------------------------------------------------------------------------------------- *
项目#10:
/*----------------- BurrnEEPROM ----
|函数 BurnEEPROM
|
|目的:烧写 EEPROM 以在加电后将工作/影子寄存器值保存到 EEPROM
|循环使用 PGA460器件。 返回 EE_PGRM_OK 位以确定 EEPROM 烧写是否成功。
|
|参数:
|无
|
|返回:EEPROM 程序成功的 bool 表示
******-------------------------------------------------------------------------------------------- *
项目11:
在主控制器上循环 Energia 程序时、每个突发/监听命令之间的时间量。 可在10ms 乘法器的延迟间隔内设置。
感谢 Akeem 为您提供了详细的说明。现在我收到的是物体距离、它随各种配置设置而变化。
但现在的问题是 ,无论是否存在物体,我都能获得相同的超声波读数。打开和关闭电源有时会给出不同的测量值。 请为此提供合适的解决方案。
请找到以下示例对象检测结果和配置设置。
配置
1.Communication 模式:0=UART、1=TCI、2=OneWireUART ... 0
UART kBaud:0=9.6、1=19.2、2=38.4、3=57.6、4=74.8、 5=115.2...1.
P1和 P2阈值:0=%25、1=50%或2=75%的最大值... 0
4.传感器设置:0=Murata MA58MF14-7N,1=Murata MA40H1SR,x=Skip... 0
TVG 范围:0=32-64dB、1=46-78dB、2=52-84dB 或3=58-90dB、x=Skip... 2.
6.固定 TVG 电平:0=%25、1=50%或2=75%最大值、x=Skip... 1
7.最小距离= 0.1m *字节... 1
8.运行系统诊断程序?:0=No,1=Yes... 1
9.回波数据转储:0=无、1=P1BL、2=P2BL、3=P1LO、4=P2LO、… 0
正在刻录用户 EEPROM?:0=否,1=是... 0
11.命令周期延迟:10ms *字节... 5.
12.要检测的对象数(1-8)=字节... 8.
13. PGA460的 UART 地址(0-7)=字节... 0
初始结果
P1对象1距离(m):8.90
P1对象2距离(m):1.00
P1对象3距离(m):10.49
P1对象4距离(m):7.50
P1对象5距离(m):11.14
P1对象6距离(m):9.56
P1对象7距离(m):10.50
P1对象8距离(m):0.90
一个下电上电后的结果
P1对象1距离(m):9.61
P1对象2距离(m):2.40
P1对象3距离(m):10.48
P1对象4距离(m):7.67
P1对象5距离(m):11.14
P1对象6距离(m):9.56
P1对象7距离(m):10.50
P1对象8距离(m):0.90
此致
Sreejith
尊敬的 Akeem:
感谢您的回复。请告诉我如何获取这些值(EEPROM 寄存器和回显数据转储)、因为我使用 Arduino Mega 和 Arduino IDE 来运行主代码并在串行监视器上仅获取距离信息。
此致
Sreejith
谢谢 Akeem。
现在、问题总是得到相同的值、直到每个电源打开/关闭周期和 EEPROM 写入显示始终失败
此致
Sreejith
Sreejith、
每次捕获时、您尝试检测多少个对象? 您正在打印 PGA460可以报告的最大对象数、即8。 无论如何、结果无效、因为单次捕获中的多个对象的距离值应始终为升序。
您的结果如下:
初始结果 | 一个下电上电后的结果 |
P1对象1距离(m):8.90 |
P1对象1距离(m):9.61 |
输出的正确表示应显示为:
初始结果 |
P1对象1距离(m):0.90 P1对象2距离(m): 1.00 P1对象3距离(m):7.50 P1对象4距离(m):8.00 P1对象5距离(m):8.90 P1对象6距离(m):9.56 P1对象7距离(m):10.49 P1对象8距离(m):10.50 |
需要检查的几件事:
感谢 Akeem 的回复。请找到以下结果
结果,在像这样更改库代码后
案例0://Obj1距离(m)
{
objDist =(ultraMeasResult[1]<8)+ ultraMeasResult[2];
objReturn=objDisist;//跳过 ToF 进行距离转换//(objDist/2*0.000001*speedSound)- digitalDelay;
中断;
}
9.回波数据转储:0=无、1=P1BL、2=P2BL、3=P1LO、4=P2LO、… 2.
正在刻录用户 EEPROM?:0=否,1=是... 0
11.命令周期延迟:10ms *字节... 5.
12.要检测的对象数(1-8)=字节... 8.
13. PGA460的 UART 地址(0-7)=字节... 0
使用所选设置配置 PGA460。 等待...
系统诊断-频率(kHz):16.81
系统诊断-衰减周期(us):1232.00
系统诊断-芯片温度(C):-30.00
系统诊断-噪音级别:71.00
正在检索回波数据转储配置文件。 等待...
255,220,55,61,183,246,63,191,191,191,191,191,191,191,191,191,191,191,191,191,187,87,87,61,183,243,251,48,247,187,187,83,166,1986,208,541,131,192,182,182,182,137,182,137,192,572,152,146,192,152,142,182,182,182,182,192,182,192,152,51,51,51,51,51,192,192,182,182,192,182,192,192,182,182,192,192,186,193,193,196,196,193,192,182,192,182,182,182,192,182,192,186,196,193,192,192,182,182,192,192,192,186,196,193,192,192,182,182,182,182,192,182,182,182,192,182,192,182,192,182,182,192,182,182,182,192,182,18
P1对象2距离(m):1.41
P1对象6距离(m):7.48
P1对象7距离(m):1.41
P1对象8距离(m):7.01
P1对象2距离(m):1.41
P1对象6距离(m):7.48
P1对象7距离(m):1.41
P1对象8距离(m):7.01
P1对象2距离(m):1.41
P1对象6距离(m):7.48
P1对象7距离(m):1.41
9.回波数据转储:0=无、1=P1BL、2=P2BL、3=P1LO、4=P2LO、… 2.
正在刻录用户 EEPROM?:0=否,1=是... 0
11.命令周期延迟:10ms *字节... 5.
12.要检测的对象数(1-8)=字节... 8.
13. PGA460的 UART 地址(0-7)=字节... 0
使用所选设置配置 PGA460。 等待...
系统诊断-频率(kHz):16.81
系统诊断-衰减周期(us):1232.00
系统诊断-芯片温度(C):-30.00
系统诊断-噪音级别:77.00
正在检索回波数据转储配置文件。 等待...
255,220,55,61,183,246,63,191,191,191,191,191,191,191,191,191,191,191,191,191,187,87,87,61,183,243,251,48,247,187,187,187,83,166,185,186,192,187,182,186,192,186,71,262,152,176,192,152,152,146,192,152,152,146,196,192,146,192,152,152,152,146,192,152,152,146,192,146,192,152,146,192,152,146,192,152,152,146,192,146,192,152,146,192,146,192,152,146,192,152,152,146,192,152,152,146,192,146,192,146,192,146,192,146,192,146,192,152,146,192,152,146,192,146,192,146,192,146,192,146,192,146,192,146,192,146,192,14
P1对象1距离(m):5.98
P1对象2距离(m):1.41
P1对象6距离(m):7.48
P1对象7距离(m):1.41
P1对象8距离(m):7.01
P1对象1距离(m):5.98
P1对象2距离(m):1.41
P1对象6距离(m):7.48
无传感器,结果
9.回波数据转储:0=无、1=P1BL、2=P2BL、3=P1LO、4=P2LO、… 2.
正在刻录用户 EEPROM?:0=否,1=是... 0
11.命令周期延迟:10ms *字节... 5.
12.要检测的对象数(1-8)=字节... 8.
13. PGA460的 UART 地址(0-7)=字节... 0
使用所选设置配置 PGA460。 等待...
系统诊断-频率(kHz):16.81
系统诊断-衰减周期(us):1232.00
系统诊断-芯片温度(C):-30.00
系统诊断-噪音级别:70.00
正在检索回波数据转储配置文件。 等待...
255,220,55,61,183,246,63,191,191,191,191,191,191,191,191,191,191,191,191,191,187,87,87,61,183,243,251,48,247,187,187,187,83,166,186,186,196,206,192,182,182,187,187,187,187,186,72,136,196,196,196,203,262,152,152,152,152,152,146,196,196,203,196,246,196,196,246,196,193,262,152,152,146,196,196,196,246,196,192,152,152,146,196,196,192,152,152,152,146,196,246,196,192,152,152,146,196,196,192,152,146,196,246,196,192,152,152,152,146,192,146,192,146,196,192,152,146,192,152,146,196,196,192,152,152,152,152,14
P1对象1距离(m):5.98
P1对象2距离(m):1.41
P1对象6距离(m):7.48
P1对象7距离(m):1.41
P1对象8距离(m):7.01
P1对象1距离(m):5.98
P1对象2距离(m):1.41
在一个电源循环结果之后(无传感器)
P1对象1距离(m):8.90
P1对象2距离(m):0.91
P1对象3距离(m):10.49
P1对象4距离(m):7.50
P1对象5距离(m):11.14
P1对象6距离(m):10.96
P1对象7距离(m):10.42
P1对象8距离(m):0.29
此致
Sreejith
更改8个对象的库代码后、接收到以下结果
正在检索回波数据转储配置文件。 等待...
255,220,55,61,183,246,63,191,191,191,191,191,191,191,191,191,191,191,191,191,187,87,87,61,183,243,251,48,247,187,187,83,166,1982,271,182,182,182,182,137,246,192,572,152,146,246,192,152,246,192,152,146,246,192,152,146,246,192,172,146,192,152,146,192,172,146,192,146,192,146,192,146,192,146,192,241,246,192,152,146,192,146,192,146,192,146,192,146,192,146,192,146,192,152,146,192,146,192,146,192,146,192,146,192,146,192,146,192,146,241,241,246,192,146,192,152,152,146,192,152,146,192,146,192,152,146,192,14
读取测量结果时出错...读取测量结果时出错...读取测量结果时出错...无对象...
读取测量结果时出错...读取测量结果时出错...读取测量结果时出错...无对象...
尊敬的 Akeem:
请根据上述结果通知我、并帮助我发布超声波传感器模块的测试版。
您能告诉我您的空闲情况、以及方便通话的时间来讨论和解决我的传感器初始 PoC 版本的问题吗?
此致
Sreejith
正在等待您的回复。
此致
Sreejith
Sreenejith、您好!
我推荐的调试方法是使用数字逻辑分析仪首先捕获物理 UART TXD 和 RXD 信号、以确保 Arduino 正确传输预期的 UART 数据包、并验证器件是否正确响应数据。 您的结果都不正确、这会导致我相信所捕获的 UART 元件阵列存在一些偏移、或者您的 UART 端口未在 Arduino 上正确配置。
下面是一个实现原始 UART 命令的示例、而不是使用 PGA460 Energia 库函数。 尝试运行此示例、通过探测传感器的正极端子来检查是否有突发激励、从而确定 PGA460是否正在接收主发送的命令。 请注意、该准系统代码尚未包含命令5响应的终端捕获(超声波测量结果)、但允许您探测 UART TXD 和 RXD 引脚以确定是否存在有效的器件响应(通过逻辑分析仪/示波器):
//注:用于向 PGA460发送突发/监听命令的裸机原始 UART 演示 // cmd 0 - P1突发监听 字节 buf0[4]={0x55、0x00、0x01、0xFE}; // cmd 1 - P2突发监听 字节 buf1[4]={0x55、0x01、0x01、0xFD}; /cmd 5 -超声波测量(假设 UART_ADDR=0) 字节 buf5[4]={0x55、0x05、0xFA}; /cmd 10 -寄存器写入时间的十倍到4.096ms 字节 buf10[5]={0x55、0x0A、0x26、0x00、0xCF}; /cmd 17 -广播 P1突发监听 字节 buf17[4]={0x55、0x11、0x01、0xED}; /cmd 19 -广播 P1只监听 字节 buf19[4]={0x55、0x13、0x01、0xEB}; /cmd 25 -广播批量阈值写入 字节 buf25[35]={0x55、0x88、0x88、0x88、0x88、0x88 0x88、0x88、0x88、0x84、0x21、 0x08、0x42、0x10、0x80、0x80、 0x80、0x80、0x00、0x88、0x88、 0x88、0x88、0x88、0x88、0x84、 0x21、0x08、0x42、0x10、0x80、 0x80、0x80、0x80、0x00、0x7C}; const int buttonPin = PUSH2; //按钮引脚 const int ledPin 的编号= RED_LED; // LED 引脚 的编号 int buttonState = 0; //用于读取按钮状态 void setup()的变量{pinMode (ledPin,输出); pinMode (buttonPin,input_pullup); delay (1000); //将设置代码放在此处,运行一次: Serial1.begin(19200);//初始化 PGA460 UART 串行通道 延迟(1000); //假设 UART_ADDR=0 //批量阈值写入中间代码值以清除 THR_CRC_ERR 4.01.write (buf25、sizeof (buf25)); delay (100); //[TODO ]将 rec P1设置为4.096ms //将 UART_ADDR=0的时间去耦到4.096ms Serial1.write (buf10、sizeof (buf10)); delay (100); } void loop (){ //将主代码放在此处,重复运行: //检查是否按下按钮。 while (digitalRead (buttonPin)== HIGH){} //广播 P1突发+监听(不依赖于 UART_ADDR) SERIAL1.write (buf17、sizeof (buf17)); //延迟100ms 延迟(100); //[TODO ]在终端上打印超声波测量结果 //从 UART_ADDR=0读回超声波测量结果 SERIAL1.write (buf5、sizeof (buf5)); //切换红色 LED digitalWrite (ledPin、!(digitalRead (ledPin)));//打开 LED (高电平表示电压电平) //每秒重复循环 延迟(1000); }
谢谢 Akeem。
将按照建议进行调试,并让您更新结果
此致
Sreejith
Sreejith、
感谢您探测 XDCR+和 UART 信号。 这就证实了器件会使传感器发生突发、并且通信是完整的。 我看到的唯一问题是蓝色 UART 波形(我假设这是 PGA460-TXD 引脚)在某些点处于低电平空闲状态。 我建议您在 PGA460-TXD 引脚上添加一个弱上拉电阻器(10k Ω 或22k Ω)、以确保该引脚始终处于高电平空闲状态。 这可能会解释您收到的某些数据无法正确转换的原因。
在典型的 UART 系统中、从器件应在 TXD 引脚上保持高电平空闲;然而、PGA460在 TXD 和 RXD 引脚上同时具有 SPI 和 UART 功能、因此默认情况下处于三态、因此您应尝试添加外部电阻器上拉电阻器。 您还可以尝试将主控制器的 UART-RXD 引脚配置为具有上拉电阻的输入、以实现类似的结果。
出色的 Akeem。现在传感器正在工作。我在主 RX 侧放置了10k 上拉电阻。我仍在使用 此传感器以实现远距离和多个物体。如果 需要、将允许您更新并请求支持
非常感谢 Akeem。
此致
Sreejith
您好、Akeem
我无法获得大于1m 的物体距离。 我尝试了几个选项、但仍能达到1m。请建议我这样做
此致
Sreejith
Sreejith、
向我发送一份存储器映射配置副本(批量 EEPROM 读取- UART 命令11)、以及当对象处于30cm、50cm 和1m 时回波数据转储的三个输出(UART 命令7)。 这将有助于我了解为何无法检测1m 以外的物体。