This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDC7200 Arduino

Guru**** 2024750 points
Other Parts Discussed in Thread: TDC7200
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/669492/tdc7200-arduino

主题中讨论的其他器件:TDC7200

您好!  

我在 TDC7200的以下 Arduino 程序中遇到问题。 我的n´t 是我没有得到 CALIBRATION1和 CALIBRATION2的值,因此串行监视器给出了以下信息:(图片)也许任何人都可以解决这个问题!

 

该计划的一部分来自 :github.com/.../TDC7200

报头程序:

#ifndef TDC7200_H
#define TDC7200_H
int csPin = 53;

//此代码的一部分来自 github.com/.../TICC

#define SPIfrequency (uint32_t) 2500000
#define EXTCLK (uint32_t) 1000000 // 1MHz 外部时钟的值
#define AVG_CYCLES 10

// TDC7200寄存器地址
const int config1 = 0x00;//默认0x00
CONST int CONFIG2 = 0x01;//默认值0x40
const int INT_STATUS = 0x02;//默认0x00
const int INT_MASK = 0x03;//默认0x07
const int 粗糙_CNTR_OVF = 0x04;//默认0xff
const int 粗糙_CNTR_OVF = 0x05;//默认0xff
const int clock_CNTR_OVF = 0x06;//默认0xff
const int clock_CNTR_OVF = 0x07;//默认0xff
CONST int CLOCK _CNTR_STOP_MASK_H = 0x08;//默认值0x00
CONST int CLOCK _CNTR_STOP_MASK_L = 0x09;//默认值0x00
//从0x0A 到0x0F 的间隙...
const int Time1 = 0x10;//默认值0x00_0000
CONST int CLOCK _COUNT1 = 0x11;//默认值0x00_0000
const int Time2 = 0x12;//默认值0x00_0000
CONST int CLOCK _COUNT2 = 0x13;//默认值0x00_0000
const int Time3 = 0x14;//默认值0x00_0000
CONST int CLOCK _COUNT3 = 0x15;//默认值0x00_0000
const int TIME4 = 0x16;//默认值0x00_0000
CONST int CLOCK _COUNT4 = 0x17;//默认值0x00_0000
const int Time5 = 0x18;//默认值0x00_0000
CONST int CLOCK _COUNT5 = 0x19;//默认值0x00_0000
const int TIVE6 = 0x1A;//默认值0x00_0000
CONST int CALIBRATION1 = 0x1B;//默认值0x00_0000
CONST int CALIBRATION2 = 0x1C;//默认值0x00_0000

 

tdc7200类{
专用:
浮点时钟周期= 1.0/EXTCLOCK;

公共:
uint32_t time1 = 0;  
uint32_t time2 = 0;
uint32_t Time3 = 0;
uint32_t time4 = 0;
uint32_t Time5 = 0;
uint32_t time6 = 0;

uint32_t 时钟计数1 = 0;
uint32_t 时钟计数2 = 0;
uint32_t 时钟计数3 = 0;
uint32_t 时钟计数4 = 0;
uint32_t 时钟计数5 = 0;

uint32_t CAL1 = 0;
uint32_t CAL2 = 0;

float tof1 = 0;
float tof2 = 0;
float tof3 = 0;
float tof4 = 0;
float tof5 = 0;

//读取8位寄存器
字节 readReg8 (字节地址){
字节 inByte = 0;
digitalWrite (csPin、low);

SPI.beginTransaction(SPISettings(SPIfrequency、MSBFIRST、SPI_MODE0));
//将芯片选择设置为低电平来选择器件:


SPI.transfer (address & 0x1f);
InByte = SPI.transfer (address);

digitalWrite (csPin、HIGH);
spi.endTransaction();

返回 inByte;

//读取24位寄存器
uint32_t readReg24 (字节地址){
长值= 0;
// CSB 需要在24位寄存器读取之间切换
SPI.beginTransaction(SPISettings(SPIfrequency、MSBFIRST、SPI_MODE0);// SPI Einstellungen setzen
digitalWrite (csPin、low);

spi.transfer (地址和0x1f);//Hintersten 5位不需要 angeschaut

长 MSB = SPI.transfer (address);// Ersten 8位
long MID = SPI.transfer (address);// Mittleren 8位
long lsb = spi.transfer (address);// Letzten / Niederwertigsten

值=(MSB << 16)+(MID << 8)+ lsb;  

spi.endTransaction();  
delayMicroseconds (5);
digitalWrite (csPin、HIGH);

返回值;

//写入寄存器
void writeReg (字节地址、字节值){
uint16_t test = 0;  
//将芯片选择设置为低电平来选择器件:

SPI.beginTransaction(SPISettings(SPIfrequency、MSBFIRST、SPI_MODE0));
digitalWrite (csPin、low);
//强制地址位6为1进行写操作
spi.transfer16 (((地址| 0x40)<< 8 |值);
TEST =(地址| 0x40)<< 8 |值;
serial.print ("---- TEST =");Serial.println (test、bin);

digitalWrite (csPin、HIGH);
spi.endTransaction();

//计算 ToF
float getTOF (uint32_t timeN、uint32_t timeN1、uint32_t clockcountN、uint32_t CAL1、uint32_t CAL2){// uint_32 = unsigned int
浮点 calCount =(CAL2 - CAL1)/(AVG_CYCLLES - 1.0);
serial.print ("clockperiod =");serial.println (clockperiod、8);
serial.print ("calCount =");serial.println (calCount);
float normLSB =(时钟周期/计算计数);
serial.print ("normLSB =");serial.println (normLSB、8);
float fehler = timeN-timeN1;
float tof temp = normLSB *(float (timeN)-(float) timeN1)+ clockcountN *时钟周期;
// float tof temp =(float timeN)* normLSB + clock_countN*时钟周期;  
serial.print ("tof _temp =");serial.println (tof _temp、16);
return tof temp;


};

#endif /* TDC7200_H *

 

Arduino 计划:

#include
#include "tdc7200.h"


int startpin = 4;
INT stoppin = 7;
INT 触发器引脚= 8;
INT ENABLE = 3;
int intb = 2;

CONST 字节 CLOCKOUT = 11;// MEGA2560上的时钟
字节 CONFIG1、CONFIG2、INT_STATUS;
字节 int_mask、coh、col、clockcoh、clockcol、 clockstopmaskh、clockstopmaskl;

 

void setup(){

//初始化 CLOCKOUT (OC1A)上的1MHz 时钟
引脚模式(CLOCKOUT、输出);
//设置计时器1
TCCR1A =位(COM1A0);//在比较匹配时切换 OC1A
TCCR1B =位(WGM12)|位(CS10);// CTC、无预分频
OCR1A = 7;//每个周期输出

//初始化 SPI

SPI.begin();//chip1Select = 53
//初始化序列
Serial.begin(19200);
//设置 CS 引脚输出
引脚模式(cspin、输出);
//初始化输出
引脚模式(使能、输出);
//digitalWrite (enable、low);
pinMode (startpin、输出);
digitalWrite (startpin、low);
PinMode (stoppin、输出);
digitalWrite (stoppin、low);
//初始化输入
引脚模式(INTB、输入);
PinMode (触发器引脚、输入);
//启动 TDC7200
digitalWrite (enable、low);
延迟(2);  
digitalWrite (enable、high);
延迟(2);

void loop(){
tdc7200芯片1;
digitalWrite (enable、low);
//将00000011写入配置1,为 MEASUREMENT1做好准备
chip1.writeReg (config1、B00000011);
//将 B01000011写入 CONFIG2四个停止位
// 000:单停止
// 001:两个停止
// 010:三个停止
// 011:四个停止
// 100:五个停止
chip1.writeReg (CONFIG2、B01000100);
//如果 CONFIG1/2正确,则读取
CONFIG1 =芯片1.readReg8 (CONFIG1);
CONFIG2 =芯片1.readReg8 (CONFIG2);


//等待触发信号= 1.
//while (digitalRead (triggerpin));
//发送开始
digitalWrite (startpin、HIGH);
digitalWrite (startpin、low);

delayMicroseconds (100);

//发送5个停止
对于(int i = 0;i <= 4;i++){
digitalWrite (stoppin、HIGH);
digitalWrite (stoppin、low);
delayMicroseconds (100);

//读取寄存器和计算值
chip1.time1 = chip1.readReg24 (Time1);
chip1.time2 =芯片1.readReg24 (Time2);
chip1.Time3 =芯片1.readReg24 (Time3);
chip1.time4 = chip1.readReg24 (TIME4);
chip1.Time5 =芯片1.readReg24 (Time5);
chip1.time6 = chip1.readReg24 (TIVE6);
chip1.clockcount1 = chip1.readReg24 (clock_Count1);
chip1.clockcount2 = chip1.readReg24 (clock_COUNT2);
chip1.clockcount3 = chip1.readReg24 (clock_COUNT3);
chip1.clockcount4 =芯片1.readReg24 (clock_COUNT4);
chip1.clockcount5 =芯片1.readReg24 (clock_COUNT5);  
chip1.cal1 = chip1.readReg24 (CALIBRATION1);
chip1.cal2 = chip1.readReg24 (CALIBRATION2);
serial.print("--校准值:");
serial.print (chip1.cal1);
serial.print ("、");
serial.println (chip1.cal2);

//读取寄存器结束


chip1.tof1 = chip1.getTOF (chip1.time1、chip1.time2、chip1.clockcount1、chip1.cal1、chip1.cal2);
chip1.tof2 = chip1.getTOF (chip1.time1、chip1.Time3、chip1.clockcount2、chip1.cal1、chip1.cal2);
chip1.tof3 = chip1.getTOF (chip1.time1、chip1.time4、chip1.clockcount3、chip1.cal1、chip1.cal2);
chip1.tof4 = chip1.getTOF (chip1.time1、chip1.Time5、chip1.clockcount4、chip1.cal1、chip1.cal2);
chip1.tof5 = chip1.getTOF (chip1.Time5、chip1.time6、chip1.clockcount5、chip1.cal1、chip1.cal2);

//TESTPRINT CONFIG1/2
//Serial.print ("config1 =");Serial.println (config1、bin);
//Serial.print ("CONFIG2 =");Serial.println (config2、bin);

serial.println();
serial.print("******** ");
serial.println();
serial.print ("* TOF1 =");
serial.print (chip1.tof1、8);serial.println ("*");
serial.print ("* TOF2 =");
serial.print (chip1.tof2、8);serial.println ("*");
serial.print ("* TOF3 =");
serial.print (chip1.tof3、8);serial.println ("*");
serial.print ("* TOF4 =");
serial.print (chip1.tof4、8);serial.println ("*");
serial.print ("* TOF5 =");
serial.print (chip1.tof5、8);serial.println ("*");
serial.print("******** ");
serial.println();

 


if (digitalRead (2)){
serial.println ("interupt");

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Patrick:

    如果您将 FORCE_CAL 设置为0 (默认值)、则如果测量因某种原因中断(最可能的原因是计数器溢出)、校准将不会完成。 我注意到您的计数器溢出设置不是默认的最大值 是否确定在达到计数器溢出设置之前接收到 STOP 信号?

    尝试将 FORCE_CAL 位设置为1 (CONFIG0位7)、这将强制 TDC7200针对每次测量进行校准、无论测量是否正确完成。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Scott、

    感谢您的回复。 我已将 FORCE_CAL 位设置为1、但仍然存在相同的问题、您的意思是"我注意到您的计数器溢出设置不是默认的最大值 是否确定在达到计数器溢出设置之前接收到 STOP 信号?"

    感谢你的帮助!