Thread 中讨论的其他器件:SysConfig
工具/软件:Linux
我们正在尝试使用 BeagleBone Black 上的 PRU 来使用 ePWM1生成 PWM。 我已经修改了 DTB 以包含引脚。
最初、PWMSS1.ePWM_TBCTL 为131、初始化后为128。 我认为这是正确的。 CTRMODE 从冻结计数变为递增计数、其他位保持不变。
此外、如果我将 PWMSS1.ePWM_TBCNT 设置为类似100的值、那么在后续读取时它永远不会改变。
我已经验证了
PWMSS1.EPQM_TBPRD、PWMSS1.ePWM_CMPA 和 PWMSS1.ePWM_CMPB 都设置为 I 设置的值。
就好像时钟不会运行一样。 详细信息如下:
Brake _Bon_PINS:Brake _Bone_PINS{
pinctrl-single、pins =<
0x0A0 (MUX_MODE5)/* pr1_pru1_PRU_r30_0、 P8->45、调试引脚 A *
0x0A4 (MUX_MODE5)/* pr1_pru1_PRU_r30_1、 P8->46、调试引脚 b*/
0x0AC (MUX_MODE5)/* pr1_pru1_PRU_r30_3, P8->44,QEI 使能*/
0x0E0 (PIN_INPUT 下拉| MUX_MODE6)/* pr1_pru1_PRU_R31_8、P8->27、FAULT */
0x0D0 (PIN_INPUT_PULLDOWN | MUX_MODE2) /* eQEP1A_IN P8->35 */
0x0D4 (PIN_INPUT_PULLUX | MUX_MODE2) /* eQEP1B_IN P8->33 */
0x0D8 (PIN_INPUT_PULLDOWN | MUX_MODE2) /* eQEP1_INDEX P8->31 *
0x0DC (PIN_INPUT_PULLDOWN | MUX_MODE2) /* eQEP1_STROBE P8->32 *
0x0E8 (MUX_MODE5)/* pr1_pru1_PRU_r30_10、P8->28、电机触发器1 */
0x0E4 (MUX_MODE5)/* pr1_pru1_PRU_r30_9、 P8->29、PWM 启用 A *
0x0EC (MUX_MODE5)/* pr1_pru1_PRU_r30_11,P8->30,PWM 使能 B */
0x048 (PIN_OUTPUT 下拉| MUX_MODE6)/* ePWM1A、P9.14、制动电流 A *
0x04C (PIN_OUTPUT 下拉| MUX_MODE6)/* ePWM1B、P9.16、制动电流 B *
>;
};
我将 PRU 代码基于该 GitHub 项目:
https://github.com/mhaberler/BBBIOlib/blob/master/BBBio_lib/BBBiolib_PWMSS.c
在 PRU 代码中、我有以下例程 PWM_Init 和 PWM_Enable。 我先调用 PWM_Init、然后调用 PWM_Enable (1)。 我确定周期和占空比不正确、但现在我只想在输出引脚上看到一些东西。 我捕获了一些寄存器、以便您可以看到它们的样子。 正如您看到的、我显式设置了 TBCNT、但它总是返回0 (下面的值为十进制)。 我每10ms 读取一次以下寄存器--总是具有相同的结果。
CM_PER_EPWMSS1 = 2
PWMSS1.ePWM_TBCTL = 128
PWMSS1.CLKSTATUS = 273
PWMSS1.ePWM_TBSTS = 1.
PWMSS1.ePWM_TBCNT = 0
void PWM_Init (void)
{
/*启用 PWMSS1时钟信号生成*/
while (!(CM_PER_EPWMSS1 & 0x2))
CM_PER_EPWMSS1 |= 0x2;
PWMSS1.SysConfig =
(2 < 4) //智能待机模式
|(2 << 2); //智能空闲模式
PWMSS1.ePWM_TBCTL |= 0x3; //冻结
PWMSS1.ePWM_TBPRD = 50000;
PWMSS1.ePWM_CMPA = 30000;
PWMSS1.ePWM_CMPB = 20000;
PWMSS1.ePWM_TBCNT = 100;
}
void PWM_Enable (bool 启用)
{
if (启用)
{
PWMSS1.ePWM_AQCTLA =
(0x3 << 4) // cmpa = set
|(0x2 << 0); //零=高电平
PWMSS1.ePWM_AQCTLB =
(0x3 << 8) // cmpa = set
|(0x2 << 0); //零=高电平
PWMSS1.ePWM_TBCNT = 0;
PWMSS1.ePWM_TBCTL &=~0x3; //向上计数模式
}
其他
{
PWMSS1.ePWM_TBCTL |= 0x3; //冻结
PWMSS1.ePWM_AQCTLA =
(0x3 << 4) // cmpa = set
|(0x1 << 0); //零=强制为低电平
PWMSS1.ePWM_AQCTLB =
(0x3 << 8) // cmpa = set
|(0x1 << 0); //零=强制为低电平
PWMSS1.ePWM_TBCNT = 0;
}
}