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.

[参考译文] TMS320F2810:与 TMS320F2810的源代码 LVDT 接口

Guru**** 2604775 points
Other Parts Discussed in Thread: TMS320F280049, TMS320F2810, CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/677810/tms320f2810-source-code-lvdt-interface-with-tms320f2810

器件型号:TMS320F2810
主题中讨论的其他器件:TMS320F280049controlSUITEC2000WARE

你(们)好。

我正在寻找 SPRA946应用手册中使用的完整项目源代码。

它涉及到 LVDT 与 DSP 的接口。

DSP 是 TMS320F2810。 我想修改 TMS320F280049的代码。

有人可以帮帮我吗?

非常感谢!

纪尧姆

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

    很遗憾、我发现我不允许在论坛上发布源代码。 该守则的有关部分载於应用报告第23-25页。 但是、通过这一点以及下面的变量声明、您应该能够在 F280049上运行类似的东西。

    //变量声明
    volatile struct IBUFFER SineRec = buffer_defaults;//正弦波表指针
    int * QuadPoint = NULLADDR;//指向正交元素的指针
    int PWM_Duty;// PWM 占空比
    int ADC_Result;// A/D 转换器结果
    int adc_input;//双极左对齐 ADC 读数
    long AvgSum = 0;//运行总和
    int AvgSumDelta;//平均缓冲区和调整
    int InputOffset;//输入偏移=平均输入
    Int 归一输入;//归一化输入读数(去除偏移)

    // IQ 变量
    _IQ InputVoltage = 0;//瞬时输入值
    _IQ RefVecal;//参考矢量-实数部分
    _iq RefVecImag;//参考矢量-虚部
    _IQInpVecal;//输入矢量-实数部分
    _iq InpVecImag;//输入矢量-虚部
    _IQ 幅度;//输入矢量的幅度

    //相位检测
    bool RefSign;//参考信号的符号
    bool InpSign;//返回信号的符号
    bool InPhase;//信号处于相位
    INT PhaseCount = 0;//相位检测计数器
    int PhaseBuffer[PHASE_Buffer_length];//相位检测缓冲器
    struct IBUFFER PhbRec = buffer_defaults;//相位缓冲器指针

    移植到 F280049时将涉及一些工作、您必须开发一个接口板、以采用与报告中所述类似的方式调节 LVDT 信号。 通过利用较新器件上的浮点内核和 TMU、可以提高性能。

    此致、

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

    我已开发出仅具有存储器和 DAC 输出+第一个 ordre LP 滤波器的发生器正弦波。
    在代码中、我看到了校正函数。
    如果您可以、我对代码和函数有一些疑问:

    1-输入偏移消除和偏移校正之间有何差异
    2 -在计时器2中断功能页23中、您在哪里计算偏移校正变量? 可以提供代码吗?
    3-如何计算增益调整并将结果应用于 GainCorrection 变量?

    非常感谢您的帮助!

    祝您度过美好的一天!

    此致、

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

    您好 Guillaume、

    1-输入偏移消除和偏移校正之间有何差异

    "偏移消除"是指来自换能器次级绕组的交流输入。 使用的解调方法只有在交流输入以零为中心时才有效。 由于我们的 ADC 具有0V 至+3V 的范围、我们希望信号以+1.5V 为中心。 实际上、硬件可能无法做到这一点、因此软件会在解调之前对测量的信号应用小偏移:
    标称输入=(ADC_INPUT - InputOffset)<< 4;//标准化 ADC 读数
    通过在4个完整的交流周期(160kHz 采样、5kHz 输入频率、128个样本[请参阅下面的 AVG_Buffer_length 定义])内对输入信号求平均值来计算变量"InputOffset"。

    "OffsetCorrection"是用于校正最终位置测量中任何固定偏移的变量。 当系统被校准时、这个将由用户负载加载(见下面)。


    2 -在计时器2中断功能页23中、您在哪里计算偏移校正变量? 可以提供代码吗?

    在代码中、我刚才将其声明为:
    _IQ 偏移校正= 4.02;//固定偏移校正

    3-如何计算增益调整并将结果应用于 GainCorrection 变量?

    与偏移类似、"GainCorrection"是用户在传感器校准时确定的固定数字。 我测试了:
    _IQ GainCorrection = 10.3;//固定增益校正

    该代码还允许线性映射(第25页的"cLinMap")来校正非线性增益。 除了固定的偏移和增益、这也会在校准期间存储。 代码在表中的点之间进行插值以查找偏移。 初始化为零的映射为:

    //线性校正映射:
    //条目是对位中"位移"的有符号修正
    #pragma DATA_SECTION (cLinMap、"LinearityMap")
    int cLinMap[LINMAP_LENG]={
    0、//[0]-50 mm
    0、//[1]-45 mm
    0、//[2]-40 mm
    0、//[3]-35 mm
    0、//[4]-30 mm
    0、//[5]-25 mm
    0、//[6]-20 mm
    0、//[7]-15 mm
    0、//[8]-10 mm
    0、//[9]-5 mm
    0、//[10] 0 mm
    0、//[11]+5 mm
    0、//[12]+10 mm
    0、//[13]+15 mm
    0、//[14]+20 mm
    0、//[15]+25 mm
    0、//[16]+30 mm
    0、//[17]+35 mm
    0、//[18]+40 mm
    0、//[19]+45 mm
    0 //[20]+50 mm
    };

    静态 UINT 步长=(0xFFFF / LINMAP_LENGTH);//线性除法的大小
    _IQ 行程;//更正了位移


    头文件中有一些与之相关的#defines:

    #define sine_cycle_length 32 //正弦查找表的长度
    #define Quadr_length (sine_cycle_length>2)//一个象限的长度
    #define Quad_Table_length (sine_cycle_length +象限_length)//正交表的总长度
    #define AVG_buffer_length 128 //输入平均缓冲区
    #define PHASE_BUFFER_LENGTH 32 //相位检测缓冲器的长度
    #define PLECK_buffer_length 512 //平滑缓冲区的长度
    #define LINMAP_LENGTH 21 //线性映射的长度

    //正弦波查找表
    extern int QuadratureTable[Quad_table_length];


    本来会很高兴把这个项目寄给你,但无论如何,我希望这一点能澄清一点。 如果您有其他问题、请回帖。

    此致、

    Richard

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

    您好 Richard、

    您的帮助非常有用!

    非常感谢您提供的代码 d。

    LVDT 位置的算法类似于真 RMS 值计算。 我已经看到一个具有直流真 RMS 转换器电压的 LVDT 接口。

    我的项目进展得更快、我会再发布一个问题。

    此致。

    纪尧姆

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

    您好 Richard、

    我对输入失调电压补偿有疑问。 我看到了函数:NextIntPoint()

    您能否发布此函数的代码?

    您如何使用小代码创建不带"for "命令的循环存储器?

    此致

    纪尧姆

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

    缓冲区支持在 buffer.h 头文件中完成。 很抱歉、这个冗长的帖子中包含以下代码:

    /* buffer.h */

    #ifndef GEN_C_buffer_H
    #define GEN_C_buffer_H

    #include "stdcdefs.h"//标准 C 定义

    #define DEFAULT_BUFFER_LENGTH0x0080//默认缓冲器长度

    //整数缓冲结构
    结构 IBUFFER{
    int *fptr;
    int *lptr;
    int *dptr;
    };

    //长缓冲结构
    struct LBUFFER{
    long *fptr;
    long *lptr;
    长*dptr;
    };

    //_IQ 类型缓冲器结构
    #ifdef __IQMATHLIB_H_include__
    struct IQBUFFER{
    _iq *fptr;
    _iq *lptr;
    _iq *dptr;
    };
    #endif
    //解除引用为:*(xxx.fptr)或*(xxx->fptr)
    // buffer_length =(xxx.lptr - xxx.fptr)+ 1;

    //缓冲区指针结构的默认地址
    #define buffer_defaults{0x00000000、\
    0x00000000、\
    0x00000000\

    //使用:struct LBUFFER buffername = buffer_defaults;

    //函数原型
    // 16位
    extern void FlushIntBuffer(struct IBUFFER *bufrec);
    extern void AssignIntBuffer (struct IBUFFER * bufrec、int buffer[]、UINT buflen);
    内联 void LogIntDataPoint (struct IBUFFER * bufrec、int 数据点);
    内联空 NextIntPoint (struct IBUFFER *bufrec);

    // 32位
    extern void FlushLongBuffer (struct LBUFFER * bufrec);
    extern void AssignLongBuffer (struct LBUFFER * bufrec、long buffer[]、UINT buflen);
    内联 void LogLongDataPoint (struct LBUFFER * bufrec、long 数据点);
    内联空 NextLongPoint (struct LBUFFER *bufrec);

    /***内联函数定义***/
    // xxx.dptr 指向第一个未使用的内存位置

    //将16位数据记录到缓冲区
    //LogDataPoint (&dlog,(长) x);
    内联空 LogIntDataPoint (struct IBUFFER * bufrec、int 数据点)

    *(bufrec->dptr)=数据点;//将数据点写入缓冲区
    (bufrec->dptr == bufrec->lptr)? (bufrec->dptr = bufrec->fptr ):bufrec->dptr++;//修改数据指针


    //修改指向下一个元素的16位数据指针
    内联空 NextIntPoint (struct IBUFFER *bufrec)

    (bufrec->dptr == bufrec->lptr)? (bufrec->dptr = bufrec->fptr ):bufrec->dptr++;//修改数据指针



    //将32位数据记录到缓冲区
    //LogDataPoint (&dlog,(长) x);
    内联空 LogLongDataPoint (struct LBUFFER * bufrec、long 数据点)

    *(bufrec->dptr)=数据点;//将数据点写入缓冲区
    (bufrec->dptr == bufrec->lptr)? (bufrec->dptr = bufrec->fptr ):bufrec->dptr++;//修改数据指针



    //修改指向下一个元素的32位数据指针
    内联空 NextLongPoint (struct LBUFFER * bufrec)

    (bufrec->dptr == bufrec->lptr)? (bufrec->dptr = bufrec->fptr ):bufrec->dptr++;//修改数据指针


    #endif // GEN_C_buffer_H

    /*文件结束*/


    在 workisr.c 中、行...

    NextIntPoint ((struct IBUFFER *) SineRec);//对齐正弦表指针
    PWM_Duty =*(SineRec.dptr);//下一个正弦点

    ...只需将行数据指针设置到缓冲区中的下一个元素并提取该数据。

    此致、

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

    您好 Richard、

    谢谢! 工作正常! 我正在处理调制部分。 我对此有一些疑问。

    1 -什么是 IQ 格式? 您对它有什么描述吗?  它就像正交? 您是否使用了?

    2行中的"InputVoltage  =(_IQ)((long) NormalInput<<5);//转换为全局 IQ 格式   您有一个在 Norminput 中包含数字数据的示例以及 InputVoltage 中的结果?

    3-为什么需要将 NormalInput 的值乘以32?

    我稍后将提出其他问题。

    祝你度过美好的一天!

    此致

    纪尧姆

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

    IQ math 是一个用于处理 C 语言定点数据的库。"IQ"表示"整数颈动脉"-表示形式的两个部分。 如果您下载 controlSUITE 或 C2000Ware 并导航至 libraries -> math、您将找到包含文档的库。

    我对包括 InputVoltage 在内的大多数变量使用了 IQ24格式、但 NormalInput 是一个有符号16位整数、表示校正后的左对齐12位 ADC 读数:

    标称输入=(ADC_INPUT - InputOffset)<< 4;

    NormalInput 的 MSB 是符号位(如果为负则为1)。 这是因为 ADC_Input 与 ISR 第三行中的0x8000异或。

    要将其转换为 IQ24格式、需要将其拼写为32位_IQ 并再左移5位:

    InputVoltage =(_IQ)((long)标称输入<5);

    此致、

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

    如果您要迁移到 F280049、IQ 数学库应使这成为一个简单的端口、至少对于这部分代码而言-您只需将头文件"IQmathLib.h"中的 MATH_TYPE 从 IQ_Math 更改为 FLOAT_Math 即可。 它的编译应该像这样好(我认为)。

    此致、

    Richard