您好!我所使用的syscfg版本为5.04,CCS版本为12.2.0,芯片为TMS320F280049。由于硬件资源限制,我现在想把EPWM8_A(GPIO14)与EPWM8_B(GPIO15)配置为周期和占空比均可独立、实时修改的PWM波信号。
我了解到同一个EPWM模块的A、B无法独立设置周期,因此想通过将GPIO15配置为OUTPUTXBAR4,利用CLB模块生成可以修改周期与占空比的PWM波形。
我参照了C2000WARE自带的项目例程clb_ex7_state_machine与clb_ex3_auxiliary_pwm,其中clb_ex7_state_machine由于输出逻辑过于复杂无法有效修改和输出,clb_ex3_auxiliary_pwm成功修改到我想要的输出端,但只能做到修改占空比而无法修改周期。
我试图通过模仿clb_ex7_state_machine使用其中的函数updateClbPwm(clbPwmPeriod, clbPwmDuty);,复制到主函数循环中来在clb_ex3中改动周期,有的时候可以出现我想要的结果,但难以在我自己的项目中实现。
是否可以拿掉这些复杂的逻辑运算,只是配置PWM信号输出到OUTPUTXBAR4呢?或者我是否可以将EPWM8的A、B输出分别写入周期值?我应该怎么做?
您当然可以使用CLB创建两个具有独立占空比和周期值的独立波形。 我建议使用4个HLC寄存器作为接口,通过CPU更新这些值,然后使用HLC事件和程序将寄存器值加载到计数器的match1和match2值中。 CLB工具用户指南是了解CLB sysconfig GUI功能的良好参考。 如果您还有其他问题,请告诉我。
您好:
感谢您的回复!关于CLB工具的使用,我还有一些疑问。
1.在只配置一个XBAR输出口(如OUTPUTXBAR4)输出PWM的情况下,是否只需要两个HLC寄存器作为接口,存储波形的周期与占空比值?
我建议使用4个HLC寄存器作为接口,通过CPU更新这些值
2.HLC寄存器指的是HLC模块的r0、r1、r2、r3吗?e0、e1等是否就是所说的HLC事件?
3.我是否可以这样理解整个数据传输过程:我在程序中给HLC寄存器赋值,HLC事件触发后,寄存器值会传递给计数器counter的match1、match2,当计数器达到match时可以将触发事件输出到OUTLUT4,也就是OUTPUTXBAR4?FSM模块是必须经过的吗?
4.参照例程clb.ex3,HLC事件的触发设置是否可以这样理解:当counter0到达match1时,触发event0:,even0的任务内容为:
?MOV_T2 R0,C0的意思是否为将HLC寄存器R0内的数据转移到counter的寄存器c0(match2)?Instruction1 INTR1如何理解?
5.如果我想在e0事件触发时同时将HLC模块的R1寄存器存储数值传递给counter0的match1,是否就能实现同时更新pwm的占空比和频率?如果是,Instruction我应该如何设置?
1.这是正确的。
2.这是正确的。
3.这是正确的,不需要FSM。 我建议使用count=0事件触发HLC程序,该程序更新匹配值,以便您的匹配值不会随机更新。
4.参考#3. 命令语法正确。 INTR 1生成CLB中断,您可能不需要该中断。
5.如果使用count=0事件触发HLC程序,您可以在同一HLC程序中更新任务和期间。
您好!
这里还有一些疑问。我对syscfg的理解是它会帮助开发人员直观而快速地写出配置代码,如果能手动将代码打出来,使用效果和syscfg生成的代码是一致的。但我在clb_ex3例程生成的代码中为何找不到配置FSM模块逻辑功能的程序段?是否有些生成代码不以我可以搜索到的形式存在?
我将前面说到的syscfg文件转移到另一个项目中后,解决了报错问题,但并没有出现预期波形,EPWM8A(也就是原程序中已配置好的输出引脚)还在按照预期输出,而移植的syscfg中配置的EPWM8B(在syscfg中配置为OUTPUTXBAR4,counter0作为比较器,FSM0来生成波形,由HLC作为C28x和counter0之间的数据中继)没有任何输出结果,同样的内容在移植之前确认是可用的。请问有什么可行的解决方向吗?
我相信CLB生成的代码会被放入一个名为clb_config.c和clb_config.h的单独文件中,您可以在那里找到FSM函数。
您的CLB生成的代码可能缺少启用CLB等功能。 能否发送.syscfg文件和添加到主文件中的代码来调用sysconfig生成的函数?