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.

[参考译文] CCS/TMS320F2.8379万S:C2000解析器软件库-函数resolver_algo浮动()具有较长的计时

Guru**** 2556210 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/633380/ccs-tms320f28379s-c2000-resolver-software-library---function-resolver_algo_float-has-long-timing

部件号:TMS320F2.8379万S

工具/软件:Code Composer Studio

您好,

我们使用的解析器接口软件库与TI/IDDK_PM_Servo_F2837x示例中的一样,并且库函数resolver_algo浮动()的计时存在问题。

我们以200 MHz CPU时钟频率运行。

我们将ISR的解析器称为160 kHz (ISR 6.25 µs ²),因此也称为resolver_algo浮点(),我们已经测量了ISR的计时,并发现它通常需要1.6 µs ²,但每16个就需要更长的时间。 这意味着它最多需要7 µs,而这比ISR的时间长!

我们还从以下函数中测量了时间:

resolver_algo浮子()(15x 500 ns和16th 5945 ns)

resolver_PostProcesses()(700 ns,也仅每16个激活)

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

    感谢您的帖子。 您的线程已分配给C2000专家,应很快得到解答。

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

    你好。

    为了控制PMSM,我使用解析器滑槽。

    我也有 同样的关键问题。

    我使用DMA通道来获取ADC数据sin和cos信号。

    我有160 kHz 转换样例ADC。

    我配置从ADC到RAM的DMA通道。

    DMA 16字的缓冲区大小。

    在DMA transmite结束后,我使用解析器实用程序:

    1初始DMA传输:

    void dma_configure(void)

    EALLOW;
    CpuSysRegs.SECMSEL.bit.PF1SEL = 1;
    EDIS;

    DMAInitialize();
    POINT_BUF_DMA_ADC=0;
    DMADest =&BUFFER_DMA_ADC[0];//指向数组开头的DMA目标
    DMASource =&AdcaResultRegs.ADCRESULT0;//点DMA源到ADC结果寄存器基准
    DMACH1AddrConfig(DMADest, DMASource);
    DMACH1BurstConfig (16,1,1);
    DMACH1TransferConfig (15,0xFFF 0,0);
    DMACH1WrapConfig (0xFFFF,800,0xFFFF,800);
    DMACH1ModeConfig (DMA_EPWM5A,PERINT_ENABLE,OneShot_DISABLE,CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,CHINT_END,CHINT_ENABLE);
    StartDMACH1();

    }

    中断服务:  10 kHz

    __interrupt void local_DMACH1_ISR(void)

    LED1_ON
    proreg_CAN_log+;IF (prooreg_CAN_log>=2){proreg_CAN_log=0;}
    //------------------
    //要从此PIE组接收更多中断,请确认此中断
    pointer_buf_dma_adc++;
    IF (((POINT_BUF_DMA_ADC&1)=0){DMADest=&BUFFER_DMA_ADC[0];}
    else{DMADest=&BUFFER_DMA_ADC1[0];}
    DMASource =&AdcaResultRegs.ADCRESULT0;
    DMACH1AddrConfig(DMADest, DMASource);
    EPwm5Regs.TBCTR=EPwm5Regs.TBPRD;
    EALLOW;DmaRegs.CH1.control.bit.run = 1;DmaRegs.CH2.control.bit.run = 1;EDIS;
    test_count2_low=EPwm1Regs.TBCTR;
    ServiceDog ();
    //要从此PIE组接收更多中断,请确认此中断
    EALLOW;PieCtrlRegs.PIEACK.ALL = PIEACK_group7;EDIS;
    main_cicl();
    can_log_func();
    ENA_i2c_read=1;
    if(((proeg_can_log&1)=0){test_new_data();}
    IF ((proeg_CAN_LOC&1)=1){CAN_AVto_();}
    LED1_OFF
    test_count2_high = EPwm1Regs.TBCTR;
    }

    解析器转换:

    i=0;
    同时(I<16)

    f_temp1=(int)(*(DMASource+(i<4)+3));f_temp2=(int)(*(DMASource+(i<4)+2));
    sensorSample+=(int)(*(DMASource+(i<4)+13));
    rslvrOut.sineIndex =(rslvrOut.sineIndex-1)&(rslvrIn.table_length-1);
    rslvrOut.sin_input=f_temp1-rslvrIn.offset;rslvrOut.cos_input=f_temp2-rslvrIn.offsetC;
    如果(j!=0)

    nakop_sin弦 偏移量+=f_temp1;nakop_cos_offset+=f_temp2;current_count_offset+=nakop_cos_offset+=f_temp2; 1.0
    IF (current_count_offset>=1万)

    rslvrIn.offset=nakop_sine_offset* 0.0001 ;rslvrIn.offsetC=nakop_cos_offset* 0.0001 ;
    nakop_sine_offset=0;nakop_cos_offset=0;current_count_offset=0;
    }
    }
    IF (bit3_test==0)

    f_temp =(int)(*(DMASource+(i<<4)+0));
    current_pozit_write+;if(current_pozit_write>=size_buf_test){current_pozit_write=0;}
    0.1 0.5);
    test_cos_buf[current_pozit_write]=(int)(rslvrOut.cos_input* 0.5);
    }
    resolver_algo浮动();
    I++;
    }