TI官方的dlog_4ch.h模块配合CCS,可以实现数字示波器的功能,适用于手边没有示波器的情况下,作如下介绍:
dlog-4ch.h文件中定义了数字示波器所需的数据类型、配置函数和运行示波器函数。可以实现四通道的波形数据记录,配合CCS的Graph功能可以绘制四通道的波形。dlog_4ch.h文件中的代码如下:
#ifndef DLOG_4CH_H
#define DLOG_4CH_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#ifndef __TMS320C28XX_CLA__
#include <math.h>
#else
#include <CLAmath.h>
#endif
//宏定义
#ifndef C2000_IEEE754_TYPES
#define C2000_IEEE754_TYPES
#ifdef __TI_EABI__
typedef float float32_t;
typedef double float64_t;
#else // TI COFF
typedef float float32_t;
typedef long double float64_t;
#endif // __TI_EABI__
#endif // C2000_IEEE754_TYPES
//定义四通道数据记录器结构体
typedef struct{
float32_t *inputPtr1;
float32_t *inputPtr2;
float32_t *inputPtr3;
float32_t *inputPtr4;
float32_t *outputPtr1;
float32_t *outputPtr2;
float32_t *outputPtr3;
float32_t *outputPtr4;
float32_t prevValue;
float32_t trigValue;
int16_t status;
int16_t preScalar;
int16_t skipCount;
int16_t size;
int16_t count;
}DLOG_4CH;
//函数功能:重置内部存储数据
//参数:DLOG_4CH结构体指针变量
static inline void DLOG_4CH_reset(DLOG_4CH *v)
{
v->prevValue=0;
v->trigValue=0;
v->status=0;
v->skipCount=0;
v->count=0;
}
//函数功能:配置DLOG_4CH模块
//! \param *v The pointer to DLOG_4CH structure pointer
//! \param input_ptr1 Pointer to data being buffered in the first buffer
//! \param input_ptr2 Pointer to data being buffered in the second buffer
//! \param input_ptr3 Pointer to data being buffered in the third buffer
//! \param input_ptr4 Pointer to data being buffered in the fourth buffer
//! \param output_ptr1 Pointer to where first array of buffered data is stored
//! \param output_ptr2 Pointer to where second array of buffered data is stored
//! \param output_ptr3 Pointer to where third array of buffered data is stored
//! \param output_ptr4 Pointer to where fourth array of buffered data is stored
//! \param size Data buffer size
//! \param trigValue Trigger point for the datalogger
//! \param preScalar Variable to skip data logging points
//! \return None
static inline void DLOG_4CH_config(DLOG_4CH *v,
float32_t *inputPtr1,
float32_t *inputPtr2,
float32_t *inputPtr3,
float32_t *inputPtr4,
float32_t *outputPtr1,
float32_t *outputPtr2,
float32_t *outputPtr3,
float32_t *outputPtr4,
float32_t size,
float32_t trigValue,
float32_t preScalar
)
{
v->inputPtr1 = inputPtr1;
v->inputPtr2 = inputPtr2;
v->inputPtr3 = inputPtr3;
v->inputPtr4 = inputPtr4;
v->outputPtr1 = outputPtr1;
v->outputPtr2 = outputPtr2;
v->outputPtr3 = outputPtr3;
v->outputPtr4 = outputPtr4;
v->prevValue = (float32_t)(0);
v->trigValue = (float32_t)(trigValue);
v->status = 1;
v->preScalar = preScalar;
v->skipCount = 0;
v->size = size;
v->count = 0;
}
//函数功能:使用DLOG_4CH模块
//参数:DLOG_4CH结构体指针变量
static inline void DLOG_4CH_run(DLOG_4CH *v)
{
switch(v->status)
{
//
// wait for trigger
//
case 1:
if(*v->inputPtr1 > v->trigValue && v->prevValue < v->trigValue)
{
//
// rising edge detected start logging data
//
v->status=2;
}
break;
case 2:
v->skipCount++;
if(v->skipCount==v->preScalar)
{
v->skipCount=0;
v->outputPtr1[v->count]=*v->inputPtr1;
v->outputPtr2[v->count]=*v->inputPtr2;
v->outputPtr3[v->count]=*v->inputPtr3;
v->outputPtr4[v->count]=*v->inputPtr4;
v->count++;
if(v->count==v->size)
{
v->count=0;
v->status=1;
}
}
break;
}
v->prevValue=*v->inputPtr1;
}
#ifdef __cplusplus
}
#endif // extern "C"
#endif // end of _DLOG_4CH_H_ definition
1.定义dlog_4ch模块需要的变量
//Dlog模块对应的变量
float32_t DlogCh1Input = 0 ;
float32_t DlogCh2Input = 0 ;
float32_t DlogCh3Input = 0 ;
float32_t DlogCh4Input = 0 ;
float32_t DlogCh1Output[200] ;//注意缓存数据的数组大小不能太大,要考虑dsp存储的大小
float32_t DlogCh2Output[200] ;
float32_t DlogCh3Output[200] ;
float32_t DlogCh4Output[100] ;
float32_t Dlog_cnt= 0 ;
DLOG_4CH dlog ;
2.初始化dlog_4ch模块
//****初始化Dlog****
DLOG_4CH_reset(&dlog) ;//复位四通道数据记录器
DLOG_4CH_config(&dlog ,&DlogCh1Input ,&DlogCh2Input ,&DlogCh3Input,&DlogCh4Input,
DlogCh1Output, DlogCh2Output, DlogCh3Output ,DlogCh4Output,200,0.5,1);
//配置四通道数据记录器,数据缓存区大小为200,数据记录器的触发点为第一个数据,数据记录不分频连续记录
3.使用 dlog_4ch模块
void DlogRecord(void) //Dlog数据记录函数
{
//----将变量波形进行量化,配合CCS的Graph功能进行显示-----
Dlog_cnt += 1;
if(Dlog_cnt == 202)
{
Dlog_cnt = 0;
}
DlogCh1Input = Dlog_cnt ;
DlogCh2Input = Pos_speed.Speed_Mr_Rpm ;//Pos_speed.ElecTheta 滑模观测器估计的转速
DlogCh3Input = Pos_speed.ElecTheta ;//记录转子位置
DlogCh4Input = Speed_E.EstimatedSpeedRpm ;//EQEP编码器计算的实际转速
DLOG_4CH_run(&dlog) ;//使用dlog模块
}
4.需要注意的事项
dlog_4ch模块不能记录太多数据,如果dlog_4ch模块数据缓存区设置过大可能会导致dsp不能正常运行,仿真的时候会出错,比如说仿真会停止运行程序。