DSP数字示波器:dlog_4ch.h模块的使用方法

        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不能正常运行,仿真的时候会出错,比如说仿真会停止运行程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值