工作环境
软件平台:Texas Instruments - Sensor Controller Studio 2.9.0.208
硬件平台:CC1312R1
一、工程创建
1.芯片选择
点击create new projects,进行工程名字,路径设置和芯片的选择,此处选择CC2672P3。
2.IO属性设置
上图是ti提供的帮助文档的位置,点击之后我们可以找到有关io属性设置的内容,具体如下:
也就是说当你在Task resource页面内调用IO时,Ti内部会自动生成一个代表该IO的变量。比如说,在此TDC测量的例子中,我配置了3个IO:
一个叫EV的事件输出IO,两个待测信号输入IO signalA和signalB。那么Ti就会自动生成一个变量AUXIO_O_EV,AUXIO_I_SIGNAL_A,AUXIO_I_SIGNAL_B,这会在后面的程序中用到。
上图是Task resource页面中用到的模块,建议都勾上,不然后面代码编译时可能找不到对应资源。
3.常量变量设置
由于TDC的测量会产生对应的测量输出,因此需要在Constant and Data Strutures中添加两个output变量,并为其命名,这个变量会在后面的Execution Code中用到。
4.启动代码,执行代码和结束代码
TDC调用的一些实例和说明可以在左侧导航栏的start page--->tool documentation--->Sensor controller help 中找到,下面附上我修改后的TDC 测试代码内容。
initialization code:
// Select 2 x 48 MHz from RCOSC_HF as TDC counter clock source
tdcSetCntSource(TDC_CNTSRC_96M_RCOSC);
gpioCfgMode(AUXIO_I_SIGNAL_A,GPIO_MODE_INPUT);
gpioCfgMode(AUXIO_I_SIGNAL_B,GPIO_MODE_INPUT);
gpioCfgMode(AUXIO_O_EV,GPIO_MODE_OUTPUT);
execution code:
// Enable the TDC with:
// - Start trigger on the first rising signal edge
// - Stop trigger on the first subsequent falling signal edge
tdcSetTriggers(TDC_STARTTRIG_AUXIO_HIGH_BASE + AUXIO_I_SIGNAL_B, TDC_STOPTRIG_AUXIO_LOW_BASE + AUXIO_I_SIGNAL_B, 0);
tdcEnable();
// Start the measurement (the signal must be low at this point, and we measure the width of one high pulse)
tdcArm(TDC_START_ASYNC);
// The pulse can now occur on AUXIO_I_SIGNAL
// Wait for the TDC stop trigger for 1000 us
tdcWaitUs(1000);
//using the internal io as a event and sent it to the AUXIO_I_SIGNAL_B
gpioClearOutput(AUXIO_O_EV);
fwDelayUs(50); //system delay function
gpioSetOutput(AUXIO_O_EV);
fwDelayUs(50);
gpioClearOutput(AUXIO_O_EV);
fwDelayUs(50);
// Get the TDC counter value
tdcGetValue(output.pulseWidthH, output.pulseWidthL);
注意,执行代码中的TDC_STARTTRIG_AUXIO_HIGH_BASE,TDC_STOPTRIG_AUXIO_LOW_BASE 都是Ti内部已经定义好的变量,当你在Task resource页面中勾选了TDC模块,就会有该变量的定义。
termination code:
// Disable TDC
tdcDisable();
5.IO实际地址映射与连接
二、实际测量
1.实际物理连接
将子系统的板子拆下来之后可以看到对应的DIO引脚位置,现在我们内部有个50微秒的Event从DIO5输出,并送到signalB对应的DIO15进行测量,所以我们只需要用杜邦线将DIO5和DIO15连接好,即可用TDC测量DIO5的脉冲宽度。连接好后实际效果如下图:
2.代码检验与烧录
如果代码有误,则会在code generator页面报一个红色错误,若正常则是像我上图页面一样。
到最后一步了,将板子通过usb线连接电脑(注意需要装驱动识别TI的板子),设置好Task iteration action sequence(要重复执行的东西),然后点击序号1圈起来的按键连接板子,点击序号2圈起来的以执行初始化代码,最后点击序号3圈起来的以重复执行execution codes。即可看到结果。
结果如图所示,我再执行代码中将event的波形脉宽设置为50us,由于使用96Mhz的时钟进行双沿采样,所以每一个计数对应1/96*1000=10.41ns,得到的结果几乎一致。本人后续还会更新一些FPGA产生的纳秒级的脉宽的测量。
写于2024年2月27日。
3.FPGA测试捕捉结果
使用FPGA产生了1us高电平的波形送到板子中进行测量,发现结果如上图所示,输出的测量数据大部分时候稳定在95左右,小部分时间会有波动。95*10.4ns=988.95,误差较小。
上图为600ns波形的检测结果,逻辑分析仪抓到的信号脉宽为594ns,输出结果大部分时候保持在56左右,偶尔会跳到976的错误测量数值,经计算,56*10.41=582.96ns,误差较小。
上图为160ns波形的检测结果,逻辑分析仪抓到的信号脉宽为156ns左右,TDC输出结果大部分时候保持在18,18*10.41=187.38ns,误差开始增加。TI文档中说明测量的脉宽需要≥292ns,但还是能测出160ns的脉宽,不过此时也接近了TI TDC测量的极限值。
上图为120ns波形的检测结果,逻辑分析仪抓到的信号脉宽为125ns左右,不过此时TDC的输出结果产生了非常剧烈的波动,从17,18到964之间一直不断跳变,数据完全不可用。由此可见TI CC1312R1 TDC能测量的最大精度在160ns左右。