ZHCABO0 February 2022 TPS1HC100-Q1
在参考设计系统中,在外设模式下使用了一对不同的无线微控制器。方向盘上使用 CC2652R7 ARM Cortex-M4F 微控制器来控制和配置 TPS1HC100B-Q1 高侧开关系列。CC2652R7 为主机广播一组 BLE 服务/特性以供操作和配置。对于连接到模型车的距离传感器,按比例缩小的 CC2651P3 ARM Cortex-M4F 微控制器用于连续测量传感器阵列的电流并将读数报告给 BLE 主机。该系统中的 BLE 主机是标准 Apple iPad®,运行带有 CoreBluetooth 后端的简单 Swift 应用程序。iOS 应用程序充当系统的中央大脑,从 CC2651P3 读取传感器值,执行分析/处理以确定对象的距离,然后在发生警报事件时向方向盘上的 CC2652R7 微控制器发出警报。该系统嵌入式部分的方框图如图 4-1 所示。
此外,距离检测的软件流程图如下方的图 4-2 所示。此流程图是从控制 CC2652R7 和 CC2651P3 微控制器的 iOS 主机这个层面加以考虑的。
连接在方向盘上的 CC2652R7 通过 BLE 广播具有表 4-1 中所列特性的以下服务。
特性 | UUID(十六进制) | 格式 | 说明 |
---|---|---|---|
传感器警报 | 0xFFF1 | uint8_t | 启用/禁用驱动警报负载的值。 |
传感值 | 0xFFF2 | uint16_t [8] | 感测电流的原始 ADC 转换结果 |
陀螺仪值 | 0xFFF3 | uint16_t [6] | 来自 BOOSTXL-SENSORS 的原始陀螺仪值 |
加热器启用 | 0xFFF4 | uint8_t | 启用/禁用方向盘加热器 |
附在模型车上的 CC2651P3 会广播表 4-2 中所示的服务/特性。
特性 | UUID(十六进制) | 格式 | 说明 |
---|---|---|---|
传感器距离 1 | 0xFFF1 | uint16_t | 左距离传感器 |
传感器距离 2 | 0xFFF2 | uint16_t | 中心距离传感器 |
传感器距离 3 | 0xFFF3 | uint16_t | 右距离传感器 |
嵌入在方向盘中的 CC2652R7 BLE 微控制器可控制连接到系统的 TPS1HC100B-Q1 高侧开关阵列的所有方面。CC2652R7 包括以下任务:
CC2652R7 是专为低比例嵌入式系统设计的微控制器,因此 CC2652R7 本身不会执行算法密集型计算或 CPU 繁重的计算。相反,iOS 主机用于执行有关数据处理和距离检测的所有繁重任务。而 CC2652R7 则从 TPS1HC100B-Q1 的电流感测中获取被读取的值,并将它们放在缓冲区中供 iOS 主机读取。为了对连接到系统的所有八个 TPS1HC100B-Q1 器件高效地执行此操作,使用 SimpleLink SDK 驱动程序包中的 ADC_convertChain 函数执行一系列通道转换。这种转换可以在下面的代码片段中看到:
adc[0] = ADC_open(SNS1, ¶ms);
adc[1] = ADC_open(SNS2, ¶ms);
adc[2] = ADC_open(SNS3, ¶ms);
adc[3] = ADC_open(SNS4, ¶ms);
adc[4] = ADC_open(SNS5, ¶ms);
adc[5] = ADC_open(SNS6, ¶ms);
adc[6] = ADC_open(SNS7, ¶ms);
adc[7] = ADC_open(SNS8, ¶ms);
while(1)
{
ADC_convertChain(adc, sampleBuffer, 8);
SteeringWheelProfile_SetParameter(STEERINGWHEEL_CHAR2, 16,
&sampleBuffer);
Task_sleep(1000);
}
iPad 上运行的 iOS 软件会定期轮询 STEERINGWHEEL_CHAR2 中的值,解析出 ADC 转换结果所代表的各种负载电流,然后显示在 iPad 前端以供用户查看。
距离检测本身是在 iOS 主机上使用简单的阈值算法完成的。每个传感器都有一个与其相关联的 far、medium 和 close 阈值。 如果从 CC2651P3 读取的值超过这些阈值中的任何一个,则会将值 3、2 或 1 写入方向盘中 CC2652R7 MCU 的 STEERINGWHEEL_CHAR1 特性。这些值对应于应在方向盘系统上触发警报的强度。例如,close 值对应于碰撞避免事件,在该事件中,系统将以最大强度在方向盘上触发负载/警报。处理阈值的 iOS 代码片段如下:
if(characteristic == leftChar)
{
let intValue = (UInt16(data[1]) << 8) | UInt16(data[0])
leftValues[frontPos] = intValue
leftPos+=1
if(leftPos == NUM_DIST_VALS)
{
leftPos = 0
leftPasssed = true
}
var curSum: Int = 0
for curVal in leftValues
{
curSum += Int(curVal)
}
let curAvg = curSum / NUM_DIST_VALS
if(curAvg >= LEFT_THRESH3)
{
leftLevel = 3
}
else if(curAvg >= LEFT_THRESH2)
{
leftLevel = 2
}
else if(curAvg >= LEFT_THRESH1)
{
leftLevel = 1
}
else
{
leftLevel = 0
}
}
在此片段中,左传感器与一组 far、medium 和 close 距离的阈值进行比较。根据相应的级别,将一个整数值分配给 leftLevel 变量。该变量稍后会组合成一个 8 位整数,并在触发警报时写入方向盘的警报特性。另请注意,距离算法实现了对 NUM_DIST_VALS 个值(默认为五个)求平均/积分的基本形式。这是为了避免距离传感器的灵敏度导致的任何错误触发。警报的实际编写是使用以下包装器函数中显示的标准 CoreBluetooth API 完成的:
func writeAlarm(command: UInt8)
{
if((autoPeripheral != nil) && (autoPeripheral.state == .connected))
{
autoPeripheral.writeValue(Data([command]),
for: autoAlarmChar, type: .withResponse)
}
}