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:连接 PGA460Q-1与 Arduino

Guru**** 2037690 points
Other Parts Discussed in Thread: PGA460-Q1, PGA460
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/636944/pga460-q1-interfacing-pga460q-1-with-arduino

器件型号:PGA460-Q1
Thread 中讨论的其他器件: PGA460

大家好,

我正在使用 PGA460-Q1连接 Arduino - UNO。 I'hv 根据 TI 提供的数据表和软件开发指南准备了一个命令序列。 但是、我无法与 PGA460-Q1进行通信。

我尝试了以下方法:

在 PULSE_P1寄存器中、IO_IF_SEL 设置为0且 IO_DIS = 0。 UART 地址设置为0 (默认值)

CLK 引脚接地以启用 UART 模式

根据随附的流程图和软件代码传输了命令序列。 Arduino 传输的命令在存储示波器上读取并找到正确的命令。 但是、PGA460-Q1的 Tx 引脚没有响应。

如果命令序列/代码有任何问题/需要对代码进行进一步修改、您能提供反馈吗?

我想首先使用 UART 建立通信。 TCI 尚未使用。

注:-正在使用 EEPROM 出厂设置。

请尽快回复,提供有价值的信息!!!

谢谢和问候!!

Arduino 代码

//此代码取自 TI 网站上提供的软件开发指南。 进行了修改、以简化操作、无需使用与 EEPROM 相关的命令、因为会考虑 EEPROM 出厂默认值。

// P1和 P2阈值
#define P1_THR_0 0xB0
#define P1_THR_1 0x88
#define P1_THR_2 0x88
#define P1_THR_3 0x88
#define P1_THR_4 0x88
#define P1_THR_5 0x88
#define P1_THR_6 0xF9
#define P1_THR_7 0xCE
#define P1_THR_8 0x73
#define P1_THR_9 0x9C
#define P1_THR_10 0xE7
#define P1_THR_11 0x3F
#define P1_THR_12 0x3F
#define P1_THR_13 0x3F
#define P1_THR_14 0x3F
#define P1_THR_15 0x07
#define P2_THR_0 0xB0
#define P2_THR_1 0x88
#define P2_THR_2 0x88
#define P2_THR_3 0x88
#define P2_THR_4 0x88
#define P2_THR_5 0x88
#define P2_THR_6 0xF9
#define P2_THR_7 0xCE
#define P2_THR_8 0x73
#define P2_THR_9 0x9C
#define P2_THR_10 0xE7
#define P2_THR_11 0x3F
#define P2_THR_12 0x3F
#define P2_THR_13 0x3F
#define P2_THR_14 0x3F
#define P2_THR_15 0x07

#define synctyte 0x55 //同步字节
#define THRBW 0x80 //阈值批量写入命令
#define SRW 0x50 //串行写入命令
#define AFEGAINRANGE 0x0F // AFEGAINRANGE,保持范围 Ox0F
#define TVGBW 0x70 //阈值电压增益批量写入
#define TVGAIN0 0x88 // TVG 命令
#define TVGAIN1 0x88 // TVG 命令
#define TVGAIN2 0x88 // TVG 命令
#define TVGAIN3 0x41 //TVG 命令
#define TVGAIN4 0x04 //TVG 命令
#define TVGAIN5 0x10 //TVG 命令
#define TVGAIN6 0x40 //TVG 命令
#define P1BL 0x00 //预设和总线监听命令
#define numObj 0x01 //定义对象编号
//#define SD 0x40
#define UMR 0x28 //超声波测量命令
#define DECPL_TEMP 0x26

unsigned char calcChecksum (unsigned char);// calcchecksum 函数  
用于保存值的无符号 char ChecksumInput[35];//校验和数组  
unsigned char THBUFF[35];//针对 P1和 P2的阈值缓冲器数组  
unsigned char AFEGAIN[5];//AFEGAIN 阵列
unsigned char cmd;//cmd 表示校验和函数中的命令
无符号字符 TVG[10];//阈值电压增益阵列
unsigned char pre1_BUR_LIS[4];//预设和突发监听数组
unsigned char Ultra_MEAS[3];//超声波测量阵列
unsigned char UMRData[35];//保存超声波测量数据 i:e 数据、宽度、振幅
无符号字符字节1;//表示对象距离字节1+字节2  
unsigned char 字节2;  
无符号字符字节3;//对象宽度测量
无符号字符字节4;//峰值幅度测量


void setup()  

//将您的设置代码放在这里,运行一次:
Serial.begin(9600);//开始串行通信


//初始化数组的阈值
THBUFF[0]= syncByte;
THBUFF[1]=THRBW;
THBUFF[2]=P1_THR_0;
THBUFF[3]=P1_THR_1;  
THBUFF[4]=P1_THR_2;  
THBUFF[5]= P1_THR_3;  
THBUFF[6]= P1_THR_4;  
THBUFF[7]= P1_THR_5;  
THBUFF[8]= P1_THR_6;  
THBUFF[9]=P1_THR_7;
THBUFF[10]= P1_THR_8;
THBUFF[11]=P1_THR_9;
THBUFF[12]=P1_THR_10;  
THBUFF[13]=P1_THR_11;
THBUFF[14]=P1_THR_12;  
THBUFF[15]=P1_THR_13;
THBUFF[16]=P1_THR_14;
THBUFF[17]=P1_THR_15;
THBUFF[18]=P2_THR_0;  
THBUFF[19]=P2_THR_1;  
THBUFF[20]=P2_THR_2;
THBUFF[21]=P2_THR_3;  
THBUFF[22]=P2_THR_4;  
THBUFF[23]=P2_THR_5;
THBUFF[24]=P2_THR_6;
THBUFF[25]=P2_THR_7;
THBUFF[26]=P2_THR_8;
THBUFF[27]=P2_THR_9;
THBUFF[28]=P2_THR_10;
THBUFF[29]=P2_THR_11;  
THBUFF[30]=P2_THR_12;
THBUFF[31]=P2_THR_13;
THBUFF[32]=P2_THR_14;
THBUFF[33]=P2_THR_15;
THBUFF[34]= calcChecksum (THRBW);

//初始化数组中的 AFEGAIN 值

AFEGAIN[0]= syncByte;
AFEGAIN[1]=SRW;
AFEGAIN[2]=DECPL_TEMP;
AFEGAIN[3]=AFEGAINRANGE;
AFEGAIN[4]=校验和(SRW);

//初始化数组中的 TVG 值

TVG[0]= syncByte;
TVG[1]=TVGBW;
TVG[2]= TVGAIN0;
TVG[3]= TVGAIN1;
TVG[4]= TVGAIN2;
TVG[5]= TVGAIN3;
TVG[6]= TVGAIN4;
TVG[7]= TVGAIN5;
TVG[8]= TVGAIN6;
TVG[9]= calcChecksum (TVGBW);

//发出 P1BL 以启动突发脉冲以测量实时飞行时间

PRE1_BUR_LIS[0]= syncByte;
PRE1_BUR_LIS[1]=P1BL;
pre1_BUR_LIS[2]=编号对象;
PRE1_BUR_LIS[3]=校验和(P1BL);

//超声波测量结果

Ultra_MEAS[0]= syncByte;
Ultra_MEAS[1]=UMR;
Ultra_MEAS[2]=校验和(UMR);

字节1=UMRData[0];//对象距离字节1+字节2.
字节2=UMRData[1];  
字节3=UMRData[2];//对象宽度测量
字节4=UMRData[3];//峰值幅度测量


void loop(){

//延迟4秒

延迟(4000);

serial.write (THBUFF、35);//写入阈值批量写入  
延迟(50);// 50mS 延迟
serial.write (AFEGAIN、5);//写入 AFEGAIN  
延迟(50);// 50mS 延迟
serial.write (TVG、10);//写入 TVGAIN
延迟(50);// 50mS 延迟

//发出突发脉冲并连续读取 UMR 值

while (1U)

serial.write (pre1_BUR_LIS、4);//发出预设和突发监听
延迟(50);//延迟50mS
serial.write (Ultra_MEAS、3);//发出超声波测量

if (Serial.Available ()>0)//检查 Arduino UART 缓冲区中是否接收到数据

字节1 = Serial.read();//读取对象距离  
字节2 = Serial.read();//读取对象距离
字节3 = Serial.Read();//读取对象宽度
字节4 = Serial.read();//读取对象峰值振幅


用于计算校验和的//函数

unsigned char calcChecksum (unsigned char cmd)

unsigned char checksumLoops =0;
unsigned char DataCount =0;
unsigned int carry = 0;


switch (cmd)

案例 P1BL://P1BL //预设1突发和监听- NUMOBJECT 为1校验和  
ChecksumInput[0]= cmd;
ChecksumInput[1]= numObj;
校验和循环= 2;
中断;

Case UMR://UMR //超声波测量结果校验和  
//case 2://SD //系统诊断
ChecksumInput[0]= cmd;
校验和循环= 1;
中断;

案例 SRW://rw //寄存器写入校验和

ChecksumInput[0]= cmd;
ChecksumInput [1]= DECPL_TEMP;//0x26
ChecksumInput [2]= AFEGAINRANGE;//GAIN_RANGE=0x0F
校验和循环= 3;
中断;

案例 TVGBW://TVGBW //时变增益批量写入校验和  
ChecksumInput[0]= cmd;
ChecksumInput [1]= TVGAIN0;
ChecksumInput [2]= TVGAIN1;
ChecksumInput [3]= TVGAIN2;
ChecksumInput [4]= TVGAIN3;
ChecksumInput [5]= TVGAIN4;
ChecksumInput [6]= TVGAIN5;
ChecksumInput [7]= TVGAIN6;
校验和循环= 8;
中断;

案例 THRBW://THRBW //阈值批量写入校验和  
ChecksumInput[0]= cmd;
ChecksumInput [1]= P1_THR_0;
ChecksumInput [2]= P1_THR_1;
ChecksumInput [3]= P1_THR_2;
ChecksumInput [4]= P1_THR_3;
ChecksumInput [5]= P1_THR_4;
ChecksumInput [6]= P1_THR_5;
ChecksumInput [7]= P1_THR_6;
ChecksumInput [8]= P1_THR_7;
ChecksumInput [9]= P1_THR_8;
ChecksumInput [10]= P1_THR_9;
ChecksumInput [11]= P1_THR_10;
ChecksumInput [12]= P1_THR_11;
ChecksumInput [13]= P1_THR_12;
ChecksumInput [14]= P1_THR_13;
ChecksumInput [15]= P1_THR_14;
ChecksumInput [16]= P1_THR_15;
ChecksumInput [17]= P2_THR_0;
ChecksumInput [18]= P2_THR_1;
ChecksumInput [19]= P2_THR_2;
ChecksumInput [20]= P2_THR_3;
ChecksumInput [21]= P2_THR_4;
ChecksumInput [22]= P2_THR_5;
ChecksumInput [23]= P2_THR_6;
ChecksumInput [24]= P2_THR_7;
ChecksumInput [25]= P2_THR_8;
ChecksumInput [26]= P2_THR_9;
ChecksumInput [27]= P2_THR_10;
ChecksumInput [28]= P2_THR_11;
ChecksumInput [29]= P2_THR_12;
ChecksumInput[30]= P2_THR_13;
ChecksumInput [31]= P2_THR_14;
ChecksumInput[32]= P2_THR_15;
ChecksumLoops = 33;  
中断;

默认值:  
中断;


进位= 0;

对于(DataCount = 0;DataCount < checksumLoops;DataCount++)

如果((ChecksumInput[DataCount]+进位)<进位)

进位=进位+ ChecksumInput[DataCount]+ 1;

其他

进位=进位+ ChecksumInput[DataCount];

如果(进位> 0xFF)

进位=进位- 255;


进位=(~进位& 0x00FF);
回车;

  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Rahul、

    SCLK 引脚应通过10kOhm 电阻器拉低至接地。

    此外、我相信 Arduino 能够以5V 逻辑电平运行。 如果 TEST 引脚悬空、PGA460默认为3.3V 逻辑电平。 要启用5V 逻辑电平、请参阅数据表第7.3.12节"测试引脚功能"。 您需要通过100kOhm 电阻器将测试高电平拉至3.3或5V、以启用5V 逻辑电平。

    要使用异步 UART 模式、请参阅 PGA460-Q1数据表第55页的7.5.1 UART 和 USART 通信示例。 尝试使用主 MCU 复制这些命令。 确保主 MCU 使用 PGA460所需的 UART 帧结构:
    •8个数据位
    •1起始位
    •2个停止位
    •无奇偶校验位
    •无流量控制
    •域间等待时间(仅在使用1个停止位时才需要)
    注意:大多数 MCU 默认为1个停止位、因此请确保已将主器件的 UART 端口配置为2个停止位。
    PGA460支持2.4k 至115.2k 波特之间的波特率。 您使用的波特率是多少?

    VPWR 的价值是什么? PGA460需要6-28V 才能正常运行。 基于5V USB 的电源不足以为 PGA460供电。

    有关其他异步 UART 示例,或要计算任何命令序列的校验和,请参阅 GUI 的 Interface Mode --> UART 页面的命令选择。 从下拉列表中选择所需的命令、并使用相应的 UART Addr (默认为0)、然后单击 Run Command (运行命令)以查看在 UART 终端上以十六进制格式打印附加校验和的原始串行序列。 您无需连接 EVM 即可使用 GUI 的此功能。

    要检查您的 UART 端口是否与 PGA460正确通信、请发送一条基本命令、例如寄存器读取命令。 以下是十六进制主器件发送序列示例:{55 09 2B CB}
    其中:
    •55是同步字段
    •09是寄存器读取命令和 addr 0
    •2B 是要读取 EE_CRC 的寄存器地址(通常返回非零值)
    •CB 是此发送序列的校验和

    使用此命令时、PGA460应返回三个值:
    •如果主器件发送成功、则诊断字段(0x40)
    •寄存器地址值
    •PGA460生成了校验和

    启动后必须至少写入一次阈值、以清除初始化时始终标记为高电平的阈值 CRC 错误。 在允许 PGA460-Q1执行突发和监听或仅监听命令之前、必须清除阈值 CRC 误差。