51uwb.cn

 找回密码
 立即注册
查看: 6614|回复: 15
打印 上一主题 下一主题

看到有咨询 功率 或首经读取的问题,分享一下给大家。在加一个发送功率增益。

[复制链接]

5

主题

43

帖子

48

积分

新手上路

Rank: 1

积分
48
跳转到指定楼层
楼主
发表于 2020-7-14 08:51:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式


void dwt_readdiagnostics(dwt_rxdiag_t *diagnostics)
{
    // Read the HW FP index
    diagnostics->firstPath = dwt_read16bitoffsetreg(RX_TIME_ID, RX_TIME_FP_INDEX_OFFSET);

    // LDE diagnostic data
    diagnostics->maxNoise = dwt_read16bitoffsetreg(LDE_IF_ID, LDE_THRESH_OFFSET);

    // Read all 8 bytes in one SPI transaction
    dwt_readfromdevice(RX_FQUAL_ID, 0x0, 8, (uint8*)&diagnostics->stdNoise);

    diagnostics->firstPathAmp1 = dwt_read16bitoffsetreg(RX_TIME_ID, RX_TIME_FP_AMPL1_OFFSET);

    diagnostics->rxPreamCount = (dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXPACC_MASK) >> RX_FINFO_RXPACC_SHIFT  ;
}
dwt_rxdiag_t Diagnostics;
void ReadRssiFirstPath(u8 Count)
{
                u16 Rssi[10] = {0};
                dwt_readdiagnostics(&Diagnostics);//Diagnostics
                M = dwt_read16bitoffsetreg(0x12, 6);
                Rssi[0] = Diagnostics.maxNoise;
                Rssi[1] = Diagnostics.firstPathAmp1;
                Rssi[2] = Diagnostics.firstPathAmp2;
                Rssi[3] = Diagnostics.firstPathAmp3;
                Rssi[4] = Diagnostics.maxGrowthCIR;
                Rssi[5] = Diagnostics.rxPreamCount;
                Rssi[6] = Diagnostics.firstPath;
                Rssi[7] = Diagnostics.stdNoise;
                               
                RxLevel = 10*log10( (M*131072.0)/(Rssi[5]*Rssi[5]) ) - 121.74; //RSSI值
                FirstPath[Count] =  10*log10( (Rssi[1]*Rssi[1]+Rssi[2]*Rssi[2]+Rssi[3]*Rssi[3])/(Rssi[5]*Rssi[5]) ) - 121.74; //首经功率
       

}




int dwt_sedtxpowermode(int8_t coarsePower, int8_t finePower) //设置发送功率增益
{
        uint32_t pow = 0;
        float total_power = 0.0;

        switch(coarsePower)
        {
                case 0:
                        pow |= (0x06 << 5); total_power = 0;
                        break;//0dB
                case 1:
                        pow |= (0x05 << 5); total_power = 3;
                        break;//3dB
                case 2:
                        pow |= (0x04 << 5); total_power = 6;
                        break;//6dB
                case 3:
                        pow |= (0x03 << 5); total_power = 9;
                        break;//9dB
                case 4:
                        pow |= (0x02 << 5); total_power = 12;
                        break;//12dB
                case 5:
                        pow |= (0x01 << 5); total_power = 15;
                        break;//15dB
                case 6:
                        pow |= (0x00 << 5); total_power = 18;
                        break;//18dB
                default:
                        printf("Coarse power error\r\n");
                        return DWT_ERROR;
        }
        switch(finePower)
        {
                case 0:
                        pow |= 0x00; total_power += 0;
                        break;//0dB
                case 1:
                        pow |= 0x01; total_power += 0.5;
                        break;//0.5dB
                case 2:
                        pow |= 0x02; total_power += 1;
                        break;//1.0dB
                case 3:
                        pow |= 0x03; total_power += 1.5;
                        break;//1.5dB
                case 4:
                        pow |= 0x04; total_power += 2;
                        break;//2dB
                case 5:
                        pow |= 0x05; total_power += 2.5;
                        break;//2.5dB
                case 6:
                        pow |= 0x06; total_power += 3;
                        break;//3dB
                case 7:
                        pow |= 0x07; total_power += 3.5;
                        break;//3.5dB
                case 8:
                        pow |= 0x08; total_power += 4;
                        break;//4dB
                case 9:
                        pow |= 0x09; total_power += 4.5;
                        break;//4.5dB
                case 10:
                        pow |= 0x0a; total_power += 5;
                        break;//5.0dB
                case 11:
                        pow |= 0x0b; total_power += 5.5;
                        break;//5.5dB
                case 12:
                        pow |= 0x0c; total_power += 6;
                        break;//6dB
                case 13:
                        pow |= 0x0d; total_power += 6.5;
                        break;//6.5dB
                case 14:
                        pow |= 0x0e; total_power += 7;
                        break;//7dB
                case 15:
                        pow |= 0x0f; total_power += 7.5;
                        break;//7.5dB
                case 16:
                        pow |= 0x10; total_power += 8;
                        break;//8dB
                case 17:
                        pow |= 0x11; total_power += 8.5;
                        break;//8.5dB
                case 18:
                        pow |= 0x12; total_power += 9;
                        break;//9dB
                case 19:
                        pow |= 0x13; total_power += 9.5;
                        break;//9.5dB
                case 20:
                        pow |= 0x14; total_power += 10;
                        break;//10dB
                case 21:
                        pow |= 0x15; total_power += 10.5;
                        break;//10.5dB
                case 22:
                        pow |= 0x16; total_power += 11;
                        break;//11dB
                case 23:
                        pow |= 0x17; total_power += 11.5;
                        break;//11.5dB
                case 24:
                        pow |= 0x18; total_power += 12;
                        break;//12dB
                case 25:
                        pow |= 0x19; total_power += 12.5;
                        break;//12.5dB
                case 26:
                        pow |= 0x1a; total_power += 13;
                        break;//13dB
                case 27:
                        pow |= 0x1b; total_power += 13.5;
                        break;//13.5dB
                case 28:
                        pow |= 0x1c; total_power += 14;
                        break;//14dB
                case 29:
                        pow |= 0x1d; total_power += 14.5;
                        break;//14.5dB
                case 30:
                        pow |= 0x1e; total_power += 15;
                        break;//15dB
                case 31:
                        pow |= 0x1f; total_power += 15.5;
                        break;//15.5dB
                default:
                        printf("Fine power error\r\n");
                        return DWT_ERROR;
        }
    pow = (pow << 24) + (pow << 16) + (pow << 8) + pow;

    dwt_write32bitoffsetreg(TX_POWER_ID, 0,pow);

        printf("the power is %f dB \r\n", total_power);
        return DWT_SUCCESS;
}

回复

使用道具 举报

35

主题

972

帖子

4084

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4084
16#
发表于 2020-7-15 20:15:03 | 只看该作者
tismily 发表于 2020-7-15 18:37
晶振的频偏   ,不管是 20PPM还是 0.5PPM对于重复精度没有半毛钱的关系,Trim 的设定,可以然uwb自己的时 ...

你说的对。 调这个对TWR 原理下测距有影响。

但是对TDOA没有意义,因为重复误差没有变。
回复

使用道具 举报

2

主题

58

帖子

254

积分

中级会员

Rank: 3Rank: 3

积分
254
15#
发表于 2020-7-15 19:00:40 | 只看该作者
uwb 发表于 2020-7-15 18:58
你说的这个问题的确是我们目前最关注的,我们当前的方案是通过客户端(被动式)模式,一方面可支持大量基站 ...

至于说晶振Trim这块,我们也是想尽可能提高DW1000的时间戳记录精度,以提高最终TDOA的位置精度
回复

使用道具 举报

2

主题

58

帖子

254

积分

中级会员

Rank: 3Rank: 3

积分
254
14#
发表于 2020-7-15 18:58:44 | 只看该作者
tismily 发表于 2020-7-15 18:39
有很难解决的一个问题是什么?  就是你所有的基站不动,把标签原地旋转,这时候你会发现距离差会变,大概 ...

你说的这个问题的确是我们目前最关注的,我们当前的方案是通过客户端(被动式)模式,一方面可支持大量基站从而可以尽可能平均掉这个偏差,另一方面我们针对机器人领域,所以结合机器人定位导航中的轮式、惯导等数据来抑制和补偿这个距离/RSSI/角度引起的偏差

客户端模式VS服务器端模式
回复

使用道具 举报

5

主题

43

帖子

48

积分

新手上路

Rank: 1

积分
48
13#
 楼主| 发表于 2020-7-15 18:39:47 | 只看该作者
uwb 发表于 2020-7-15 17:21
刚才也解释过了,在固件和协议上做修正可能有助于增加时间戳本身的精度,而这个时间戳是不能靠算法来弥补 ...

有很难解决的一个问题是什么?  就是你所有的基站不动,把标签原地旋转,这时候你会发现距离差会变,大概几个cm,这个是比较难搞的
回复

使用道具 举报

5

主题

43

帖子

48

积分

新手上路

Rank: 1

积分
48
12#
 楼主| 发表于 2020-7-15 18:37:30 | 只看该作者
蓝点无限 发表于 2020-7-15 17:02
其实做tdoa,晶振之间的这种偏差可以同步过来。 固件要偏差固定,不能随时间变化,但是目前我看到的结果 ...

晶振的频偏   ,不管是 20PPM还是 0.5PPM对于重复精度没有半毛钱的关系,Trim 的设定,可以然uwb自己的时钟跑的快一点,或者慢一点和重复精度也没有半毛钱的关系,这些都是影响绝对的精度。
回复

使用道具 举报

2

主题

58

帖子

254

积分

中级会员

Rank: 3Rank: 3

积分
254
11#
发表于 2020-7-15 17:23:50 | 只看该作者
uwb 发表于 2020-7-15 17:21
刚才也解释过了,在固件和协议上做修正可能有助于增加时间戳本身的精度,而这个时间戳是不能靠算法来弥补 ...

另外,请问下你们知道的无源晶振稳定性最好的是哪个型号?(价格只要100以内都可以考虑)

有源晶振精度相对来说的确有助于增加精度,不过也会引入一些其它需要处理的问题
回复

使用道具 举报

2

主题

58

帖子

254

积分

中级会员

Rank: 3Rank: 3

积分
254
10#
发表于 2020-7-15 17:21:28 | 只看该作者
蓝点无限 发表于 2020-7-15 17:02
其实做tdoa,晶振之间的这种偏差可以同步过来。 固件要偏差固定,不能随时间变化,但是目前我看到的结果 ...

刚才也解释过了,在固件和协议上做修正可能有助于增加时间戳本身的精度,而这个时间戳是不能靠算法来弥补的。此外算法级的误差补偿对TDOA来说是必须的,所以也就没必要过多说明了
回复

使用道具 举报

35

主题

972

帖子

4084

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4084
9#
发表于 2020-7-15 17:02:29 | 只看该作者
uwb 发表于 2020-7-15 16:37
相对来说,我更倾向在系统加电后和主时钟节点通讯时自动进行Trim校准,Decawave提供了相关的example,不 ...

其实做tdoa,晶振之间的这种偏差可以同步过来。 固件要偏差固定,不能随时间变化,但是目前我看到的结果是一个随着时间变化的偏差。

目前我们自己做的模组,稍微修改了一块,准备上0.5ppm的有源晶振看看情况。 板子已经做了,到时候有结果再更新论坛
回复

使用道具 举报

2

主题

58

帖子

254

积分

中级会员

Rank: 3Rank: 3

积分
254
8#
发表于 2020-7-15 16:37:39 | 只看该作者
蓝点无限 发表于 2020-7-15 16:27
Trim 设定不对,确实引入很大的偏差,TWR测距的时候测试过。

另外晶振如果都是10ppm,理论上两个晶振 ...

相对来说,我更倾向在系统加电后和主时钟节点通讯时自动进行Trim校准,Decawave提供了相关的example,不过我们目前没有引入这个机制,一方面对我们的网络协议和算法引入了一定复杂度,另外也不知道具体期望有什么样的效果
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

bphero Inc.  

GMT+8, 2024-5-7 13:06 , Processed in 0.018104 second(s), 5 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表