TDC-GP22无法校准,没有波形。
本帖最后由 kinsno 于 2017-11-23 14:11 编辑前段时间问了一下GP22的相关问题,按照手册画了一个小核心板,接STM32F1核心板。
现在,读写SPI均没有问题。
搞了一对DN40的探头,原来的上面有一块板子,测出来溜溜的。。拿示波器,看了回波信号1V,飞行时间50出头个us;
碰到1个奇怪问题啊。
第1次发送 0x70 + 0x05 ,波形顺利发出来,但是状态却是出错,状态值为0x408或0x409, 第二次单发1个0x70,并没有波形发出来。
为什么第2次没有波形了呢?
有熟悉的高手进来指导一下呗。。。
代码在2楼,
附上原理图
普通的SPI操作就不用写了,现在附上关键的代码,无非就是校正,测试读写,和流量检测。
//校正高速晶振
unsigned long gp22_cal_OSC(void)
{
unsigned long temp,result = 0;
unsigned int err = 0;
uint8_t i = 0, CLK32K_cycles_set = 1;
GP22_EN_START_1;/// In calibrate resonator, EN_START pin must be to set 1.
gp22_write_1byte(INIT_MEASURE); /// Init GP22 measure.
gp22_write_1byte(START_CAL_OSC); /// Calibrate resonator.
while( 0 == g_GP22InterruptFlag );
g_GP22InterruptFlag = 0;
g_GP22StatusRegister = gp22_Read_2byte(READ_STAT);
//time out check
if( g_GP22StatusRegister&0x0600 )
{
if(g_GP22StatusRegister&0x0200)
{
err = 1;//printf("TDC_OUT",0,0);
}
if(g_GP22StatusRegister&0x0400)
{
err = 2; //printf("PRE_OUT",0,0);
}
}
///根据状态来读
i = g_GP22StatusRegister;
--i;
i &= 0x03;
switch(i)
{
case 0:result = gp22_Read_4byte(0xb0);break;
case 1:result = gp22_Read_4byte(0xb1);break;
case 2:result = gp22_Read_4byte(0xb2);break;
case 3:result = gp22_Read_4byte(0xb3);break;
}
//CLK32K_cycles_set -> ANZ_PER_CALRES即32.768K的周期数, 0,1,2,3
CLK32K_cycles_set = 1;
switch(CLK32K_cycles_set)
{
case 0:
if((result<0x1B80000)||(result>0x2080000))//t<55uS?t>65uS err
{
// printf("Err_61.035uS_cal",0,1);
// printf("status reg :",status,1);//status
err = 3;
}
break;
case 1:
if((result<0x3700000)||(result>0x4100000))//t<110uS?t>130uS err
{
// printf("Err_122.07uS_cal",0,1);
// printf("status reg:",status,1);//status
err = 4;
}
break;
case 2:
if((result<0x6E00000)||(result>0x8200000))//t<220uS?t>260uS err
{
// printf("Err_244.14uS_cal",0,1);
// printf("status reg:",status,1);//status
err = 5;
}
break;
case 3:
if((result<0xDC00000)||(result>0x10400000))//t<440uS?t>520uS err
{
// printf("Err_488.281uS_cal",0,1);
// printf("status reg:",status,1);//status
err = 6;
}
break;
}
if(err != 0)
return 1;
return 0;
}
/*************************************************/
//功能:测试GP22的通信是否成功
/*************************************************/
unsigned char gp22_comm_test(void)
{
unsigned char counter = 0;
unsigned long tmp1 = 0,tmp2 = 0;
///先写寄存器0x81
///再读结果寄存器5,反映寄存器1 的高8 位
///测试3次,0xAA,0x55,0xc3
tmp1 = 0xA5000000 ;
gp22_write_4byte(WRITE_REG1,tmp1);//往寄存器1,写入数据
waitms(5);
tmp2 = gp22_Read_4byte(READ_REG5); //从寄存器0xb5,读出来的高8位,和刚才写入的数据相等 -> 才是正确的读写
if(tmp1 == tmp2)
counter++;
tmp1 = 0x5A000000 ;
gp22_write_4byte(WRITE_REG1,tmp1);//往寄存器1,写入数据
waitms(5);
tmp2 = gp22_Read_4byte(READ_REG5); //从寄存器0xb5,读出来的高8位,和刚才写入的数据相等 -> 才是正确的读写
if(tmp1 == tmp2)
counter++;
tmp1 = 0xc3000000 ;
gp22_write_4byte(WRITE_REG1,tmp1);//往寄存器1,写入数据
waitms(5);
tmp2 = gp22_Read_4byte(READ_REG5); //从寄存器0xb5,读出来的高8位,和刚才写入的数据相等 -> 才是正确的读写
if(tmp1 == tmp2 )
counter++;
if(counter >= 3)
return 1;
return 0;
}
// 具体步骤参照 gp22_v1.2.pdf 和 AN032_en.pdf
void gp22_TOF_ultrasonic(void)
{
unsigned int i;
unsigned long temp;
long tempValueBuffer;// 排序,求平均
unsigned j, k;
long tempValue;
long tempValueSum = 0;
float tempValue1; // 串口输出显示
//1. 硬件初始化
GP22_START_1;
GP22_EN_STOP1_1;
GP22_EN_STOP2_1;
GP22_EN_START_1;
GP22_RESET_1;
gp22_spi_init(); //spi init
gp22_Hard_Reset(); //reset gpio
waitms(10);
gp22_write_1byte(POWER_ON_RESET); //0x50
waitms(10);
gp22_comm_test(); //额外添加测试
//gp22_Reg_Init();
gp22_write_4byte( WRITE_REG0, 0x43CBE800);
gp22_write_4byte( WRITE_REG1, 0x21444000 );
gp22_write_4byte( WRITE_REG2, 0xA0190000 );
gp22_write_4byte( WRITE_REG3, 0xF8A24800 );
gp22_write_4byte( WRITE_REG4, 0x20004000 );
gp22_write_4byte( WRITE_REG5, 0x40000000 );
gp22_write_4byte( WRITE_REG6, 0xC0C06100 );
//2. 校准
gp22_cal_OSC(); //0x03, Cal_Resonator
//3. 温度测试,暂时不用
//4. 循环测试
while(1)
{
gp22_write_1byte(INIT_MEASURE); //0x70
// gp22_write_1byte(START_TOF_RESTART); //0x05,没波形?
gp22_write_1byte(START_TOF); //有波形,这是什么鬼?
while( 0 == g_GP22InterruptFlag );
g_GP22InterruptFlag = 0;
g_GP22StatusRegister = gp22_Read_2byte(READ_STAT); //0xb4
// Error
if( (g_GP22StatusRegister & 0x0600) != 0x0000 )/// Timeout error.
{
g_downTimeOutFlag = 1;/// 空管断
}
else
{
temp = gp22_Read_4byte(READ_RES3); //0xb3
g_timeResult3 = dotHextoDotDec(temp);
g_averageTimeResultDown = g_timeResult3/3;
}
gp22_write_1byte(INIT_MEASURE); //0x70
while( 0 == g_GP22InterruptFlag );
g_GP22InterruptFlag = 0;
g_GP22StatusRegister = gp22_Read_2byte(READ_STAT); //0xb4
// Error
if( (g_GP22StatusRegister & 0x0600) != 0x0000 )/// Timeout error.
{
g_upTimeOutFlag = 1; /// 空管断
}
else
{
temp = gp22_Read_4byte(READ_RES3);//0xb3
g_timeResult3 = dotHextoDotDec(temp);
g_averageTimeResultUp = g_timeResult3/3;
}
gp22_cal_OSC(); //重新校验
g_PW1STValue = gp22_Read_PW1ST();//0xb8, < 0.3 ,alarm
if( (0 == g_downTimeOutFlag) && (0 == g_upTimeOutFlag) )
{
;//add user code , cal vol
}
else
{
g_downTimeOutFlag = 0;
g_upTimeOutFlag = 0;
gp22_Reg_Init();
}
}
}
天啊,忘了说了,我使用的是普通的4M晶振,原来使用的是按手册接的陶瓷晶振,反而更挫了,普通4M晶振发0x01命令,好赖还有波形输出,陶瓷的4M,简直就是无动于衷。。。
你看一下db_gp22_eva_en里面的原理图,你是不是有接错的。再一个,你要多少精度?1ns级的用fpga都可以轻松搞定,而且不需要多少资源,只要2个相位的250M时钟用ddr采样就可以了。再高精度的如果你只是为了计算两个信号的相位差,用低频不相干频率采集然后可以直接拟合出相位差。 wye11083 发表于 2017-11-22 17:02
你看一下db_gp22_eva_en里面的原理图,你是不是有接错的。再一个,你要多少精度?1ns级的用fpga都可以轻松 ...
估计要PS级的精度的,我这个核心板都弄上了,来不及上FPGA了。。。
原理图已在主楼上传了。。。
应该是没有错的。。。
R5!R5!那是560K,不是560R!560R根本不可能工作了 wye11083 发表于 2017-11-22 17:27
R5!R5!那是560K,不是560R!560R根本不可能工作了
我让我核一下手册。。。手册上是有点摸糊。。
我把它扒了。。。但不影响我的操作啊。。我是有波形输出的。。只是2种操作指令不一样,就没有波形了。。
本帖最后由 wye11083 于 2017-11-22 17:46 编辑
kinsno 发表于 2017-11-22 17:29
我让我核一下手册。。。手册上是有点摸糊。。
我把它扒了。。。但不影响我的操作啊。。我是有波形输出的 ...
ca,扒掉也不行?那我就没辙了。这玩意我嫌贵,没用。
前一段时间我要测量两个高频信号的相位差,想了好长时间,开始也想用tdc来搞,最后发现太贵了,用不起。。。。而且tdc不支持30ns以内的采样。最后我看TI使用不相干时钟去采样,然后我试着做拟合,目前FPGA已经做出来了,单次采样相位差可以做到+-64/65536约+-48ps(20MHz),而且中值和均值误差不超过1/65536。就是对计算精度要求太高了,28位小数和16位整数来着。就是速度慢,而且计算不出精确相位,只能计算相位差,而且必须要有足够长时间的样本。这也是拟合的缺点吧。 wye11083 发表于 2017-11-22 17:45
ca,扒掉也不行?那我就没辙了。这玩意我嫌贵,没用。
前一段时间我要测量两个高频信号的相位差,想了好 ...
牛比。。。
我用GP21来做激光测距,没什么问题啊
s1j2h3 发表于 2017-11-22 21:06
我用GP21来做激光测距,没什么问题啊
哈哈,其实我想了一下,也许是硬件问题。。。
明天再验证一下。。。
恼火了一天。。。
你试过校验晶振吗? 就是拿那个32K去校正4M,得出来的值是和手册上差不多吗? 我测出来是个很大的值,而且读状态值也是0x201 ;
gp21是我想用的东西,mark一下。 kinsno 发表于 2017-11-22 21:24
哈哈,其实我想了一下,也许是硬件问题。。。
明天再验证一下。。。
做过,可以实现的。
因为32.768的钟表晶振比较稳定,所以用来校准不怎么稳定但频率却高的4MHz晶振,在短时间内是可行的。
因为4MHz短时间内不会飘移很多。所以我会在每次测距前都校准一下。然后再测距,这样就可以用低端的器件完成高端的产品 本帖最后由 kinsno 于 2017-11-23 11:59 编辑
s1j2h3 发表于 2017-11-23 09:02
做过,可以实现的。
因为32.768的钟表晶振比较稳定,所以用来校准不怎么稳定但频率却高的4MHz晶振,在短 ...
已经证实是硬件的锅,折腾昨儿1天。
今天早上新焊了2块,立马给了面子。
但是探头读回的数据,我去读状态寄存器,却是0x409 ? 这是什么鬼,目 测是TDC溢出?
但我的波形还是蛮好的啊,幅值高达1V了,示波器测量图如下
本帖最后由 kinsno 于 2017-11-23 14:13 编辑
碰到1个奇怪问题啊。
第1次发送 0x70 + 0x05 ,波形顺利发出来,但是状态却是出错,状态值为0x408或0x409, 但明明有波形回来啊,幅值1V左右,非常好。见上图。
第二次单发1个0x70,并没有波形发出来。
为什么第2次没有波形了呢?
有人知道吗,还是说硬件上有啥讲究,我就是照着 AN032_en.pdf来画的。。
kinsno 发表于 2017-11-23 11:47
已经证实是硬件的锅,折腾昨儿1天。
今天早上新焊了2块,立马给了面子。
但是探头读回的数据,我去读状态 ...
有测量范围1与测量范围2两种测量模式 这个芯片好采购吗?多少钱一片? 本帖最后由 kinsno 于 2017-11-23 16:09 编辑
s1j2h3 发表于 2017-11-23 15:26
有测量范围1与测量范围2两种测量模式
是的,使用测量模式2,照理来说不能溢出的啊。我的飞行时间,用示波器看了,50几个US。。。这咋就溢出了呢。
我上面回你的贴子时,贴了一幅示波器图,一格就是10US。。。我数了一下,从START起始,到STOP第1个波,中间也就隔了5个格子。。。即50US。。
我读状态寄存器,总是回复0x408。。。
你帮忙看看硬件有错误不?
liwei_jlu 发表于 2017-11-23 15:36
这个芯片好采购吗?多少钱一片?
我没管这事,我们采购买的。。。
应该好卖的,这颗芯片,听供应商说,GP21在热表行业卖的很多的,GP21他哥哥GP22应该也会好卖的。不到20一片。
静迎来人支个招?
有人晓得offset如何设置不? 我在想,我的时间溢出会不会和它有关系呢?
kinsno 发表于 2017-11-23 16:06
是的,使用测量模式2,照理来说不能溢出的啊。我的飞行时间,用示波器看了,50几个US。。。这咋就溢出 ...
应该是你的配置有问题 温度传感器断路 s1j2h3 发表于 2017-11-23 19:51
应该是你的配置有问题
我的配置是根据AN032标准例程来的哦,后来也参考了标准手册内后附带的。
想请教一下,这内部有一个offset,这个要根据什么来配置? 手册上写着是最大值35mv,我设成了0和35mv,均是溢出,即读状态值为0x408
问题,已解决。纯属硬件问题。。。
什么问题? 你好,请教一下关于GP22的使用,我参考官方给的通信代码,但现在的SPI无法完成通信,想参考一下你的SPI读写这块的程序,谢谢楼主了 makeflyeasy 发表于 2020-1-2 14:26
你好,请教一下关于GP22的使用,我参考官方给的通信代码,但现在的SPI无法完成通信,想参考一下你的SPI读写 ...
你好啊,官方的代码能不能给个网址啊,我现在想测脉宽,想参考一下,麻烦你了 QL攻城狮 发表于 2020-8-14 11:47
你好啊,官方的代码能不能给个网址啊,我现在想测脉宽,想参考一下,麻烦你了 ...
https://www.pmt-fl.com/pmt-downloads#tdc_ds
官方代码在这里有,我想请教下楼主为啥我的发射波形只有几百mV,回波更是惨不忍睹大概只有2mV,我按照原理图直接焊了两个压电片作为输出,这样可以吗 itoko 发表于 2021-1-7 20:40
https://www.pmt-fl.com/pmt-downloads#tdc_ds
官方代码在这里有,我想请教下楼主为啥我的发射波形只有几 ...
不好意思,最近比较忙,你这个问题我不知道啊{:lol:} 15年左右超声波水表热量表用的芯片,现在还在用吗?原来用的MSP430主控 bocai00 发表于 2021-1-21 13:55
超声波水表热表 还是这个方案 MSP430+TDC 不过TDC芯片的话 国内大部分是MS1022 或者MS1030了...
嗯,这个国产的我记得是16年的时候出的 bocai00 发表于 2021-1-22 09:41
恩恩是的 哈哈看来您应该是做了多年三表 连我们这颗料的时间都记得
ps. 我就是原厂的现在 ...
{:lol:} {:victory:} itoko 发表于 2021-1-7 20:40
**** 作者被禁止或删除 内容自动屏蔽 ****
(引用自28楼)
您好,关于这个回波问题您这边解决了吗,我想跟您请教一下,我脉冲发送正常,却没有回波信号
页:
[1]