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/TMS320F28335:TMDSRSLVR_v1.0:在 ISR、旋变传感器算法(void)内、您是否具有扩展的详细信息或源代码

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/623172/ccs-tms320f28335-tmdsrslvr_v1-0-within-the-isr-resolver_algo_float-void-do-you-have-extended-detail-or-source-code

器件型号:TMS320F28335
主题中讨论的其他器件:TMDSRSLVR

工具/软件:Code Composer Studio

关于 F28335和 TMDSRSLVR_v1.0模块、我正在研究 ISR 代码、其中包含非常简单的语句。

我猜它会检查 rslverOut.sineindex 是否 接近0、它会根据从 ADC 数据捕获的 rslvrOut.sin 和 cos 触发计算(FIR)、然后复位 EPWMRegs 中断标志以表示10kHz 事件。

我想知道、如果我修改语句、只处理 ADCRESULT、它可能会更快地处理循环?

//*** ADC 的正弦和余弦反馈样本***
if (rslvrOut.sineIndex=0)

rslvrOut.Sin_input =((float) AdcRegs.ADCRESULT0*(3.0/65536.0));// rslvrIn.offsets;//消除运算放大器偏置
rslvrOut.Cos_input =((float) AdcRegs.ADCRESULT1*(3.0/65536.0));//- rslvrIn.offsetC;//消除运算放大器偏置
IF (旋变传感器算法浮点())

EPwm1Regs.ETCLR.bit.INT = 1;//清除 EPwm1 INT 标志


除非有更多有关旋变传感器_算法 浮点()的信息,否则我只想在此猜测。

R.  

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

    它会累加 ADC 输出、然后在抽取时间内、它会使用所有数据。 嗯、有很多实现方法、当然您也可以尝试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否有有关旋变传感器_算法 浮点()的更多技术细节和文档?谢谢、
    我在旋转变压器库中看到过文档、细节似乎非常有限、它没有解释结果的变化以及需要什么输入?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在~docs 文件夹下、您将看到实现详细信息。 这将提供更多帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经阅读过这些文档以及 resolver_to_digital_conv.pdf、没有太多帮助、也没有详细说明使用了哪些输入参数和更改了输出。

    如技术参考文档中所述、此函数执行 FIR 带通滤波器操作和观测器环路。 当新的位置数据可用时、它返回1或0。 "

    但是、"如技术参考文档中所述"、它似乎缺失了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否有信息来说明在该旋变传感器下面返回1并触发后处理代码的条件。

    旋变传感器_输入 rslvrIn;//输入到旋变传感器环路
    旋变传感器_输出 rslvrOut;//从旋变传感器环路输出

    它会导致160KHz 时序上的断续。 在16循环结束时,旋变传感器_算法 浮点()时序从6.25uSec ISR 循环中的2uSec 跳到4uSec (160Khz)。 我已将 ADC AQC 修改为最小值、以处理4个双通道捕获(2uSec 内)。

    但是、我遇到了奇怪的 ISR 行为、如果我在其他地方修改其他代码、编译并调试到 F28335、我发现 PWM 在每次旋转变压器算法执行角度计算(4uSec)时都包含关于计时的断续指令、并且无法为旋转变压器提供干净的 TX 正弦信号。 为了解决此问题、每次 我发现 TX 正弦波失真时、我必须修改#define 变量编号。 这不是理想的解决方案。 我删除了使用 GPIO 时序信号的代码、因为它更新 GPIO 的速度很慢(由于读取-修改-写入)。 注意:所有 ISR 都在 RAM 中。

    #define ADC_SAMP_INST 300、它进入 ADC12ePWMRegs.CMPA.half.CMPA = ADC_SAMP_INST;

    另一个计划是将 ADC12读数缓冲到160KHz 循环内的16个数组中、并在数组结束时触发10kHz ISR 循环、并在10kHz 段代码(通过缓冲循环)中执行旋变传感器_algo_float ()、这是一种更接近的解决方案、 但我需要知道在旋变传感器输入/输出中有什么变量来馈送到旋变传感器_算法 浮点()、该变量在角度计算完成后返回1。

    为此、我假设160Khz ePWM1具有比10kHz (ePWM2)更高的中断优先级以保持 TX PWM 平稳、因此它在两个 ISR 之间进行多路复用、这是否起作用、中断数据表是否不清楚它如何处理低优先级和高优先级中断(与 Cortex 中断优先级不同)。

    我使用的是20MHz XOSC 的 SYSCLK=100MHz。 我无法更改为150MHz 时钟、因为它是高温应用、依靠电池运行。

    我希望我能清楚地说明它、否则我们可以使用 Skype 吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好
    调试会话后,我发现 SineIndex=13是用于执行角度计算的旋变传感器_algo_float ()的触发点,您是否可以在这种情况下进行确认?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这样做是为了使抽取实例接近载波反馈信号的峰值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于9月9日的查询、
    如果 CPU 没有可容纳16个样本的时间带宽、则使用8个样本。 这是 x035演示所完成的操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    8个样本的好主意。

    最后一项

    每次我更改代码(与旋转变压器无关)并且没有添加新的中断、我都必须不断更改编号 ADC_SAMP_INST、以便在 TX 引脚上获得干净的正弦波。 它还会影响振幅。

    ADC12ePWMRegs.CMPA.half.CMPA = ADC_SAMP_INST

    您能告诉我发生这种情况的原因、以及如何解决。 我很难理解这种奇怪的行为。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ADC_SAMP_INST 在每个 PWM 周期内采样 ADC 时设置实例。

    只要正弦波发生器更新是从 ISR 内完成的、它就应该独立于任何非中断代码。

    中断 void reslvr_isr (void)

    //重新启动时钟 C28 //周期计数计算计时-重新开始计数

    GpioDataRegs.GPBSET.BIO32 = 1;
    //***设置下一个采样时刻并更新激励正弦波***
    rslvrOut.sineIndex =(rslvrOut.sineIndex-1)&(rslvrIn.Table_length-1);// delay_length 必须为2^n
    EPwm2Regs.CMPA.half.CMPA = sineTable[rslvrOut.sineIndex];


    只需复制代码片段、即可显示正弦波发生器更新是从 ISR 内完成的。 如果您要确保这一点、请不要知道您的测试台正在发生什么情况。