搜索
bottom↓
回复: 32

TDC-GP22无法校准,没有波形。

[复制链接]

出0入0汤圆

发表于 2017-11-22 16:26:26 | 显示全部楼层 |阅读模式
本帖最后由 kinsno 于 2017-11-23 14:11 编辑

前段时间问了一下GP22的相关问题,按照手册画了一个小核心板,接STM32F1核心板。
现在,读写SPI均没有问题。
搞了一对DN40的探头,原来的上面有一块板子,测出来溜溜的。。拿示波器,看了回波信号1V,飞行时间50出头个us;

碰到1个奇怪问题啊。

第1次发送 0x70 + 0x05 ,波形顺利发出来,但是状态却是出错,状态值为0x408或0x409, 第二次单发1个0x70,并没有波形发出来。

为什么第2次没有波形了呢?


有熟悉的高手进来指导一下呗。。。

代码在2楼,

附上原理图







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2017-11-22 16:30:53 | 显示全部楼层
普通的SPI操作就不用写了,现在附上关键的代码,无非就是校正,测试读写,和流量检测。


  1. //校正高速晶振
  2. unsigned long gp22_cal_OSC(void)
  3. {
  4.     unsigned long temp,result = 0;
  5.     unsigned int err = 0;
  6.     uint8_t i = 0, CLK32K_cycles_set = 1;
  7.    
  8.         GP22_EN_START_1;  /// In calibrate resonator, EN_START pin must be to set 1.

  9.         gp22_write_1byte(INIT_MEASURE); /// Init GP22 measure.
  10.         gp22_write_1byte(START_CAL_OSC); /// Calibrate resonator.

  11.         while( 0 == g_GP22InterruptFlag );
  12.         g_GP22InterruptFlag = 0;
  13.         g_GP22StatusRegister = gp22_Read_2byte(READ_STAT);

  14.     //time out check
  15.     if( g_GP22StatusRegister&0x0600 )  
  16.     {
  17.         if(g_GP22StatusRegister&0x0200)
  18.         {
  19.             err = 1;//printf("TDC_OUT",0,0);
  20.         }   
  21.         if(g_GP22StatusRegister&0x0400)
  22.         {
  23.             err = 2; //printf("PRE_OUT",0,0);
  24.         }   
  25.     }     
  26.     ///根据状态来读
  27.     i = g_GP22StatusRegister;
  28.     --i;
  29.     i &= 0x03;
  30.     switch(i)
  31.     {
  32.         case 0:result = gp22_Read_4byte(0xb0);break;
  33.         case 1:result = gp22_Read_4byte(0xb1);break;
  34.         case 2:result = gp22_Read_4byte(0xb2);break;
  35.         case 3:result = gp22_Read_4byte(0xb3);break;
  36.     }   
  37.    
  38.     //CLK32K_cycles_set -> ANZ_PER_CALRES即32.768K的周期数, 0,1,2,3
  39.     CLK32K_cycles_set = 1;
  40.     switch(CLK32K_cycles_set)
  41.     {
  42.     case 0:
  43.       if((result<0x1B80000)||(result>0x2080000))//t<55uS?t>65uS err
  44.       {
  45. //        printf("Err_61.035uS_cal",0,1);
  46. //        printf("status reg :",status,1);//status
  47.         err = 3;
  48.       }
  49.         break;
  50.     case 1:
  51.       if((result<0x3700000)||(result>0x4100000))//t<110uS?t>130uS err
  52.       {
  53. //        printf("Err_122.07uS_cal",0,1);
  54. //        printf("status reg:",status,1);//status
  55.         err = 4;
  56.       }
  57.         break;
  58.     case 2:
  59.       if((result<0x6E00000)||(result>0x8200000))//t<220uS?t>260uS err
  60.       {
  61. //        printf("Err_244.14uS_cal",0,1);
  62. //        printf("status reg:",status,1);//status
  63.         err = 5;
  64.       }
  65.         break;
  66.     case 3:
  67.       if((result<0xDC00000)||(result>0x10400000))//t<440uS?t>520uS err
  68.       {
  69. //        printf("Err_488.281uS_cal",0,1);
  70. //        printf("status reg:",status,1);//status
  71.         err = 6;
  72.       }
  73.         break;
  74.     }
  75.    
  76.     if(err != 0)
  77.         return 1;

  78.     return 0;
  79. }



  80. /*************************************************/
  81. //功能:测试GP22的通信是否成功
  82. /*************************************************/
  83. unsigned char gp22_comm_test(void)   
  84. {  
  85.         unsigned char counter = 0;
  86.         unsigned long tmp1 = 0,tmp2 = 0;
  87.        
  88.         ///先写寄存器0x81
  89.         ///再读结果寄存器5,反映寄存器1 的高8 位   
  90.         ///测试3次,0xAA,0x55,0xc3

  91.         tmp1 = 0xA5000000 ;
  92.         gp22_write_4byte(WRITE_REG1,tmp1);  //往寄存器1,写入数据        
  93.         waitms(5);
  94.         tmp2 = gp22_Read_4byte(READ_REG5); //从寄存器0xb5,读出来的高8位,和刚才写入的数据相等 -> 才是正确的读写
  95.         if(tmp1 == tmp2)
  96.           counter++;

  97.         tmp1 = 0x5A000000 ;
  98.         gp22_write_4byte(WRITE_REG1,tmp1);  //往寄存器1,写入数据        
  99.         waitms(5);
  100.         tmp2 = gp22_Read_4byte(READ_REG5); //从寄存器0xb5,读出来的高8位,和刚才写入的数据相等 -> 才是正确的读写
  101.         if(tmp1 == tmp2)
  102.           counter++;

  103.         tmp1 = 0xc3000000 ;
  104.         gp22_write_4byte(WRITE_REG1,tmp1);  //往寄存器1,写入数据        
  105.         waitms(5);
  106.         tmp2 = gp22_Read_4byte(READ_REG5); //从寄存器0xb5,读出来的高8位,和刚才写入的数据相等 -> 才是正确的读写
  107.         if(tmp1 == tmp2 )
  108.           counter++;  

  109.         if(counter >= 3)
  110.           return 1;

  111.         return 0;
  112.   
  113. }  


  114. // 具体步骤参照 gp22_v1.2.pdf 和 AN032_en.pdf
  115. void gp22_TOF_ultrasonic(void)
  116. {
  117.     unsigned int i;
  118.     unsigned long temp;
  119.     long tempValueBuffer[10];  // 排序,求平均
  120.     unsigned j, k;
  121.     long tempValue;
  122.     long tempValueSum = 0;
  123.     float tempValue1;   // 串口输出显示

  124.         //1. 硬件初始化
  125.     GP22_START_1;
  126.     GP22_EN_STOP1_1;
  127.     GP22_EN_STOP2_1;
  128.     GP22_EN_START_1;
  129.     GP22_RESET_1;
  130.         gp22_spi_init(); //spi init
  131.         gp22_Hard_Reset();        //reset gpio
  132.         waitms(10);
  133.         gp22_write_1byte(POWER_ON_RESET); //0x50
  134.         waitms(10);
  135.     gp22_comm_test(); //额外添加测试  
  136.        
  137.         //gp22_Reg_Init();
  138.     gp22_write_4byte( WRITE_REG0, 0x43CBE800);
  139.     gp22_write_4byte( WRITE_REG1, 0x21444000 );
  140.     gp22_write_4byte( WRITE_REG2, 0xA0190000 );
  141.     gp22_write_4byte( WRITE_REG3, 0xF8A24800 );        
  142.     gp22_write_4byte( WRITE_REG4, 0x20004000 );
  143.     gp22_write_4byte( WRITE_REG5, 0x40000000 );
  144.     gp22_write_4byte( WRITE_REG6, 0xC0C06100 );       
  145.        
  146.        
  147.         //2. 校准      
  148.         gp22_cal_OSC(); //0x03, Cal_Resonator
  149.        
  150.         //3. 温度测试,暂时不用
  151.        
  152.         //4. 循环测试
  153.         while(1)
  154.         {       
  155.                 gp22_write_1byte(INIT_MEASURE);        //0x70
  156.         //        gp22_write_1byte(START_TOF_RESTART); //0x05,没波形?
  157.                 gp22_write_1byte(START_TOF); //有波形,这是什么鬼?
  158.                
  159.                  while( 0 == g_GP22InterruptFlag );
  160.                  g_GP22InterruptFlag = 0;
  161.                  g_GP22StatusRegister = gp22_Read_2byte(READ_STAT); //0xb4
  162.                  // Error
  163.                  if( (g_GP22StatusRegister & 0x0600) != 0x0000 )  /// Timeout error.
  164.                  {         
  165.                    g_downTimeOutFlag = 1;  /// 空管断
  166.                  }
  167.                  else
  168.                  {     
  169.                    temp = gp22_Read_4byte(READ_RES3); //0xb3
  170.                    g_timeResult3 = dotHextoDotDec(temp);
  171.                    g_averageTimeResultDown = g_timeResult3/3;
  172.                  }
  173.                  
  174.                  gp22_write_1byte(INIT_MEASURE); //0x70

  175.                  while( 0 == g_GP22InterruptFlag );
  176.                  g_GP22InterruptFlag = 0;
  177.                  g_GP22StatusRegister = gp22_Read_2byte(READ_STAT); //0xb4
  178.                  // Error
  179.                  if( (g_GP22StatusRegister & 0x0600) != 0x0000 )  /// Timeout error.
  180.                  {         
  181.                    g_upTimeOutFlag = 1;   /// 空管断
  182.                  }
  183.                  else
  184.                  {         
  185.                    temp = gp22_Read_4byte(READ_RES3);  //0xb3
  186.                    g_timeResult3 = dotHextoDotDec(temp);
  187.                    g_averageTimeResultUp = g_timeResult3/3;   
  188.                  }
  189.                  
  190.                  gp22_cal_OSC(); //重新校验
  191.                  
  192.                  g_PW1STValue = gp22_Read_PW1ST();  //0xb8, < 0.3 ,alarm
  193.                  
  194.                  if( (0 == g_downTimeOutFlag) && (0 == g_upTimeOutFlag) )
  195.                  {
  196.                          ;//add user code , cal vol
  197.                  }
  198.                  else
  199.                  {
  200.                    g_downTimeOutFlag = 0;
  201.                    g_upTimeOutFlag = 0;
  202.                    gp22_Reg_Init();

  203.                  }
  204.         }
  205. }

复制代码

出0入0汤圆

 楼主| 发表于 2017-11-22 16:47:05 | 显示全部楼层
天啊,忘了说了,我使用的是普通的4M晶振,原来使用的是按手册接的陶瓷晶振,反而更挫了,普通4M晶振发0x01命令,好赖还有波形输出,陶瓷的4M,简直就是无动于衷。。。


出0入442汤圆

发表于 2017-11-22 17:02:59 来自手机 | 显示全部楼层
你看一下db_gp22_eva_en里面的原理图,你是不是有接错的。再一个,你要多少精度?1ns级的用fpga都可以轻松搞定,而且不需要多少资源,只要2个相位的250M时钟用ddr采样就可以了。再高精度的如果你只是为了计算两个信号的相位差,用低频不相干频率采集然后可以直接拟合出相位差。

出0入0汤圆

 楼主| 发表于 2017-11-22 17:04:14 | 显示全部楼层
wye11083 发表于 2017-11-22 17:02
你看一下db_gp22_eva_en里面的原理图,你是不是有接错的。再一个,你要多少精度?1ns级的用fpga都可以轻松 ...


估计要PS级的精度的,我这个核心板都弄上了,来不及上FPGA了。。。
原理图已在主楼上传了。。。
应该是没有错的。。。




出0入442汤圆

发表于 2017-11-22 17:27:47 来自手机 | 显示全部楼层
R5!R5!那是560K,不是560R!560R根本不可能工作了

出0入0汤圆

 楼主| 发表于 2017-11-22 17:29:50 | 显示全部楼层
wye11083 发表于 2017-11-22 17:27
R5!R5!那是560K,不是560R!560R根本不可能工作了


我让我核一下手册。。。手册上是有点摸糊。。
我把它扒了。。。但不影响我的操作啊。。我是有波形输出的。。只是2种操作指令不一样,就没有波形了。。


出0入442汤圆

发表于 2017-11-22 17:45:11 来自手机 | 显示全部楼层
本帖最后由 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位整数来着。就是速度慢,而且计算不出精确相位,只能计算相位差,而且必须要有足够长时间的样本。这也是拟合的缺点吧。

出0入0汤圆

 楼主| 发表于 2017-11-22 19:37:18 | 显示全部楼层
wye11083 发表于 2017-11-22 17:45
ca,扒掉也不行?那我就没辙了。这玩意我嫌贵,没用。

前一段时间我要测量两个高频信号的相位差,想了好 ...

牛比。。。

出0入0汤圆

发表于 2017-11-22 21:06:48 | 显示全部楼层
我用GP21来做激光测距,没什么问题啊

出0入0汤圆

 楼主| 发表于 2017-11-22 21:24:15 | 显示全部楼层
s1j2h3 发表于 2017-11-22 21:06
我用GP21来做激光测距,没什么问题啊


哈哈,其实我想了一下,也许是硬件问题。。。

明天再验证一下。。。

恼火了一天。。。

你试过校验晶振吗? 就是拿那个32K去校正4M,得出来的值是和手册上差不多吗? 我测出来是个很大的值,而且读状态值也是0x201 ;




出0入0汤圆

发表于 2017-11-23 00:18:41 | 显示全部楼层
gp21是我想用的东西,mark一下。

出0入0汤圆

发表于 2017-11-23 09:02:08 | 显示全部楼层
kinsno 发表于 2017-11-22 21:24
哈哈,其实我想了一下,也许是硬件问题。。。

明天再验证一下。。。

做过,可以实现的。
因为32.768的钟表晶振比较稳定,所以用来校准不怎么稳定但频率却高的4MHz晶振,在短时间内是可行的。
因为4MHz短时间内不会飘移很多。所以我会在每次测距前都校准一下。然后再测距,这样就可以用低端的器件完成高端的产品

出0入0汤圆

 楼主| 发表于 2017-11-23 11:47:22 | 显示全部楼层
本帖最后由 kinsno 于 2017-11-23 11:59 编辑
s1j2h3 发表于 2017-11-23 09:02
做过,可以实现的。
因为32.768的钟表晶振比较稳定,所以用来校准不怎么稳定但频率却高的4MHz晶振,在短 ...

已经证实是硬件的锅,折腾昨儿1天。
今天早上新焊了2块,立马给了面子。
但是探头读回的数据,我去读状态寄存器,却是0x409 ? 这是什么鬼,目 测是TDC溢出?
但我的波形还是蛮好的啊,幅值高达1V了,示波器测量图如下


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2017-11-23 14:12:05 | 显示全部楼层
本帖最后由 kinsno 于 2017-11-23 14:13 编辑

碰到1个奇怪问题啊。

第1次发送 0x70 + 0x05 ,波形顺利发出来,但是状态却是出错,状态值为0x408或0x409, 但明明有波形回来啊,幅值1V左右,非常好。见上图。

第二次单发1个0x70,并没有波形发出来。

为什么第2次没有波形了呢?

有人知道吗,还是说硬件上有啥讲究,我就是照着 AN032_en.pdf来画的。。



出0入0汤圆

发表于 2017-11-23 15:26:40 | 显示全部楼层
kinsno 发表于 2017-11-23 11:47
已经证实是硬件的锅,折腾昨儿1天。
今天早上新焊了2块,立马给了面子。
但是探头读回的数据,我去读状态 ...

有测量范围1与测量范围2两种测量模式

出0入8汤圆

发表于 2017-11-23 15:36:01 来自手机 | 显示全部楼层
这个芯片好采购吗?多少钱一片?

出0入0汤圆

 楼主| 发表于 2017-11-23 16:06:28 | 显示全部楼层
本帖最后由 kinsno 于 2017-11-23 16:09 编辑
s1j2h3 发表于 2017-11-23 15:26
有测量范围1与测量范围2两种测量模式


是的,使用测量模式2,照理来说不能溢出的啊。我的飞行时间,用示波器看了,50几个US。。。这咋就溢出了呢。
我上面回你的贴子时,贴了一幅示波器图,一格就是10US。。。我数了一下,从START起始,到STOP第1个波,中间也就隔了5个格子。。。即50US。。
我读状态寄存器,总是回复0x408。。。
你帮忙看看硬件有错误不?







出0入0汤圆

 楼主| 发表于 2017-11-23 16:07:25 | 显示全部楼层
liwei_jlu 发表于 2017-11-23 15:36
这个芯片好采购吗?多少钱一片?

我没管这事,我们采购买的。。。
应该好卖的,这颗芯片,听供应商说,GP21在热表行业卖的很多的,GP21他哥哥GP22应该也会好卖的。不到20一片。







出0入0汤圆

 楼主| 发表于 2017-11-23 16:51:24 | 显示全部楼层
静迎来人支个招?

有人晓得offset如何设置不? 我在想,我的时间溢出会不会和它有关系呢?


出0入0汤圆

发表于 2017-11-23 19:51:42 | 显示全部楼层
kinsno 发表于 2017-11-23 16:06
是的,使用测量模式2,照理来说不能溢出的啊。我的飞行时间,用示波器看了,50几个US。。。这咋就溢出 ...

应该是你的配置有问题

出0入0汤圆

发表于 2017-11-23 20:02:48 | 显示全部楼层
温度传感器断路

出0入0汤圆

 楼主| 发表于 2017-11-23 20:24:31 | 显示全部楼层
s1j2h3 发表于 2017-11-23 19:51
应该是你的配置有问题

我的配置是根据AN032标准例程来的哦,后来也参考了标准手册内后附带的。
想请教一下,这内部有一个offset,这个要根据什么来配置? 手册上写着是最大值35mv,我设成了0和35mv,均是溢出,即读状态值为0x408


出0入0汤圆

 楼主| 发表于 2017-11-24 11:38:42 | 显示全部楼层
问题,已解决。纯属硬件问题。。。

出675入8汤圆

发表于 2017-11-24 23:49:50 来自手机 | 显示全部楼层
什么问题?

出0入0汤圆

发表于 2020-1-2 14:26:51 | 显示全部楼层
你好,请教一下关于GP22的使用,我参考官方给的通信代码,但现在的SPI无法完成通信,想参考一下你的SPI读写这块的程序,谢谢楼主了

出0入0汤圆

发表于 2020-8-14 11:47:03 | 显示全部楼层
makeflyeasy 发表于 2020-1-2 14:26
你好,请教一下关于GP22的使用,我参考官方给的通信代码,但现在的SPI无法完成通信,想参考一下你的SPI读写 ...

你好啊,官方的代码能不能给个网址啊,我现在想测脉宽,想参考一下,麻烦你了

出0入0汤圆

发表于 2021-1-7 20:40:37 | 显示全部楼层
QL攻城狮 发表于 2020-8-14 11:47
你好啊,官方的代码能不能给个网址啊,我现在想测脉宽,想参考一下,麻烦你了 ...

https://www.pmt-fl.com/pmt-downloads#tdc_ds
官方代码在这里有,我想请教下楼主为啥我的发射波形只有几百mV,回波更是惨不忍睹大概只有2mV,我按照原理图直接焊了两个压电片作为输出,这样可以吗

出0入0汤圆

发表于 2021-1-20 17:43:22 | 显示全部楼层
itoko 发表于 2021-1-7 20:40
https://www.pmt-fl.com/pmt-downloads#tdc_ds
官方代码在这里有,我想请教下楼主为啥我的发射波形只有几 ...

不好意思,最近比较忙,你这个问题我不知道啊

出10入120汤圆

发表于 2021-1-20 17:59:05 | 显示全部楼层
15年左右超声波水表热量表用的芯片,现在还在用吗?原来用的MSP430主控

出10入120汤圆

发表于 2021-1-21 16:33:55 | 显示全部楼层
bocai00 发表于 2021-1-21 13:55
超声波水表热表 还是这个方案 MSP430+TDC     不过TDC芯片的话 国内大部分是MS1022 或者MS1030了  ...

嗯,这个国产的我记得是16年的时候出的

出10入120汤圆

发表于 2021-1-22 10:37:59 | 显示全部楼层
bocai00 发表于 2021-1-22 09:41
恩恩  是的   哈哈  看来您应该是做了多年三表     连我们这颗料的时间都记得

ps. 我就是原厂的  现在 ...

出0入0汤圆

发表于 2023-4-11 11:31:21 | 显示全部楼层
itoko 发表于 2021-1-7 20:40
**** 作者被禁止或删除 内容自动屏蔽 ****
(引用自28楼)

您好,关于这个回波问题您这边解决了吗,我想跟您请教一下,我脉冲发送正常,却没有回波信号
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-30 16:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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