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.

[参考译文] TMS320F280037C:通用电机控制实验室-模拟 DMA 不工作

Guru**** 2513185 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1267356/tms320f280037c-universal-motor-control-lab---datalog-dma-not-working

器件型号:TMS320F280037C

您好!

我有一些使用通用电机控制实验室来驱动电机的定制硬件。

到目前为止、我已经验证了 ADC 在工作和校准、PWM 在构建级别1中正常运行、并在构建级别2中尝试正常运行。

但是、让电机正确旋转(电机声音大且旋转缓慢、消耗最大电流)仍然存在一些问题。

我认为 ADC 的校准没有很正确。 失调电压已经过校准、但仍在-25mA 之间摆动、这可能会让控制系统产生困惑。

无论如何,我需要正确设置数据日志来帮助诊断此问题,但数据日志根本没有更新!

我已在数据日志上设置了4个通道、如下所示、使用库存通用电机控制实验代码:

我可以观察指针、它们可以正确地指向 ADC 数据和 FOC 角度。

但是、数据日志缓冲区中的值全为零、当然 CCS 曲线图中的值全为零。

我的确需要稍微修改代码、因为尽管 ADC 值存储为浮点值、而其他地方的代码需要浮点值、但库存代码使用的是16位整数而不是32位浮点值。

总之、我认为这不是问题所在。

此外,深入研究这一点,我看不到 DMA 实际使用'datalog'参数的任何方式( datalogObj->iptr[])。 'setupDMAforDLOG'使用 DATALOG 缓冲区作为 DMA 传输的接收和发送。 因此,我完全不知道如何解决这一问题。 我希望'setupDMAforDLOG 会使用'iptr'作为 DMA 配置的发送。 也许设置只是为了使 datalogBuff 换行、这就提出了这样一个问题:数据实际在哪里传递?

我之前在评估板上使用过其他实验、它们都以相同的方式配置 DMA (在"setupDMAforDLGO"中、 使用 datalogBuff#[0]作为 recv、使用 datalogBuff#[1]作为 send)。

如何使数据日志正常工作?

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

    编辑:发布到这些论坛是我的即时好运的魅力...

    DMA 绝对用于打包数据日志、该值直接写入数据日志中的最后一个位置、由电机驱动例程调用。

    虽然我已经分配了更多的空间,但是 datalogBuff 没有正确的包装,只写入位置~200。 它看起来系统需要200大小的缓冲区、并且由于它没有出现故障、因此出现了故障。

    以下是我使用的设置(在 datalogif.h 中)。

    #elif defined(DATALOGF4_EN)
    #define DATA_LOG_BUFF_SIZE      200      //**20
    #define DATA_SIZE_EXT           2       //
    
    #define DATA_LOG_BUFF_NUM       4       // = 2 for F28002x or = 4 for other devices
    
    #define DLOG_BURST_SIZE         20       // write 200 to the register for
                                             // a burst size of 20
    
    #define DLOG_TRANSFER_SIZE      (1 + 2* DATA_LOG_BUFF_SIZE / DLOG_BURST_SIZE)//10       // [(MEM_BUFFER_SIZE/(BURST)]
    #endif  // DATALOGI4_EN
    
    #define DLOG_WRAP_SIZE          DLOG_TRANSFER_SIZE + 1
    
    #define DATA_LOG_SCALE_FACTOR   10        // update every 10 times

    我必须搜索整个实验、将所有"ATALOGI4_EN"更改为"ATALOF4_EN"、并为所有"DatalogBuff"器将"int16_t"更改为"float32_t"、以使其正常工作。

    由于我注意到只写入了位置200、而 DATALOGF2_EN 版本只使用了200、我猜200是系统正在寻找的大小缓冲器、它现在正确卷绕并显示了图形!