kinsno 发表于 2017-11-22 16:26:26

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楼,

附上原理图







kinsno 发表于 2017-11-22 16:30:53

普通的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();

               }
        }
}

kinsno 发表于 2017-11-22 16:47:05

天啊,忘了说了,我使用的是普通的4M晶振,原来使用的是按手册接的陶瓷晶振,反而更挫了,普通4M晶振发0x01命令,好赖还有波形输出,陶瓷的4M,简直就是无动于衷。。。


wye11083 发表于 2017-11-22 17:02:59

你看一下db_gp22_eva_en里面的原理图,你是不是有接错的。再一个,你要多少精度?1ns级的用fpga都可以轻松搞定,而且不需要多少资源,只要2个相位的250M时钟用ddr采样就可以了。再高精度的如果你只是为了计算两个信号的相位差,用低频不相干频率采集然后可以直接拟合出相位差。

kinsno 发表于 2017-11-22 17:04:14

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

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




wye11083 发表于 2017-11-22 17:27:47

R5!R5!那是560K,不是560R!560R根本不可能工作了

kinsno 发表于 2017-11-22 17:29:50

wye11083 发表于 2017-11-22 17:27
R5!R5!那是560K,不是560R!560R根本不可能工作了

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


wye11083 发表于 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位整数来着。就是速度慢,而且计算不出精确相位,只能计算相位差,而且必须要有足够长时间的样本。这也是拟合的缺点吧。

kinsno 发表于 2017-11-22 19:37:18

wye11083 发表于 2017-11-22 17:45
ca,扒掉也不行?那我就没辙了。这玩意我嫌贵,没用。

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

牛比。。。

s1j2h3 发表于 2017-11-22 21:06:48

我用GP21来做激光测距,没什么问题啊

kinsno 发表于 2017-11-22 21:24:15

s1j2h3 发表于 2017-11-22 21:06
我用GP21来做激光测距,没什么问题啊

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

明天再验证一下。。。

恼火了一天。。。

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




powerlabor001 发表于 2017-11-23 00:18:41

gp21是我想用的东西,mark一下。

s1j2h3 发表于 2017-11-23 09:02:08

kinsno 发表于 2017-11-22 21:24
哈哈,其实我想了一下,也许是硬件问题。。。

明天再验证一下。。。


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

kinsno 发表于 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了,示波器测量图如下


kinsno 发表于 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来画的。。



s1j2h3 发表于 2017-11-23 15:26:40

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

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

liwei_jlu 发表于 2017-11-23 15:36:01

这个芯片好采购吗?多少钱一片?

kinsno 发表于 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。。。
你帮忙看看硬件有错误不?







kinsno 发表于 2017-11-23 16:07:25

liwei_jlu 发表于 2017-11-23 15:36
这个芯片好采购吗?多少钱一片?

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







kinsno 发表于 2017-11-23 16:51:24

静迎来人支个招?

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


s1j2h3 发表于 2017-11-23 19:51:42

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

应该是你的配置有问题

s1j2h3 发表于 2017-11-23 20:02:48

温度传感器断路

kinsno 发表于 2017-11-23 20:24:31

s1j2h3 发表于 2017-11-23 19:51
应该是你的配置有问题

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


kinsno 发表于 2017-11-24 11:38:42

问题,已解决。纯属硬件问题。。。

xml2028 发表于 2017-11-24 23:49:50

什么问题?

makeflyeasy 发表于 2020-1-2 14:26:51

你好,请教一下关于GP22的使用,我参考官方给的通信代码,但现在的SPI无法完成通信,想参考一下你的SPI读写这块的程序,谢谢楼主了

QL攻城狮 发表于 2020-8-14 11:47:03

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

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

itoko 发表于 2021-1-7 20:40:37

QL攻城狮 发表于 2020-8-14 11:47
你好啊,官方的代码能不能给个网址啊,我现在想测脉宽,想参考一下,麻烦你了 ...

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

QL攻城狮 发表于 2021-1-20 17:43:22

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

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

siasevan 发表于 2021-1-20 17:59:05

15年左右超声波水表热量表用的芯片,现在还在用吗?原来用的MSP430主控

siasevan 发表于 2021-1-21 16:33:55

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

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

siasevan 发表于 2021-1-22 10:37:59

bocai00 发表于 2021-1-22 09:41
恩恩是的   哈哈看来您应该是做了多年三表   连我们这颗料的时间都记得

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

{:lol:} {:victory:}

xuwei123 发表于 2023-4-11 11:31:21

itoko 发表于 2021-1-7 20:40
**** 作者被禁止或删除 内容自动屏蔽 ****
(引用自28楼)

您好,关于这个回波问题您这边解决了吗,我想跟您请教一下,我脉冲发送正常,却没有回波信号
页: [1]
查看完整版本: TDC-GP22无法校准,没有波形。