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.

IDDK_PM_Servo_F2837x 电机控制开发板问题:

Other Parts Discussed in Thread: CONTROLSUITE

HI!你好!目前在官网购买一款电机控制开发板,配套的代码是IDDK_PM_Servo_F2837x.,我们的目的是使用38279做伺服电机控制,使用的是电阻采样电流,多摩川绝对值编码器。

问题:

1、在文件IDDK_PM_Servo_F2837x-Settings.h中有定义电机参数:

// Define the electrical motor parametes (Estun Servomotor)
#define RS 2.35 // Stator resistance (ohm)
#define RR // Rotor resistance (ohm)
#define LS 0.0065 // Stator inductance (H)
#define LR // Rotor inductance (H)
#define LM // Magnatizing inductance (H)
#define POLES 8 // Number of poles
// Number of poles

// Define the base quantites
#define BASE_VOLTAGE 236.14 // Base peak phase voltage (volt), Vdc/sqrt(3)
#define BASE_SHUNT_CURRENT 9.95 // Base peak phase current (amp), Max. measurable peak curr.
#define BASE_LEM_CURRENT 12.0 // ----- do -----

但是在程序中找不到使用参数的函数,如找不到哪里使用 RS、LS、BASE_VOLTAGE 等。

并且在文件IDDK_PM_Servo_F2837x.C中,进行IPARK变换到SVGENDQ_MACRO(svgen1)调动,都没有找到关于电机参数R 、L。

// ------------------------------------------------------------------------------
ipark1.Qs = pi_iq.Out;
ipark1.Ds = pi_id.Out;
ipark1.Sine = park1.Sine;
ipark1.Cosine = park1.Cosine;
IPARK_MACRO(ipark1);

// ------------------------------------------------------------------------------
// Connect inputs of the SVGEN_DQ module and call the space-vector gen. macro
// ------------------------------------------------------------------------------
svgen1.Ualpha = ipark1.Alpha;
svgen1.Ubeta = ipark1.Beta;
SVGENDQ_MACRO(svgen1)

2、在在文件IDDK_PM_Servo_F2837x.C中,有调用采集电流后的值,可是使用电阻如何采电流部分没有找到,(应该存在不同临界点划分,采电流算法)。

current_sensor[SHUNT_CURRENT_SENSE-1].As = (float)IFB_SV_PPB* ADC_PU_PPB_SCALE_FACTOR;
current_sensor[SHUNT_CURRENT_SENSE-1].Bs = (float)IFB_SW_PPB* ADC_PU_PPB_SCALE_FACTOR;
current_sensor[SHUNT_CURRENT_SENSE-1].Cs = -current_sensor[SHUNT_CURRENT_SENSE-1].As

3、另外,与该套程序相关的汇编指令到哪里下载?以下段代码看不懂代表什么意思。

_currentSensorSuite:
                                    ;* AR4 assigned to $O$C3
                                    ;* AL assigned to $O$C4
                                   ;* AL assigned to $O$C5
                                     $C$DW$199 .dwtag DW_TAG_variable
                                     .dwattr   $C$DW$199, DW_AT_name("temp")
                                    .dwattr    $C$DW$199, DW_AT_TI_symbol_name("_temp")
                                    .dwattr    $C$DW$199, DW_AT_type(*$C$DW$T$978)
                                    .dwattr    $C$DW$199, DW_AT_location[DW_OP_breg20 -1]

以上是使用IDDK_PM_Servo_F2837x 电机控制开发板问题,希望能给与支持,多谢!QQ:3340086096

  • 对于问题

    1.ti确实好多例程里很多变量用不到,一方面由于是这些代码可能是从其他版本的程序中拷贝过来的,另一方面,ti的工程师会在这个平台上开发一些新的算法,比如参数辨识,无传感等等,那么在这个时候这几个没用到的变量就显得很关键了。只不过目前realease的代码使用不到而已。

    2在IDDK_PM_Servo_F2837x-Settings.h中一些宏定义定义了关于电流采样的一些设置 比如用电阻采样还是霍尔采样,电阻值大小等

  • SP:你好!

    1、在我的理解中,使用矢量控制中,无论是带绝对值编码器还是无传感(我使用其它方案平台,无论有感还是无感,电机参数R,L都参与运算的。),也都应该是用到电机参数的!我想确定一下,使用IDDK_PM_Servo_F2837x-这套代码,使用传感器,是否还需要电机参数R、L?使用位置闭环控制是否还有电机惯性参数参与运算?

    2、在在文件IDDK_PM_Servo_F2837x.C中,有调用采集电流后的值,可是使用电阻如何采电流部分没有找到,(应该存在不同临界点划分,采电流算法)。下面这两个电流,仅是最终采集到的到的A、B两相电流。

    current_sensor[SHUNT_CURRENT_SENSE-1].As = (float)IFB_SV_PPB* ADC_PU_PPB_SCALE_FACTOR;
    current_sensor[SHUNT_CURRENT_SENSE-1].Bs = (float)IFB_SW_PPB* ADC_PU_PPB_SCALE_FACTOR;
    current_sensor[SHUNT_CURRENT_SENSE-1].Cs = -current_sensor[SHUNT_CURRENT_SENSE-1].As

    另外,使用互感器与使用电阻采样电流的算法是不一样,请问电阻采电流的那部分算法代码在哪里啊?还是软件封起来,不对外开放?

    3、另外,与该套程序相关的汇编指令到哪里下载?以下段代码看不懂代表什么意思;在Sensored FOC of PMSM_IDDK.pdf中也没有说明。寻找一些汇编语言,也没有找相匹配的汇编指令(可能是没有找到资料)。

    _currentSensorSuite:
                                        ;* AR4 assigned to $O$C3
                                        ;* AL assigned to $O$C4
                                       ;* AL assigned to $O$C5
                                         $C$DW$199 .dwtag DW_TAG_variable
                                         .dwattr   $C$DW$199, DW_AT_name("temp")
                                        .dwattr    $C$DW$199, DW_AT_TI_symbol_name("_temp")
                                        .dwattr    $C$DW$199, DW_AT_type(*$C$DW$T$978)
                                        .dwattr    $C$DW$199, DW_AT_location[DW_OP_breg20 -1]

    4、使用IDDK_PM_Servo_F2837x.的开发板,是否有(GUI)上位机调试界面?如果有在哪里下载?

    我在官网上没有找到,在controlSUITE安装路径中也没有找到。

    以上是目前碰到的一些问题,麻烦你费心支持一下!多谢!


  • 你好

    1、这个位置环没有用到电机的RL等参数 具体你可以看这个工程中带的pdf文档,第38页是整个闭环系统框图。也没有涉及到电机惯量辨识。

    2、我不理解你说的电阻采样电流算法的的是什么意思?你是想知道模拟量值是怎么转换为实际标幺值的吗?我的理解是这样的,在ti例程的矢量变换算法里,电流部分的处理过程就是 电阻采样->减去offset值->乘以某个转换系数转换成对应的标幺值。

    current_sensor[LEM_CURRENT_SENSE-1].As   = (float)IFB_LEMV_PPB* ADC_PU_PPB_SCALE_FACTOR * LEM_TO_SHUNT;

    以这句代码为例,在执行完以后,current_sensor[SHUNT_CURRENT_SENSE-1].As的值已经转换为了标幺值。具体你可以看看每个变量代表的意义以及电路图。程序中不管是用电阻采样还是霍尔采样 只要更改一个相应的宏定义值即可。

    3.这套程序没有相应的汇编代码,最多只能通过ccs看到反汇编后的代码,毕竟汇编指令已经没有多少人在用了,也不利于产品推广维护。目前还没有对应的gui界面。


  • SP:首先感谢你的回复!

    2、使用电阻进行电流采样时,应该有在PWM有效点上采集的才可以在运算中使用;而矢量控制时,三路上下桥的PWM脉宽是根据位置在变换的,电流采样点要始终保持在有效点上,就要进行处理跳过MOS开关毛刺时间和电阻噪音时间,再同过边界计算何时才是ADC才电流的合适时间点,这就是我所谓的电阻电流采样算法,而在该程序中,我没有找到。

    current_sensor[SHUNT_CURRENT_SENSE-1].As = (float)IFB_SV_PPB* ADC_PU_PPB_SCALE_FACTOR;
    current_sensor[SHUNT_CURRENT_SENSE-1].Bs = (float)IFB_SW_PPB* ADC_PU_PPB_SCALE_FACTOR;

    而程序中只有(#define IFB_SV_PPB    ((signed int)AdcaResultRegs.ADCPPB1RESULT.all))采样电流结果,前面何时采样电流没有体现出来!而不是选用哪种电流采样模式。

    谢谢!

  • 你好 明白你的意思了。是这样的 不知道你有没有调试过ti之前的一些电机例程。ti的电机例程中 一般都选择pwm的下溢中断时刻采样电流,根据svpwm算法 此时上桥是关闭的 下桥正好开通 而且是开通了一段时间  而采样电阻也位于下桥 此时采样电流最佳 你可以看一下程序中对于pwm的配置和adc的配置

  • SP:

    首先感谢你在百忙中给予支持,其它问题基本清楚了,只是对于电流采样,还是有点疑问,电流采样的确是要在下桥打开是采电流的,如果仅仅是在PWM配置和ADC配置上初始化上看,应该是看不到的,如果是在程序运行中或中断中有相应ADC配置改动,进行采电流,那就应该是我需要研究的,由于程序没有分析完,所以不是很清楚,若有疑问再来请教!再次感谢你的回复!谢谢!

  • SP:

    你好!我们目前使用IDDK_PM_Servo_F2837x 电机控制开发板连接多摩川伺服电机,多摩川伺服电机使用的是NIC协议,而在开发板子代码中有以下几种编码器定义,我不知道选哪种可以与电机通讯。(之前与Ti的工程师沟通过,说TI的开发板支持多摩川伺服通讯协议)

    // Select Position Feedback Option
    #define QEP_POS_ENCODER 1
    #define RESOLVER_POS_ENCODER 2
    #define BISS_POS_ENCODER 3
    #define ENDAT_POS_ENCODER 4
    #define SINCOS_POS_ENCODER 5

    或在其它位置有定义?

  • 你好 目前iddk支持的编码器类型就这五种,其中3和4是绝对值编码器 支持的协议分别为biss协议和EnData协议 你最好要确认下你那款伺服电机编码器是不是这个协议,或者说nic协议是不是以上两种协议的一个分支。 因为biss和endata是行业内用的比较多的两种编码协议 。而且像多摩川这种企业的产品肯定是针对不同的市场有不同的协议 。你最好根据你电机的型号查一查他具体用的协议是什么

  • SP:

    我问过多摩川代理了,他们就一种通讯协议,没有多种;之前Ti工程师说,TI支持多摩川伺服协议的。电机型号是TS4609N2331E200.

  • Tamagawa的编码器解码方案TI已经开发完成并发布了,请更新controlsuite进行升级然后在以下路径查找:

    C:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat

  • SP :

    你好!我在你提供的目录下没有找到Tamagawa;只有以下文件:

  • 请再仔细查看我的回复。

  • SP:

    你好!我使用tformat编码器例子,可以检测到编码器反馈的位置了。我现在将多摩川编码器的例子,添加到IDDK_PM_Servo_F2837x 代码中,遇到以下编译错误,显示是重复定义,折腾好久没有解决!另外我添加头文件,使用绝对路径添加的。

  • 有没有可能是编码器的库文件里用到了它,而你的应用程序也去使用它,就造成重复定义和使用。

    你可以查看一下文档确认编码器的库使用到了哪些资源,那你的应用程序应该是不能再去使用。

  • 恩!;有道理!你帮我看看下图: ,一直解决不了!

  • 建议你仔细阅读一下C:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat\Doc路径下的文档再按照要求进行移植,既能解决你现在的问题,还可以规避以后可能出现新的问题。

  • C:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat\Doc路径下的文档PM_tformat_Lib-sprui71.pdf里的5 Resource Requirements章节下Table 6. Resource Requirements列出了实现解码所使用到的芯片资源,包括软件和硬件的,你需要在应用程序里避免使用它们。其中有些资源是不能配置,固定为解码所需的,有些是可配置的,请对照该表进行使用。

  • 你好!我现在把所有其它的代码都屏蔽掉了,编译运行了,但是接收不到编码器数据, tformatData.dataReady != 1)始终不满足条件,

    retval1_Dx = PM_tformat_setupCommand (DATAID3, 0, 0, 0);   

    PM_tformat_startOperation();  

     while (tformatData.dataReady != 1) {}  

     retval1_Dx = PM_tformat_receiveData(DATAID3);

    而一样的代码,在例子工程中的就可以读取编码器数据。代码完全一样!

  • 你使用的硬件是一样的吗?编码器的电源是哪里来的?在TI的IDDK EVM上,它需要通过外部的直流源提供。

  • 硬件是一样的!供电是MCU管脚供电的,目前发现是CMD文件需要修改,不知道如何修改!其它应该没有问题,因为代码比较多,原来的CMD文件不能使用。

  • 请确保编码器的电源是使用外部直流电源供电。

    软件部分的移植请仔细阅读并完全遵循C:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat\Doc路径下的两个文档进行。

  • 电源确定有的,我已经发现问题了,就是CMD文件的问题,与你所说的C:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat\Doc路径下的两个文档已经没有关系了!就是现在的CMD文件,不知道如何改动!

    1、例子中的CMD:


    MEMORY
    {
    PAGE 0 : /* Program Memory */
    /* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */
    /* BEGIN is used for the "boot to Flash" bootloader mode */

    BEGIN : origin = 0x080000, length = 0x000002
    RAMM0 : origin = 0x000122, length = 0x0002DE
    RAMD0 : origin = 0x00B000, length = 0x000800
    RAMLS0 : origin = 0x008000, length = 0x000800
    RAMLS1 : origin = 0x008800, length = 0x000800
    RAMLS2 : origin = 0x009000, length = 0x000800
    RAMLS3 : origin = 0x009800, length = 0x000800
    RAMLS4 : origin = 0x00A000, length = 0x000800
    RAMGS14 : origin = 0x01A000, length = 0x001000
    RAMGS15 : origin = 0x01B000, length = 0x001000
    RESET : origin = 0x3FFFC0, length = 0x000002

    /* Flash sectors */
    FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */
    FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */
    FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */
    FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */
    FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */
    FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */
    FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */
    FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */
    FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */
    FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */
    FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */
    FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */
    FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */
    FLASHN : origin = 0x0BE000, length = 0x002000 /* on-chip Flash */

    PAGE 1 : /* Data Memory */
    /* Memory (RAM/FLASH) blocks can be moved to PAGE0 for program allocation */

    BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part of M0, BOOT rom will use this for stack */
    RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
    RAMD1 : origin = 0x00B800, length = 0x000800

    RAMLS5 : origin = 0x00A800, length = 0x000800

    RAMGS0 : origin = 0x00C000, length = 0x001000
    RAMGS1 : origin = 0x00D000, length = 0x001000
    RAMGS2 : origin = 0x00E000, length = 0x001000
    RAMGS3 : origin = 0x00F000, length = 0x001000
    RAMGS4 : origin = 0x010000, length = 0x001000
    RAMGS5 : origin = 0x011000, length = 0x001000
    RAMGS6 : origin = 0x012000, length = 0x001000
    RAMGS7 : origin = 0x013000, length = 0x001000
    RAMGS8 : origin = 0x014000, length = 0x001000
    RAMGS9 : origin = 0x015000, length = 0x001000
    RAMGS10 : origin = 0x016000, length = 0x001000
    RAMGS11 : origin = 0x017000, length = 0x001000
    RAMGS12 : origin = 0x018000, length = 0x001000
    RAMGS13 : origin = 0x019000, length = 0x001000


    CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
    CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400
    }


    SECTIONS
    {
    /* Allocate program areas: */
    .cinit : > FLASHB PAGE = 0, ALIGN(4)
    .pinit : > FLASHB, PAGE = 0, ALIGN(4)
    .text : >> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0, ALIGN(4)
    codestart : > BEGIN PAGE = 0, ALIGN(4)
    ramfuncs : LOAD = FLASHD,
    RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
    LOAD_START(_RamfuncsLoadStart),
    LOAD_SIZE(_RamfuncsLoadSize),
    LOAD_END(_RamfuncsLoadEnd),
    RUN_START(_RamfuncsRunStart),
    RUN_SIZE(_RamfuncsRunSize),
    RUN_END(_RamfuncsRunEnd),
    PAGE = 0, ALIGN(4)

    #ifdef __TI_COMPILER_VERSION__
    #if __TI_COMPILER_VERSION__ >= 15009000
    .TI.ramfunc : {} LOAD = FLASHD,
    RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
    LOAD_START(_RamfuncsLoadStart),
    LOAD_SIZE(_RamfuncsLoadSize),
    LOAD_END(_RamfuncsLoadEnd),
    RUN_START(_RamfuncsRunStart),
    RUN_SIZE(_RamfuncsRunSize),
    RUN_END(_RamfuncsRunEnd),
    PAGE = 0, ALIGN(4)
    #endif
    #endif

    /* Allocate uninitalized data sections: */
    .stack : > RAMM1 PAGE = 1
    .ebss : >> RAMLS5 | RAMGS0 | RAMGS1 PAGE = 1
    .esysmem : > RAMLS5 PAGE = 1

    /* Initalized sections go in Flash */
    .econst : >> FLASHF | FLASHG | FLASHH PAGE = 0, ALIGN(4)
    .switch : > FLASHB PAGE = 0, ALIGN(4)

    .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */

    Filter_RegsFile : > RAMGS0, PAGE = 1

    SHARERAMGS0 : > RAMGS0, PAGE = 1
    SHARERAMGS1 : > RAMGS1, PAGE = 1

    /* The following section definitions are required when using the IPC API Drivers */
    GROUP : > CPU1TOCPU2RAM, PAGE = 1
    {
    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX
    }

    GROUP : > CPU2TOCPU1RAM, PAGE = 1
    {
    GETBUFFER : TYPE = DSECT
    GETWRITEIDX : TYPE = DSECT
    PUTREADIDX : TYPE = DSECT
    }

    }

    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */



    2、 IDDK_PM_Servo_F2837x的CMD文件添加黄色部分,可以读取编码器信号,但是与其他部分代码有冲突:


    MEMORY
    {
    PAGE 0 : /* Program Memory */
    /* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */
    /* BEGIN is used for the "boot to Flash" bootloader mode */

    BEGIN : origin = 0x080000, length = 0x000002
    RAMM0 : origin = 0x000122, length = 0x0002DE
    RAMD0 : origin = 0x00B000, length = 0x000800
    RAMLS0 : origin = 0x008000, length = 0x000800
    RAMLS1 : origin = 0x008800, length = 0x000800
    RAMLS2 : origin = 0x009000, length = 0x000800
    RAMLS3 : origin = 0x009800, length = 0x000800
    RAMLS4 : origin = 0x00A000, length = 0x000800
    RAMGS14 : origin = 0x01A000, length = 0x001000
    RAMGS15 : origin = 0x01B000, length = 0x001000
    RESET : origin = 0x3FFFC0, length = 0x000002

    /* Flash sectors */
    FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */
    FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */
    FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */
    FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */
    FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */
    FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */
    FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */
    FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */
    FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */
    FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */
    FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */
    FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */
    FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */
    FLASHN : origin = 0x0BE000, length = 0x002000 /* on-chip Flash */

    PAGE 1 : /* Data Memory */
    /* Memory (RAM/FLASH) blocks can be moved to PAGE0 for program allocation */

    BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part of M0, BOOT rom will use this for stack */

    /*******************************添加部分**********************************************/
    CLB1_LOGICCFG : origin = 0x003000, length = 0x000040
    CLB1_LOGICCTL : origin = 0x003100, length = 0x000040
    CLB1_DATAXCHG : origin = 0x003200, length = 0x000200
    CLB2_LOGICCFG : origin = 0x003400, length = 0x000040
    CLB2_LOGICCTL : origin = 0x003500, length = 0x000040
    CLB2_DATAXCHG : origin = 0x003600, length = 0x000200
    CLB3_LOGICCFG : origin = 0x003800, length = 0x000040
    CLB3_LOGICCTL : origin = 0x003900, length = 0x000040
    CLB3_DATAXCHG : origin = 0x003A00, length = 0x000200
    CLB4_LOGICCFG : origin = 0x003C00, length = 0x000040
    CLB4_LOGICCTL : origin = 0x003D00, length = 0x000040
    CLB4_DATAXCHG : origin = 0x003E00, length = 0x000200
    /**************************************************************************/


    RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
    RAMD1 : origin = 0x00B800, length = 0x000800

    RAMLS5 : origin = 0x00A800, length = 0x000800

    RAMGS0 : origin = 0x00C000, length = 0x001000
    RAMGS1 : origin = 0x00D000, length = 0x001000
    RAMGS2 : origin = 0x00E000, length = 0x001000
    RAMGS3 : origin = 0x00F000, length = 0x001000
    RAMGS4 : origin = 0x010000, length = 0x001000
    RAMGS5 : origin = 0x011000, length = 0x001000
    RAMGS6 : origin = 0x012000, length = 0x001000
    RAMGS7 : origin = 0x013000, length = 0x001000
    RAMGS8 : origin = 0x014000, length = 0x001000
    RAMGS9 : origin = 0x015000, length = 0x001000
    RAMGS10 : origin = 0x016000, length = 0x001000
    RAMGS11 : origin = 0x017000, length = 0x001000
    RAMGS12 : origin = 0x018000, length = 0x001000
    RAMGS13 : origin = 0x019000, length = 0x001000


    CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
    CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400
    }


    SECTIONS
    {

    /* Allocate program areas: */
    .cinit : > FLASHB PAGE = 0, ALIGN(4)
    .pinit : > FLASHB, PAGE = 0, ALIGN(4)
    .text : >> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0, ALIGN(4)
    codestart : > BEGIN PAGE = 0, ALIGN(4)
    ramfuncs : LOAD = FLASHD,
    RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
    LOAD_START(_RamfuncsLoadStart),
    LOAD_SIZE(_RamfuncsLoadSize),
    LOAD_END(_RamfuncsLoadEnd),
    RUN_START(_RamfuncsRunStart),
    RUN_SIZE(_RamfuncsRunSize),
    RUN_END(_RamfuncsRunEnd),
    PAGE = 0, ALIGN(4)

    /* Allocate uninitalized data sections: */
    .stack : > RAMM1 PAGE = 1
    .ebss : >> RAMLS5 | RAMGS0 | RAMGS1 PAGE = 1
    .esysmem : > RAMLS5 PAGE = 1

    /* Initalized sections go in Flash */
    .econst : >> FLASHF | FLASHG | FLASHH PAGE = 0, ALIGN(4)
    .switch : > FLASHB PAGE = 0, ALIGN(4)

    .reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, */

    Filter_RegsFile : > RAMGS0, PAGE = 1

    SHARERAMGS0 : > RAMGS0, PAGE = 1
    SHARERAMGS1 : > RAMGS1, PAGE = 1
    ramgs0 : > RAMGS0, PAGE = 1
    ramgs1 : > RAMGS1, PAGE = 1

    #ifdef __TI_COMPILER_VERSION
    #if __TI_COMPILER_VERSION >= 15009000
    .TI.ramfunc : {} LOAD = FLASHD,
    RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
    LOAD_START(_RamfuncsLoadStart),
    LOAD_SIZE(_RamfuncsLoadSize),
    LOAD_END(_RamfuncsLoadEnd),
    RUN_START(_RamfuncsRunStart),
    RUN_SIZE(_RamfuncsRunSize),
    RUN_END(_RamfuncsRunEnd),
    PAGE = 0, ALIGN(4)
    #endif
    #endif

    /* The following section definitions are required when using the IPC API Drivers */
    GROUP : > CPU1TOCPU2RAM, PAGE = 1
    {
    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX
    }

    GROUP : > CPU2TOCPU1RAM, PAGE = 1
    {
    GETBUFFER : TYPE = DSECT
    GETWRITEIDX : TYPE = DSECT
    PUTREADIDX : TYPE = DSECT
    }

    /* The following section definition are for SDFM examples */
    Filter1_RegsFile : > RAMGS1, PAGE = 1, fill=0x1111
    Filter2_RegsFile : > RAMGS2, PAGE = 1, fill=0x2222
    Filter3_RegsFile : > RAMGS3, PAGE = 1, fill=0x3333
    Filter4_RegsFile : > RAMGS4, PAGE = 1, fill=0x4444
    Difference_RegsFile : >RAMGS5, PAGE = 1, fill=0x3333

    //==============================================添加部分========================
    Clb1LogicCfgRegsFile : > CLB1_LOGICCFG, PAGE = 1
    Clb1LogicCtrlRegsFile : > CLB1_LOGICCTL, PAGE = 1
    Clb1DataExchgRegsFile : > CLB1_DATAXCHG, PAGE = 1
    Clb2LogicCfgRegsFile : > CLB2_LOGICCFG, PAGE = 1
    Clb2LogicCtrlRegsFile : > CLB2_LOGICCTL, PAGE = 1
    Clb2DataExchgRegsFile : > CLB2_DATAXCHG, PAGE = 1
    Clb3LogicCfgRegsFile : > CLB3_LOGICCFG, PAGE = 1
    Clb3LogicCtrlRegsFile : > CLB3_LOGICCTL, PAGE = 1
    Clb3DataExchgRegsFile : > CLB3_DATAXCHG, PAGE = 1
    Clb4LogicCfgRegsFile : > CLB4_LOGICCFG, PAGE = 1
    Clb4LogicCtrlRegsFile : > CLB4_LOGICCTL, PAGE = 1
    Clb4DataExchgRegsFile : > CLB4_DATAXCHG, PAGE = 1
    //===========================================================================

    }

    /*
    //===========================================================================
    // End of file.
    //===========================================================================


    3、但是与其他部分代码有冲突:



  • 你说的两个.cmd文件到底是哪里的?能不能给出它在controlsuite下的完整路径?

    另外,下次能否通过上传文件的形式共享而不要把代码全部贴在这里?

    .

    我刚刚将这些拷出去进行了对比,这里的两个不同都是必须的:

    一是与CLB相关的部分,也就是你标黄的部分,建议直接全部保留;

    二是以下分配,我不知道代码在哪里,但是应该是有使用到ramgs0和ramgs1:

    ramgs0 : > RAMGS0, PAGE = 1
    ramgs1 : > RAMGS1, PAGE = 1


    .


    至于你提到的冲突,你仔细看它的内容就会发现,这与.cmd文件中的内容没有任何关系,你需要另外去解决。

    第二三条提示你NBITS_POLY1和POLY1这两个宏存在不兼容的重复定义,那是用于接收到编码器数据并且解析后进行CRC校验的多项式参数,因为Endat和Tamagawa所使用的不同,才会有这个差别,但是我很奇怪,你的代码里怎么会有Endat协议的代码和文件呢?根据它提示的路径,你包含的还是v01_00_00_00版本下的PM_endat22_Include.h头文件,而不是v01_01_00_00版本下的,你应该需要将它排除到工程之外去。

    最后一条报警是说你有嵌套使用注释,应该是说最后一行的这个内容:

    /*
    //===========================================================================
    // End of file.
    //===========================================================================

    建议在一行内使用"//"或者"/*...*/"进行注释,而不是两才配合使用,比如你这里缺少了一个"*/".

  • 你好!我将完成情况描述一下:我想使用目录D:\ti\controlSUITE\development_kits\TMDSIDDK_v2.0下的IDDK_PM_Servo_F2837x_v2_00_00_00代码做伺服位置控制,由于里面没有多摩川编码器代码,所以我将D:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat目录下的代码添加到IDDK_PM_Servo_F2837x_v2_00_00_00代码中。

    遇到如下一些问题:

    一、单独使用IDDK_PM_Servo_F2837x_v2_00_00_00代码,使用Flash模式,可以在线仿真,问题如下:

    问题1:想使用电阻采样电流的,在IDDK_PM_Servo_F2837x-Settings.h代码中,没有找到采样电阻大小的设置,开发板子上是20毫欧采样电阻,程序中没有找到。

    只有如下字样:

    // LEM    1.0pu current ==> 12.0A -> 2048 counts ==> 8A -> 1365

    // SHUNT  1.0pu current ==> 9.95A -> 2048 counts ==> 8A -> 1647

     #define LEM(A)     2048*A/BASE_LEM_CURRENT

     #define SHUNT(A)   2048*A/BASE_SHUNT_CURRENT

    问题2:上次问过,使用电阻何时采集电流的,得到回复是在下桥臂打开时,开始采电流,但是对应具体代码段位置,没有找到,麻烦指点一下。

    问题3:在IDDK_PM_Servo_F2837x.C文件中,想使用根据Sensored FOC of PMSM_IDDK_v2.pdf(目录:D:\ti\controlSUITE\development_kits\TMDSIDDK_v2.0\IDDK_PM_Servo_F2837x_v2_00_00_00\~Docs)说明,设置#define   BUILDLEVEL   LEVEL1进行测试,发现波形与手册中的波形一样,差异很大。Sensored FOC of PMSM_IDDK_v2.pdf手册中的其中这句话‘Importing’ the file ‘Variables_IDDK_Level1.txt’ from root directory.  不知道如何操作。

    二、使用多摩川编码器和代码(D:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat目录下的例子),可以读取编码器位置和转数。

    1、当把代码移植到IDDK_PM_Servo_F2837x_v2_00_00_00代码中时,将IDDK_PM_Servo_F2837x.C文件中代码全部删除掉,将PM_tformat-Main.c中代码复制到IDDK_PM_Servo_F2837x.C中,保证程序都是一样的,发现读不到数据,后来进行对比一下cmd文件,将目录D:\ti\controlSUITE\device_support\F2837xD\v170\F2837xD_common\cmd下的2837xD_FLASH_lnk_cpu1.cmd与目录D:\ti\controlSUITE\libs\app_libs\position_manager\v01_00_00_00\tformat\examples\PM_tformat_systemtest下的F2837xD_Headers_clb_cpu1.cmd进行对比,发现内容不一样,就将2837xD_FLASH_lnk_cpu1.cmd中添加了F2837xD_Headers_clb_cpu1.cmd里面的内容,如同上次所述的黄色部分。

    代码可以读取到编码器的位置和转数。证明问题点在这里。

    2、而将I恢复DDK_PM_Servo_F2837x.C原始代码,在里面添加编码器代码时,发现有以下报警:

    所以认为是CMD文件需要改动,不知道如何改动。

    初始使用CCS平台,麻烦您帮忙以下!

     

     

  • dxss dx 说:

    一、单独使用IDDK_PM_Servo_F2837x_v2_00_00_00代码,使用Flash模式,可以在线仿真,问题如下:

    这些问题建议你单独提问,让大家帮你查看。我也并没有研究所有的东西,要是一个个都去看,没有大半天也不一定能给你准确的建议。

    .

    dxss dx 说:

    二、使用多摩川编码器和代码(D:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat目录下的例子),可以读取编码器位置和转数。

    1、当把代码移植到IDDK_PM_Servo_F2837x_v2_00_00_00代码中时,将IDDK_PM_Servo_F2837x.C文件中代码全部删除掉,将PM_tformat-Main.c中代码复制到IDDK_PM_Servo_F2837x.C中,保证程序都是一样的,发现读不到数据,后来进行对比一下cmd文件,将目录D:\ti\controlSUITE\device_support\F2837xD\v170\F2837xD_common\cmd下的2837xD_FLASH_lnk_cpu1.cmd与目录D:\ti\controlSUITE\libs\app_libs\position_manager\v01_00_00_00\tformat\examples\PM_tformat_systemtest下的F2837xD_Headers_clb_cpu1.cmd进行对比,发现内容不一样,就将2837xD_FLASH_lnk_cpu1.cmd中添加了F2837xD_Headers_clb_cpu1.cmd里面的内容,如同上次所述的黄色部分。

    代码可以读取到编码器的位置和转数。证明问题点在这里。

    我不确定你为什么要这样做?C:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat\Doc路径下PM_tformat_Lib-sprui71文档的4 Using PM_tformat Library章节详细说明了,在一个现有工程上,如何添加T format的库文件和支持文件进行调试,为什么不按照建议的标准流程来做呢?

    即便不这样做,你也需要有基本的程序架构的了解,才能自己去随意修改,不过之前的回复里,我已经把问题给你分析清楚了。

    dxss dx 说:

    2、而将I恢复DDK_PM_Servo_F2837x.C原始代码,在里面添加编码器代码时,发现有以下报警:

    这些寄存器都没有被定义,你需要增加寄存器对应的.cmd文件,比如C:\ti\controlSUITE\device_support\F2837xD\v210\F2837xD_headers\cmd路径下的F2837xD_Headers_nonBIOS_cpu1.cmd文件,不过很可能添加后又会出现新的问题,建议你还是按照上面文档里的步骤进行操作。

  • 你好!我安装controlSUITE后,目录头文件目录不是在C:\ti\controlSUITE\device_support\F2837xD\v210\F2837xD_headers\cmd,而是在C:\ti\controlSUITE\device_support\F2837xD\v170\F2837xD_headers\cmd,不知道如何改动!

    添加编码器代码,的确是按照C:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat\Doc路径下PM_tformat_Lib-sprui71文档的4 Using PM_tformat Library章节详细说明了操作的!

  • 你好!我安装controlSUITE后,目录头文件目录不是在C:\ti\controlSUITE\device_support\F2837xD\v210\F2837xD_headers\cmd,而是在C:\ti\controlSUITE\device_support\F2837xD\v170\F2837xD_headers\cmd,不知道如何改动!

    添加编码器代码,的确是按照C:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat\Doc路径下PM_tformat_Lib-sprui71文档的4 Using PM_tformat Library章节详细说明了操作的!

  • 请升级controlsuite软件就会有其它在v170版本之后所有版本的例程和头文件,cmd文件等。

  • 已经更新到最新的了,有V210,可是路径还是V170.

  • 你需要在编译选项里修改头文件的包含路径呀,上面提到的文档里4.1 Adding tformat Lib to the Project章节就说明了如何添加库文件及对应的路径,对于头文件也是一样的使用方法。

  • 已经更新到最新的了,有V210,可是路径还是V170.安装三台电脑上试试的,更新后都是一样的路径:

    C:\ti\controlSUITE\device_support\F2837xD\v170\F2837xD_common\cmd

    C:\ti\controlSUITE\libs\app_libs\position_manager\v01_00_00_00\tformat

    升级后而不是:

    C:\ti\controlSUITE\device_support\F2837xD\v210\F2837xD_common\cmd

    C:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat

  • 你可以仔细看一下我上一个回复吗?你需要按照手册要求去工程属性里添加库文件和相关文件的路径。

  • 你好!很感谢您的热情回复!

     

  • 如果这里的问题都已经确认或解决了,请帮忙确认答案并关闭帖子。谢谢!

  • 你好!感谢你的回复!还有母线电压的采样问题,以下是母线电压配置部分,调动母线电压从20V到30V过程中,使用示波器观察MCU端口,有电压抬升过程,而使用ADC读取时,发现ADC没有变化,配置如下:黄色部分(C:\ti\controlSUITE\development_kits\TMDSIDDK_v2.0\IDDK_PM_Servo_F2837x_v2_00_00_00目录下的IDDK_PM_Servo_F2837x.c文件中

    //TODO ADC Configuration
    // ****************************************************************************
    // ****************************************************************************
    //Configure the ADC and power it up 配置ADC(ADC-A、ADC-B、ADC-C、ADC-D)
    ConfigureADC();//ADC配置:ADC-A、ADC-B、ADC-C、ADC-D,该函数没有涉及到管脚配置。

    //Select the channels to convert and end of conversion flag
    //Current Measurements has multiple options

    EALLOW;

    // Analog signals that are sampled
    // Ifb-SV ADC A4/C+
    // Ifb-SW ADC B4/C+
    // LEM V ADC A2/C+
    // LEM W ADC B2/C+
    // R_SIN ADC D1
    // R_COS ADC C1
    // Vfb-U ADC C3
    // Vfb-V ADC A3
    // Vfb-W ADC B3
    // Vfb-Bus ADC B0

    // Analog Signals brought in but not sampled
    // Ifb-SU ADC C2/C+ (& A5 not used)
    // SC-A2 ADC C0/C+
    // SC-B2 ADC D0/C+
    // SC-R ADC D2/C+
    // Bus Volt ADC B0

    // On piccolo 133ns for ACQPS
    // hencce ACQPS on soprano is 133/5~30

    // Configure the SOC0 on ADC a-d
    #if (CGND == HOT)
    // Shunt Motor Currents (SV) @ A4 反馈电流Ifb-SV
    // ********************************
    AdcaRegs.ADCSOC0CTL.bit.CHSEL = 4; // SOC0 will convert pin A4 采样电流管脚A4
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // trigger on ePWM1 SOCA/C
    // Configure the post processing block (PPB) to eliminate subtraction related calculation
    AdcaRegs.ADCPPB1CONFIG.bit.CONFIG = 0; // PPB is associated with SOC0
    AdcaRegs.ADCPPB1OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run

    // Shunt Motor Currents (SW) @ B4 反馈电流Ifb-SW
    // ********************************
    AdcbRegs.ADCSOC0CTL.bit.CHSEL = 4; // SOC0 will convert pin B4 采样电流管脚B4
    AdcbRegs.ADCSOC0CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles 在系统时钟周期采样窗口
    AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // trigger on ePWM1 SOCA/C 触发源选择
    // Configure PPB to eliminate subtraction related calculation
    AdcbRegs.ADCPPB1CONFIG.bit.CONFIG = 0; // PPB is associated with SOC0
    AdcbRegs.ADCPPB1OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run
    #endif
    // Resolver Fbk - Cosine @ C1 R_COS
    // ********************************
    AdccRegs.ADCSOC0CTL.bit.CHSEL = 15; // SOC0 will convert pin C15
    AdccRegs.ADCSOC0CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 15; // trigger on ePWM6 SOCA/C
    // Configure PPB to eliminate subtraction related calculation
    AdccRegs.ADCPPB1CONFIG.bit.CONFIG = 0; // PPB is associated with SOC0
    AdccRegs.ADCPPB1OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run

    // Resolver Fbk - sine @ D1 R_SIN
    // ********************************
    AdcdRegs.ADCSOC0CTL.bit.CHSEL = 1; // SOC0 will convert pin D1
    AdcdRegs.ADCSOC0CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 15; // trigger on ePWM6 SOCA/C
    // Configure PPB to eliminate subtraction related calculation
    AdcdRegs.ADCPPB1CONFIG.bit.CONFIG = 0; // PPB is associated with SOC0
    AdcdRegs.ADCPPB1OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run

    // LEM motor current LEM-V @ at A2 电流LEM V
    // ********************************
    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 2; // SOC1 will convert pin A2
    AdcaRegs.ADCSOC1CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // trigger on ePWM1 SOCA/C
    // Configure PPB to eliminate subtraction related calculation
    AdcaRegs.ADCPPB2CONFIG.bit.CONFIG = 1; // PPB is associated with SOC1
    AdcaRegs.ADCPPB2OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run

    // LEM motor current LEM-W @ at B2 电流LEM W
    // ********************************
    AdcbRegs.ADCSOC1CTL.bit.CHSEL = 2; // SOC0 will convert pin B2
    AdcbRegs.ADCSOC1CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // trigger on ePWM1 SOCA/C
    // Configure PPB to eliminate subtraction related calculation
    AdcbRegs.ADCPPB2CONFIG.bit.CONFIG = 1; // PPB is associated with SOC1
    AdcbRegs.ADCPPB2OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run

    // Phase Voltage Vfb-V @ A3 反馈电压Vfb-V
    // ***************************
    AdcaRegs.ADCSOC2CTL.bit.CHSEL = 3; // SOC2 will convert pin A3,
    AdcaRegs.ADCSOC2CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5; // trigger on ePWM1 SOCA/C
    // Configure PPB to eliminate subtraction related calculation
    AdcaRegs.ADCPPB3CONFIG.bit.CONFIG = 1; // PPB is associated with SOC2
    AdcaRegs.ADCPPB3OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run

    // Phase Voltage Vfb-W @ B3 反馈电压Vfb-W
    // ***************************
    AdcbRegs.ADCSOC2CTL.bit.CHSEL = 3; // SOC2 will convert pin B3
    AdcbRegs.ADCSOC2CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 5; // trigger on ePWM1 SOCA/C
    // Configure PPB to eliminate subtraction related calculation
    AdcbRegs.ADCPPB3CONFIG.bit.CONFIG = 1; // PPB is associated with SOC2
    AdcbRegs.ADCPPB3OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run

    // Phase Voltage Vfb-U @ C3 反馈电压Vfb-U
    // ****************************
    AdccRegs.ADCSOC2CTL.bit.CHSEL = 3; // SOC2 will convert pin C3
    AdccRegs.ADCSOC2CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdccRegs.ADCSOC2CTL.bit.TRIGSEL = 5; // trigger on ePWM1 SOCA/C
    // Configure PPB to eliminate subtraction related calculation
    AdccRegs.ADCPPB3CONFIG.bit.CONFIG = 1; // PPB is associated with SOC2
    AdccRegs.ADCPPB3OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run

    // Bus Voltage Feedback at B0 (not used) 母线电压反馈
    // **************************************
    AdcbRegs.ADCSOC3CTL.bit.CHSEL = 0; // SOC3 will convert pin B0
    AdcbRegs.ADCSOC3CTL.bit.ACQPS = 30; // sample window in SYSCLK cycles
    AdcbRegs.ADCSOC3CTL.bit.TRIGSEL = 5; // trigger on ePWM1 SOCA/C   如何从手册上看到是ePWM1 ?在手册上没有找到,还是可以任意连接ePWM1 ~ePWM12呢? 

    //源程序没有这两句,添加后进行仿真,旋转母线电压20V~30V,使用示波器观察MCU端口有电压变化,而软件读取ADCbResultRegs.ADCPPB4RESULT 中的数据始终是2244附近值。

    AdcbRegs.ADCPPB4CONFIG.bit.CONFIG = 1; //dx PPB is associated with SOC2   //源程序没有这个
    AdcbRegs.ADCPPB4OFFCAL.bit.OFFCAL = 0; //dx Write zero to this for now till offset ISR is run////源程序没有这个

    // ******************************************************
    // static analog trim for all ADCs (A, B, C and D)
    // *******************************************************
    adc_cal=(int*)0x0000743F;
    *adc_cal=0x7000;
    adc_cal=(int*)0x000074BF;
    *adc_cal=0x7000;
    adc_cal=(int*)0x0000753F;
    *adc_cal=0x7000;
    adc_cal=(int*)0x000075BF;
    *adc_cal=0x7000;

    // Setting up link from EPWM to ADC
    EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD; // Select SOC from counter at ctr = 0 开始转换一个选择
    EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // Generate pulse on 1st even EPWMxSOCA周期选择
    EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group 使能SOC在A组

    EPwm6Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD; // Select SOC from counter at ctr = 0
    EPwm6Regs.ETPS.bit.SOCAPRD = ET_1ST; // Generate pulse on 1st even
    EPwm6Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group使能SOC在A组

    EPwm11Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPA;//INT on PRD event
    EPwm11Regs.ETSEL.bit.INTEN = 1;// Enable INT EPWMxINTn 使能
    EPwm11Regs.ETPS.bit.INTPRD = ET_1ST;// Generate INT on every event EPWMxINTn 周期选择

    // SETUP DACS DAC设置
    DacaRegs.DACCTL.bit.DACREFSEL = REFERENCE_VREF;//DAC选择 为什么这里面选择1?
    DacaRegs.DACCTL.bit.LOADMODE = 1; // enable value change only on sync signal 使能仅在同步信号上更改
    //Enable DAC output 使能DAC输出
    DacaRegs.DACOUTEN.bit.DACOUTEN = 1;
    DacaRegs.DACCTL.bit.SYNCSEL = 5; // sync sel 5 meanse sync from pwm 6 DAC PWM同步选择PWM6
    DacaRegs.DACVALS.bit.DACVALS = 1024; //DAC影子寄存器输出

    DacbRegs.DACCTL.bit.DACREFSEL = REFERENCE_VREF; //DAC参考选择
    //Enable DAC output 使能DAC输出
    DacbRegs.DACOUTEN.bit.DACOUTEN = 1;
    DacbRegs.DACVALS.bit.DACVALS = 1024;

    DaccRegs.DACCTL.bit.DACREFSEL = REFERENCE_VREF;
    //Enable DAC output DAC使能输出
    DaccRegs.DACOUTEN.bit.DACOUTEN = 1; //DAC输出使能
    DaccRegs.DACVALS.bit.DACVALS = 1024; //DAC影子输出
    EDIS;

    // ****************************************************************************
    // ****************************************************************************
    //TODO Sigma Delta Initialization
    // ****************************************************************************
    // ****************************************************************************
    // Setup GPIO for SD current measurement 设置管脚为SD电流测量
    GPIO_SetupPinOptions(48, GPIO_INPUT, GPIO_ASYNC);
    GPIO_SetupPinMux(48,0,7); //GPIO-48 SD-D1

    GPIO_SetupPinOptions(49, GPIO_INPUT, GPIO_ASYNC);
    GPIO_SetupPinMux(49,0,7); //GPIO-49 SD-C1

    GPIO_SetupPinOptions(50, GPIO_INPUT, GPIO_ASYNC);
    GPIO_SetupPinMux(50,0,7); //GPIO-50 SD-D2

    GPIO_SetupPinOptions(51, GPIO_INPUT, GPIO_ASYNC);
    GPIO_SetupPinMux(51,0,7); //GPIO-51 SD-C2

    // Setup GPIO for SD voltage measurement SD电压测量
    GPIO_SetupPinOptions(52, GPIO_INPUT, GPIO_ASYNC);
    GPIO_SetupPinMux(52,0,7); //GPIO-52 SD-D3

    GPIO_SetupPinOptions(53, GPIO_INPUT, GPIO_ASYNC);
    GPIO_SetupPinMux(53,0,7); //GPIO-53 SD-C3

    /*******************************************************/
    /* Input Control Module */
    /*******************************************************/
    //Configure Input Control Mode: Modulator Clock rate = Modulator data rate
    Sdfm_configureInputCtrl(1,FILTER1,MODE_0);
    Sdfm_configureInputCtrl(1,FILTER2,MODE_0);
    Sdfm_configureInputCtrl(1,FILTER3,MODE_0);

    /*******************************************************/
    /* Comparator Module */
    /*******************************************************/
    //Comparator HLT and LLT
    //Configure Comparator module's comparator filter type and comparator's OSR value,
    // high level threshold, low level threshold
    Sdfm_configureComparator(1, FILTER1, SINC3, OSR_32, HLT, LLT);
    Sdfm_configureComparator(1, FILTER2, SINC3, OSR_32, HLT, LLT);
    Sdfm_configureComparator(1, FILTER3, SINC3, OSR_32, HLT, LLT);

    /*******************************************************/
    /* Sinc filter Module */
    /*******************************************************/
    //Configure Data filter modules filter type, OSR value and enable / disable data filter
    // 16 bit data representation is chosen for OSR 128 using Sinc3, from the table in the TRM
    // the max value represented for OSR 128 using sinc 3 is +/-2097152 i.e. 2^21
    // to represent this in 16 bit format where the first bit is sign shift by 6 bits
    Sdfm_configureData_filter(1, FILTER1, FILTER_ENABLE, SINC3, OSR_RATE, DATA_16_BIT, SHIFT_6_BITS);
    Sdfm_configureData_filter(1, FILTER2, FILTER_ENABLE, SINC3, OSR_RATE, DATA_16_BIT, SHIFT_6_BITS);
    Sdfm_configureData_filter(1, FILTER3, FILTER_ENABLE, SINC3, OSR_RATE, DATA_16_BIT, SHIFT_6_BITS);

    //PWM11.CMPC, PWM11.CMPD, PWM12.CMPC and PWM12.CMPD signals cannot synchronize the filters. This option is not being used in this example.
    Sdfm_configureExternalreset(1,FILTER_1_EXT_RESET_ENABLE, FILTER_2_EXT_RESET_ENABLE, FILTER_3_EXT_RESET_ENABLE, FILTER_4_EXT_RESET_ENABLE);

    // Enable master filter bit of the SDFM module 1
    Sdfm_enableMFE(1);

    // ****************************************************************************
    // ****************************************************************************
    // Initialize QEP module 初始化QEP模块
    // ****************************************************************************
    // ****************************************************************************
    // Setup GPIO for QEP operation
    GPIO_SetupPinOptions(20, GPIO_INPUT, GPIO_SYNC);
    GPIO_SetupPinMux(20,0,1);//GPIO-20 QEP1A

    GPIO_SetupPinOptions(21, GPIO_INPUT, GPIO_SYNC);
    GPIO_SetupPinMux(21,0,1);//GPIO-21 QEP1B

    GPIO_SetupPinOptions(22, GPIO_INPUT, GPIO_SYNC);
    GPIO_SetupPinMux(22,0,1);//GPIO-22 QEP1S

    GPIO_SetupPinOptions(23, GPIO_INPUT, GPIO_SYNC);
    GPIO_SetupPinMux(23,0,1);//GPIO-23 QEP1I

    // ****************************************************************************
    // ****************************************************************************
    // To profile use GPIO 42 and GPIO43 (gen purpose)
    // ****************************************************************************
    // ****************************************************************************
    //configure LED
    GPIO_SetupPinOptions(34, GPIO_OUTPUT, GPIO_ASYNC);
    GPIO_SetupPinMux(34,0,0);//GPIO-34 LED

    GPIO_SetupPinOptions(42, GPIO_OUTPUT, GPIO_ASYNC);
    GPIO_SetupPinMux(42,0,0);//GPIO-42 LED

    GPIO_SetupPinOptions(43, GPIO_OUTPUT, GPIO_ASYNC);
    GPIO_SetupPinMux(43,0,0);//GPIO-43 LED

    // ****************************************************************************
    // ****************************************************************************
    // Paramaeter Initialisation
    // ****************************************************************************
    // ****************************************************************************

    // Init QEP parameters 正交编码器参数
    qep1.LineEncoder = 2500; // these are the number of slots in the QEP encoder
    qep1.MechScaler = _IQ30(0.25/qep1.LineEncoder);
    qep1.PolePairs = POLES/2; //电机极对数
    qep1.CalibratedAngle = 0;
    QEP_INIT_MACRO(1,qep1)
    EQep1Regs.QEPCTL.bit.IEI = 0; // disable POSCNT=POSINIT @ Index

    // Init RESOLVER parameters 旋变参数
    resolver1.StepsPerTurn = RESOLVER_STEPS_PER_TURN;
    resolver1.MechScaler = 1.0; //_IQ30(1.0/resolver1.StepsPerTurn);
    resolver1.PolePairs = POLES/2; //电机极对数

    // Init BiSS-C parameters
    biss1.PolePairs = POLES/2; //电机极对数
    // Init ABS parameters
    absdat1.PolePairs = POLES/2; //电机极对数

    // Init EnDat22 parameters
    endat1.PolePairs = POLES/2; //电机极对数

    baseParamsInit(); // initialise all parameters 旋变参数初始化
    derivParamsCal(); // set up derivative loop parameters 旋变参数计算
    init_resolver_Float(); //初始化旋变

    // Initialize the Speed module for speed calculation from QEP/RESOLVER
    speed1.K1 = _IQ21(1/(BASE_FREQ*T));
    speed1.K2 = _IQ(1/(1+T*2*PI*5)); // Low-pass cut-off frequency
    speed1.K3 = _IQ(1)-speed1.K2;
    speed1.BaseRpm = 120*(BASE_FREQ/POLES);//计算速度值

    // Initialize the RAMPGEN module //初始化斜坡触发模块
    rg1.StepAngleMax = _IQ(BASE_FREQ*T);

    // Initialize the PI module for position 位置PI初始化
    pi_pos.Kp = _IQ(1.0); //_IQ(10.0);
    pi_pos.Ki = _IQ(0.001); //_IQ(T*SpeedLoopPrescaler/0.3);
    pi_pos.Umax = _IQ(1.0); //位置最大限幅值
    pi_pos.Umin = _IQ(-1.0); //位置最小限幅值

    // Initialize the PID module for position (alternative option for eval)
    // ==================位置PID控制参数初始化=======================================
    pid_pos.Ref = 0; //参考位置值
    pid_pos.Fdb = 0; //反馈位置值
    pid_pos.OutMin = _IQ(-0.5); //PID输出最小限幅值
    pid_pos.OutMax = _IQ(0.5); //PID输出最大限幅值
    pid_pos.Out = 0; //PID输出值

    pid_pos.Kp = 1.0;
    pid_pos.Ki = 0;
    pid_pos.Kd = 0;
    pid_pos.Kc = 0.9;

    pid_pos.Up1 = 0;
    pid_pos.Up = 0;
    pid_pos.Ui = 0;
    pid_pos.Ud = 0;
    pid_pos.SatErr = 0;
    pid_pos.OutPreSat = 0;

    //Initialization routine for endat operation - defined in endat.c
    //Configures the peripherals and enables clocks for required modules
    //Configures GPIO and XBar as needed for EnDat operation
    //Sets up the SPI peripheral in endat data structure and enables interrupt
    #if POSITION_ENCODER==ENDAT_POS_ENCODER
    EnDat_Init();
    //Peforms cable propagation delay calculation.
    //This is required for long cable lengths and higher EnDat Clock frequencies
    //Function defined in endat.c

    EnDat_initDelayComp();

    //Switch to high frequency - 8.3MHz (=200/4*ENDAT_RUNTIME_FREQ_DIVIDER)
    PM_endat22_setFreq(ENDAT_RUNTIME_FREQ_DIVIDER);
    DELAY_US(800L); //Delay 800us
    endat22Data.dataReady = 1;

    #endif


    #if POSITION_ENCODER==BISS_POS_ENCODER
    bissc_init();
    DELAY_US(800L); //Delay 800us
    bissc_data_struct.dataReady = 1;

    #endif

    #if POSITION_ENCODER==ABS_POS_ENCODER //

    //===================编码器初始化========================================
    tformat_Init();
    DELAY_US(800L); //Delay 800us

    //Optional function exercising several tformat commands including eeprom accesses
    retval1_Dx = tformat_exCommands();
    //=====================================================================


    #endif
    // ***************************************************************************


    // Initialize the PID module for speed 初始化速度的控制模块
    #if (BUILDLEVEL==LEVEL5) || (BUILDLEVEL == LEVEL6) //位置闭环控制
    // pid_spd.param.Kp=_IQ(2.5);
    // pid_spd.param.Ki=_IQ(0.0001);
    // pid_spd.param.Kd=_IQ(0.0);
    // pid_spd.param.Kr=_IQ(1.0);
    // pid_spd.param.Umax=_IQ(0.9);
    // pid_spd.param.Umin=_IQ(-0.9);
    // ==================速度PID控制参数初始化=======================================
    pid_spd.param.Kp=_IQ(1.0); //速度P
    pid_spd.param.Ki=_IQ(0.001); //速度I
    pid_spd.param.Kd=_IQ(0.0);
    pid_spd.param.Kr=_IQ(1.0);
    pid_spd.param.Umax=_IQ(0.95); //速度最大值限幅值
    pid_spd.param.Umin=_IQ(-0.95);//速度最小值限幅值
    #else
    pid_spd.param.Kp = _IQ(1.0);
    pid_spd.param.Ki = _IQ(0.001);
    pid_spd.param.Kd = _IQ(0.0);
    pid_spd.param.Kr = _IQ(1.0);
    pid_spd.param.Umax = _IQ(0.95);
    pid_spd.param.Umin = _IQ(-0.95);
    #endif

    // Init PI module for ID loop ID
    // ==================电流ID环控制参数初始化========================
    pi_id.Kp = _IQ(1.0);//_IQ(3.0);
    pi_id.Ki = _IQ(T/0.04);//0.0075);
    pi_id.Umax = _IQ(0.5);
    pi_id.Umin = _IQ(-0.5);

    // Init PI module for IQ loop IQ
    // ==================电流IQ环控制参数初始化========================
    pi_iq.Kp = _IQ(1.0);//_IQ(4.0);
    pi_iq.Ki = _IQ(T/0.04);//_IQ(0.015);
    pi_iq.Umax = _IQ(0.8);
    pi_iq.Umin = _IQ(-0.8);

    // Set mock REFERENCES for Speed and Iq loops
    SpeedRef = 0.05; //速度参考值

    #if BUILDLEVEL == LEVEL3
    IqRef = 0.0;
    #else
    IqRef = _IQ(0.05); //IQ参考值
    #endif

    //Init FLAGS 初始化标志位
    // ==================标志位初始化========================
    RunMotor = 0; //运行标志为0
    LedCnt1 = 0; //LED计数值
    EnableResolverISR = 1; //使能旋变中断

    #if (BUILDLEVEL==LEVEL2) //校准偏移和速度测量
    Run_Delay = 10; //运行延时
    #else
    Run_Delay = 100; //运行延时
    #endif

    // Note that the vectorial sum of d-q PI outputs should be less than 1.0 which
    // refers to maximum duty cycle for SVGEN. Another duty cycle limiting factor
    // is current sense through shunt resistors which depends on hardware/software
    // implementation. Depending on the application requirements 3,2 or a single
    // shunt resistor can be used for current waveform reconstruction. The higher
    // number of shunt resistors allow the higher duty cycle operation and better
    // dc bus utilization. The users should adjust the PI saturation levels
    // carefully during open loop tests (i.e pi_id.Umax, pi_iq.Umax and Umins) as
    // in project manuals. Violation of this procedure yields distorted current
    // waveforms and unstable closed loop operations which may damage the inverter.

    // ****************************************************************************
    // ****************************************************************************
    // Call HVDMC Protection function 调用 HVDMC保护功能
    // ****************************************************************************
    // ****************************************************************************
    HVDMC_Protection();

    // TODO
    // ****************************************************************************
    // ****************************************************************************
    // Feedbacks OFFSET Calibration Routine 反馈偏移校准程序
    // ****************************************************************************
    // ****************************************************************************
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; //时钟同步
    EDIS;

    offset_Rsin = 0;
    offset_Rcos = 0;
    #if (CGND == HOT) //dx
    offset_shntV = 0; //V相电流偏移量
    offset_shntW = 0; //W相电流偏移量
    offset_shntU = 0; //U相电流偏移量
    #endif
    offset_lemW = 0;
    offset_lemV = 0;

    offset_SDFM1 = 0;
    offset_SDFM2 = 0;

    for (OffsetCalCounter=0; OffsetCalCounter<4000; )
    {

    if(EPwm11Regs.ETFLG.bit.INT==1) //事件触发标志寄存器
    {
    if(OffsetCalCounter>1000)
    {
    offset_SDFM1 = K1*offset_SDFM1 + K2*(temp=SDFM1_READ_FILTER1_DATA_16BIT)*SD_PU_SCALE_FACTOR;
    offset_SDFM2 = K1*offset_SDFM2 + K2*(temp=SDFM1_READ_FILTER2_DATA_16BIT)*SD_PU_SCALE_FACTOR;
    #if (CGND == HOT)//dx
    offset_shntV = K1*offset_shntV + K2*(IFB_SV)*ADC_PU_SCALE_FACTOR; //Phase A offset 电阻采样V相电流偏移量
    offset_shntW = K1*offset_shntW + K2*(IFB_SW)*ADC_PU_SCALE_FACTOR; //Phase B offset 电阻采样W相电流偏移量
    #endif
    offset_lemV = K1*offset_lemV + K2*(IFB_LEMV)*ADC_PU_SCALE_FACTOR;
    offset_lemW = K1*offset_lemW + K2*(IFB_LEMW)*ADC_PU_SCALE_FACTOR;

    offset_Rsin = K1*offset_Rsin + K2*R_SIN*ADC_PU_SCALE_FACTOR;
    offset_Rcos = K1*offset_Rcos + K2*R_COS*ADC_PU_SCALE_FACTOR;
    }
    EPwm11Regs.ETCLR.bit.INT=1;//清除EPwm11中断标志位
    OffsetCalCounter++;

    }


    }

    // ********************************************
    // Init OFFSET regs with identified values 初始化电流偏移量
    // ********************************************
    EALLOW;
    #if (CGND == HOT)//dx
    AdcaRegs.ADCPPB1OFFREF = (offset_shntV*4096.0); // setting shunt Iu offset 获取最后的零漂电流值
    AdcbRegs.ADCPPB1OFFREF = (offset_shntW*4096.0); // setting shunt Iv offset 获取最后的零漂电流值
    #endif
    AdccRegs.ADCPPB1OFFREF = (offset_Rcos*4096.0); // setting resolver cos in offset
    AdcdRegs.ADCPPB1OFFREF = (offset_Rsin*4096.0); // setting resolver sin in offset

    AdcaRegs.ADCPPB2OFFREF = (offset_lemV*4096.0); // setting LEM Iv offset
    AdcbRegs.ADCPPB2OFFREF = (offset_lemW*4096.0); // setting LEM Iw offset

    EDIS;

    // ****************************************************************************
    // ****************************************************************************
    //TODO ISR Mapping
    // ****************************************************************************
    // ****************************************************************************
    EALLOW;
    // ADC C EOC of SOC0 is used to trigger Resolver Interrupt
    //==================ADC—C被用于触发旋变中断========================
    AdccRegs.ADCINTSEL1N2.bit.INT1SEL = 0;
    AdccRegs.ADCINTSEL1N2.bit.INT1CONT = 1;
    AdccRegs.ADCINTSEL1N2.bit.INT1E = 1;
    //PWM11 INT is used to trigger Motor Control ISR
    //==================PWM11被用于触电机控制中断========================//
    EPwm11Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPA;
    EPwm11Regs.ETSEL.bit.INTEN = 1; //Enable INT 使能中断
    EPwm11Regs.ETPS.bit.INTPRD = ET_1ST; //Generate INT on every event 触发中断在每一个事件中

    PieVectTable.ADCC1_INT = &ResolverISR; //ADC-C指向旋变中断
    PieVectTable.EPWM11_INT = &MotorControlISR; //EPWM11指向电机控制中断

    PieCtrlRegs.PIEIER3.bit.INTx11 = 1; // Enable PWM11INT in PIE group 3 使能EPWM11中断在PIE组3中

    #if POSITION_ENCODER == RESOLVER_POS_ENCODER
    PieCtrlRegs.PIEIER1.bit.INTx3 = 1; // Enable ADCC1INT in PIE group 1 使能ADC-C中断在PIE组1中
    #endif

    EPwm11Regs.ETCLR.bit.INT=1; //清除PWM11中断标志位

    IER |= M_INT3; // Enable group 3 interrupts 使能组3中断
    IER |= M_INT1; // Enable group 1 interrupts 使能组1中断
    EINT; // Enable Global interrupt INTM 使能全局中断
    ERTM; // Enable Global realtime interrupt DBGM 使能全局实时中断(调试)
    EDIS;


    // Initialisations COMPLETE
    // - IDLE loop. Just loop forever retval1
    // ***************************************************************************

  • SP:
    你好!我使用以下编码器例程,Tamagawa的编码器解码方案,路径查找:C:\ti\controlSUITE\libs\app_libs\position_manager\v01_01_00_00\tformat,发现如下问题:
    1、将代码烧写进芯片后,第一次程序运行死在tformat.c中的tformat_exCommands(void)函数中,一直不满足条件,在等待:
    2、软件复位后,再次运行程序,程序才可以运行下去,可以读取到编码器数据。
    3、尝试多次,都是在第一次运行程序出现问题,而PM_tformat_startOperation();函数是封起来的,我们没法看是什么问题。
    麻烦您帮忙解决一下,多谢谢!
  • 你好,请教一下,您在将tformat的例子烧写进开发板的过程当中CCS的相关文件是如何配置的?
    为什么我将此程序烧写进TI的28379D开发板以后利用相关套件却读不出编码器的位置信息呢?程序一直卡在while (tformatData.dataReady != 1),这个位置,就是没有收到数据,我测过编码器肯定是没有问题的,应该就是程序的问题,我猜测是我的配置有问题。
    但是程序编译都通过了,难道是我的配置有问题????
    希望能得到高手的解答,谢谢!!!!
    不胜感激,已经卡在这一个星期了!!