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.

[参考译文] EK-TM4C1294XL:使用 QEI 和 PWM 模块组合时出现问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/619016/ek-tm4c1294xl-problem-by-using-the-combination-of-qei-and-pwm-modul

器件型号:EK-TM4C1294XL

您好!

我正在尝试使用评估套件 TM4C1294XL 来实现电机调节应用。 使用 PWM 和 QEI 的组合似乎存在问题。 另外、这两个模块工作正常。 因此、我能够生成具有给定占空比的 PWM 信号。 此外、还可以使用 QEI 读取和计算速度和 RPM。

我计算电流 rpm 并拟合 PI 调节算法。 该算法会返回新的占空比。 一旦我将新计算出的 dutycycle 放入 ROM_PWMPulseWidthSet 函数、PWM 信号的周期时间似乎就会更改为 使用函数 ROM_QEIVelocityConfigure 配置的 QEI 模块的选定测量时间

您是否对我如何解决该问题有任何疑问? 。 QEI 似乎会阻止 PWM 模块。 这是原因吗?

在这里是初始化代码块和主例程:

//启用 QEI 外设
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);//PL1;PL2
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_QEI0);

//将引脚设置为 PHA0和 PH0
ROM_GPIOPinConfigure (GPIO_PL1_PHA0);
ROM_GPIOPinConfigure (GPIO_PL2_PHB0);

//设置 QEI 的 GPIO 引脚。
ROM_GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_1 | GPIO_PIN_2);

//在配置前禁用外设和 int
ROM_QEIDisable (QEI0_BASE);
ROM_QEIIntDisable (QEI0_BASE、QEI_INTERROR | QEI_INTDIR | QEI_INTTIMER | QEI_INTINDEX);

//配置正交编码器,使用任意上限2000
ROM_QEIConfigure (QEI0_BASE、(QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUIPON_SWAP)、479);//QEI_CONFIG_CLOCK_DIR

//启用正交编码器。
ROM_QEIEnable (QEI0_BASE);

//将位置设置为中间值,以便我们可以查看是否正常工作
ROM_QEIPositionSet (QEI0_BASE、0);

ROM_QEIVelocityConfigure (QEI0_BASE、QEI_VELDIV_1、120000000);//1000ms 测量时间
ROM_QEIVelocityEnable (QEI0_BASE); 
//启用必要的外设
ROM_SysCtlPeripheralEnable (L298N_PWM_CONFIG0);
ROM_SysCtlPeripheralEnable (L298N_PWM_CONFIG1);
ROM_SysCtlPeripheralEnable (L298N_GPIO_CONFIG0);
ROM_SysCtlPeripheralEnable (L298N_GPIO_CONFIG1);

//设置方向引脚的数字输出信号
ROM_GPIOPinTypeGPIOOutput (L298N_IN1);// IN1
ROM_GPIOPinTypeGPIOOutput (L298N_IN2);// IN2

//设置 PWM 时钟
ROM_PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_8);// 15MHz
PWM_CLOCK =(SYSTEM_CLOCK / 8);

ROM_GPIOPinConfigure (L298N_ENA_TYPE);
ROM_GPIOPinTypePWM (L298N_ENA);

//设置 PWM 模式
ROM_PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);

//设置 PWM 周期时间
//Period_Time_ticks =((SYSTEM_CLOCK / 64)/PWM_FREQUENCY)-1;
PERIOD_TIME_TICKs =(PWM_CLOCK / PWM_FREQUENCY);
ROM_PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、PERIOD_TIME_TICK);

//启用 PWM 输出
ROM_PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT、TRUE);

//启动 PWM 发生器(定时器)
ROM_PWMGenEnable (PWM0_BASE、PWM_GEN_0); 
while (1){
regulation.setParameters(Kp、Ki、Kd);

//运行电机
motordriver.run(FORWARD、Duty);

//测量 RPM
rpm_sensor.calculateRPM();
rpm_x = rpm_sensor.getRPM ();

//更新电机调节算法
占空比=调节.pi_regulation (rpm_w、rpm_x);
ROM_SysCtlDelay (g_ui32SysClock/3 /100);// 10ms


如果(a==1){
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);
A=2;
} 否则、如果(a=2){
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、1);
A=1;
}
} 

非常感谢!

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不应该存在。 您开始使用的是什么演示软件包? 星期一回到办公室时、我需要做一些检查。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="asdfasdffff"]

    //设置 PWM 周期时间

    //Period_Time_ticks =((SYSTEM_CLOCK / 64)/PWM_FREQUENCY)-1;

    PERIOD_TIME_TICKs =(PWM_CLOCK / PWM_FREQUENCY);

    ROM_PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、PERIOD_TIME_TICK);[/引用]

    在这类问题中、您是否使用"PWM 周期"的"公式计算"?   

    始终且仅限-公司/我希望您(首先) PWM 周期的值进行硬编码-这是不可侵犯的!   (即一件远超的事情!)

    您已经为"PWM 周期可变性"提供了"无案例"-因此(可能)启用此类更改不会带来任何好处-并且可能(相反)会邀请不必要的入侵...  (正如您的报告一样!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    非常感谢您的快速回复。 我从一个新的空项目开始。 并且不使用任何示例进行启动。
    作为参考、我使用了 driverlib 文档和 CLP_workbook 的示例代码。

    如果您需要、我可以通过私人邮件向您发送完整的源文件?
    我想这对于在这里发布帖子来说是非常重要的。

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

    我的(键盘、(部分)主页)朋友、

    您是否没有做出这种努力、"太难了?"

    只需将"PWMPeriod"参数 (您使用的是公式)替换为数字值(因此硬编码-不能自行更改)-不要使用公式!    

    该公式中的变量可能会被程序中的(其他、甚至是不需要/意外的)操作更改-因此您会邀请漏洞。     这不是很好!

    幽默-以数字值表示-然后重新启动您的计划。   然后报告...

    如果您认为此建议不成功(在冻结 PWM 周期时)、请在(极不可能)事件中明确描述您的方法"测量 PWM 周期"。   

    公司/我已经设计、生产并交付了数千个采用这种"硬编码"方法的此类电路板-从未像您所说的那样"被扼杀" PWM 周期...

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

    您好 CB1_MOBILE、

    也非常感谢您的快速回复。 很抱歉我迟到了、但昨天没时间了。

    我完全同意您的观点、即硬编码值会降低有害影响或其他内容的可能性。

    我已经尝试过、但没有成功。 我将 PWM 周期设置为硬编码值。 我希望 PWM 频率为500Hz、因此我将函数 ROM_PWMGenPeriodSet 与值30000匹配。 (计算120MHz/8)= 15MHz -> 15MHz/500 = 30000。 按照我的第一篇文章中所述设置 PWM 后、我能够使用函数 ROM_PWMSetPulseWidth (...)设置脉冲宽度

    我通过使用示波器测量 PWM 输出信号的不同占空比来检查功能。 (周期时间也正确)

    因此、在我单独使用 PWM 的情况下、它工作正常。 而不会出现任何问题。

    在下一步中、我添加了 QEI 模块并按照我的第一个帖子中所述对其进行了配置。 我想使用 QEI 计算直流电机的 RPM。 作为传感器、我使用 GP1A30R (光学传感器与编码器结合使用)。 配置 QEI 后、我能够检测每秒的脉冲计数并计算 RPM。 QEI 配置的测量时间为1秒、这是因为分辨率更高、测量时间更长。

    那么、在我的软件中、此时 PWM 和 QEI 已配置、两个模块都正常工作。 我可以在主循环中连续更改 PWM 信号的占空比- while (1)循环中、QEI 模块也会计算电机的转速。 我在 PWM 信号的周期时间或使用 QEI 检测电机 rpm 信号方面没有遇到任何问题。

    现在、我还实现了一个简单的 PI 调节算法。 该算法也可以正常工作、我使用不同的硬编码值对其进行了测试。  

    如果您现在看一下以下 main-while (1)循环代码-使用此代码、PWM 信号运行良好、并且 QEI rpm 检测工作正常-->周期时间没有问题。

    while (1){
    regulation.setParameters(Kp、Ki、Kd);//设置 PI 调节参数
    
    //运行电机
    motordriver.run(FORWARD、占空比);//使用定义/计算的占空比启动直流电机
    
    //测量 RPM
    rpm_sensor.calculateRPM();//测量和计算 QEI 的 RPM -使用 QEIVelocityGet (..)读取计数/秒
    rpm_x = rpm_sensor.getRPM ();//仅获取 rpm 值
    
    //更新电机调节算法
    Duty = region.pi_regulation (rpm_w、3500);//此函数计算给定 rpm_w 和硬编码3500的新占空比-仅用于测试
    ROM_SysCtlDelay (g_ui32SysClock/3 /100);// 10ms //进一步延迟10ms
    
    //仅用于测试10ms 延迟是否存在问题-->引脚切换 LED
    如果(a==1){
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);
    A=2;
    } 否则、如果(a=2){
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、1);
    A=1;
    }
    } 

    因此、在上述代码中、PI 调节耦合不会闭合、因为我对当前 rpm 值使用了3500的硬编码值。 在这种情况下、PWM 和 rpm_x 值的计算都可以正常工作、没有任何问题。 我通过使用调试器切换可变占空比并使用示波器测量输出信号来检查它。 此外、PWM 频率不变、为500Hz。 此外,QEI 模块工作正常。

    在以下代码中、我关闭调节环路。

    while (1){
    regulation.setParameters(Kp、Ki、Kd);//设置 PI 调节参数
    
    //运行电机
    motordriver.run(FORWARD、占空比);//使用定义/计算的占空比启动直流电机
    
    //测量 RPM
    rpm_sensor.calculateRPM();//测量和计算 QEI 的 RPM -使用 QEIVelocityGet (..)读取计数/秒
    rpm_x = rpm_sensor.getRPM ();//仅获取 rpm 值
    
    //更新电机调节算法
    Duty = region.pi_regulation (rpm_w、rpm_x);//此函数计算给定 rpm_w 和 rpm_x 的新占空比
    ROM_SysCtlDelay (g_ui32SysClock/3 /100);// 10ms //进一步延迟10ms
    
    //仅用于测试10ms 延迟是否存在问题-->引脚切换 LED
    如果(a==1){
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);
    A=2;
    } 否则、如果(a=2){
    GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、1);
    A=1;
    }
    } 

    在这种情况下、PWM 输出信号将周期时间更改为1秒。 与我在 QEI 模块中配置的时间相同。 有趣的一点是 QEIVelocityGet (..) 在 QEI 模块的新测量值可用之前、不会阻止整个 while (1)循环。 相反,LED 会按预期以10ms 的延迟“闪烁”(我用示波器检查了这一点)。

    只是第个 PWM 周期更改为1秒。 可能是中断或 PWM 或 QEI 相互阻断的任何东西!? 这是可行的吗?

    我对此有点困惑、我不知道问题可能是什么。

    非常感谢!

    此致

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

    非常感谢您-提供了很多详细信息-这是我们的首选。

    我很高兴您成功地为 PWMPeriodSet()建议了"硬编码"参数-它证明(大多数)始终可以从"有限和已知(不可更改)条件"开始-仅在测试/验证后"从该参数"开始"。

    您使用500Hz 的频率似乎远低于大多数"电机控制"应用公司/我已经设计或咨询过的应用。   (常见问题:4kHz-22kHz)  您是如何到达@ 500Hz 的?

    对于小型技术公司、企业并不(总是)"繁荣"(现在也是如此)、因此(在焊铁"热"时很引人注目)会留出(部分)时间进行"周日上午客户会议"、我将在返回时进一步回顾您最近的帖子...

    [编辑] 08:00 CST: 虽然我自己(显然是供应商)"未知"、但您(所选)的 PWM 发生器和 QEI 模块之间可能存在一些不需要的"交互"。   我怀疑切换到另一个 PWM 模块不会很困难-并测试这种不幸是否仍然存在。   一如既往-最好跨多个电路板进行测试(从不单个电路板)、以避免"单板异常!"的祸害

    还有一点-"打开 QEI 模块这么长时间(即1秒)以"提高分辨率"强烈建议您的 QEI 编码器为(极)"Resolution - Lite!"   任何合适的编码器都应产生多个脉冲/旋转、从而避免"如此长的 QEI 速度计算帧!"可能导致的"恐怖"。   请务必检查 QEI 是否能够容纳如此大的数字-我们在一段时间内没有使用过此供应商的器件-但"一切"(目前在您的情况下)必须保持" 挑战并发挥作用"。

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

    非常感谢您的支持!

    我今天将检查另一个 PWM 模块。

    我使用一个 Legotechic dc 电机9V (90年代出售)。 我刚刚尝试了一些不同的 PWM 频率、在我看来、它 最适合500Hz 的 Hte 频率。 但我会记住您的建议、并尝试您提到的频率范围。

    此外、我完全同意您的看法、即1秒的测量时间非常长、但我在数据表中找不到有关 QEI 模块的最长时间额定值的任何信息。  我想测试该配置。

    尽管如此、使用 PWM 和 QEI 模块的组合会产生一些意外的影响、这是很奇怪的。 由于 QEI 使用单独的计时器模块作为 PWM、并且没有共享组件或外设...

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你们-工作人员提到,也许你们有(较旧的)代码-“埋没”-它使 PWMPulseWidthSet()“不需要”调用。

    十多年来、使用前代和当前供应商的器件、我们从未注意到 PWM 发生器的"脉宽"发生变化。

    还有一个需要考虑的路径:设置 PWM 模块(减去 QEI 功能)、并在正常运行时-"仔细检查、记录和记录/记录"-关键 PWM 寄存器。 然后也启用 QEI 模块-并检查这些(先前记录的) PWM 寄存器中是否有(不需要的)变化。

    您还可以"向下拨号"(极限值) QEI 速度参数-(建议为50%、最小值)-并参阅"如何或是否"这会影响已磁化 PWM。

    所有这些都应"跟随"您对不同 PWM 发生器的更改-在(最不可能)发生某种交互的情况下...