如题,是否可以提供am335x的ecap单元作为捕获使用时的例子,谢谢。
我爱下载:
找了很多资料,都是ecap作为apwm使用的例子
Jian Zhou:
回复 我爱下载:
目前驱动层的架构是完整的,上层实现都是模拟PWM的,如果改为捕获模式,要按照TRM的描述去做改动。
我爱下载:
回复 Jian Zhou:
我按照自己的理解,和TRM的描述,感觉所有的配置都设置了,但是问题有两个,我用CAP0_in_pwm_out引脚作为输入,配置mux为
{"ecap0_in_pwm0_out.ecap0_in_pwm0_out", OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_FAST | AM33XX_PIN_INPUT},
实际的测试信号为周期=560us的方波,可以通过示波器测试到信号输出,加到ecap0_in_pwm0_out后,没有发生我希望看到的捕捉和相应的中断;
另一个问题是,捕捉计数器如果直接初始化为‘0’的话,计数器即使初始化为“free_run”模式,也不是有计数增加,如果初始化为非‘0’,技术会从当前输出开始增加,数值增加到溢出后归零,计数将不会在增加,计数器模式整个过程过没有被设置为停止模式。
请问是否可以提供给我一个初始化完整的例子,采用中断方式获取捕获周期的例子。谢谢
我爱下载:
回复 Jian Zhou:
在这个文件的启发下,现在可以实现捕获功能了,谢谢
Jian Zhou:
回复 我爱下载:
具体是修改的哪里你可以总结下,因为很多人都在问eCAP捕获的事情,谢谢。
我爱下载:
回复 Jian Zhou:
我跟踪了一下,发现主要问题在于ecap的模式设置始终不正确,正确设置为cap模式就可以了。
系统提供的函数,我重新写了一下,就正确了,不知道是怎么回事。
void ECAPOperatingModeSelect(unsigned int baseAdd, unsigned int modeSelect){ unsigned short ecctl2 = HWREGH(baseAdd + ECAP_ECCTL2); if(modeSelect) { ecctl2 &= ~ECAP_ECCTL2_CAP_APWM;// HWREGH(baseAdd + ECAP_ECCTL2) &= ~ECAP_ECCTL2_CAP_APWM; } else { ecctl2 |= ECAP_ECCTL2_CAP_APWM;// HWREGH(baseAdd + ECAP_ECCTL2) |= ECAP_ECCTL2_CAP_APWM; } HWREGH(baseAdd + ECAP_ECCTL2) = ecctl2;}
Jian Zhou:
回复 我爱下载:
请问这是startware下的代码么?
我爱下载:
回复 Jian Zhou:
void ECAPOperatingModeSelect(unsigned int baseAdd, unsigned int modeSelect){ if(modeSelect) { HWREGH(baseAdd + ECAP_ECCTL2) &= ~ECAP_ECCTL2_CAP_APWM; } else { HWREGH(baseAdd + ECAP_ECCTL2) |= ECAP_ECCTL2_CAP_APWM; }}
这个是starterware下的代码