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.
您好!
对于280049、我们需要监控多个模拟输入、以便使用比较器对 ePWM 进行三角测量。
例如、我们从2个比较器(1和3)开始、然后设置7。
我们所面对的问题是:
CMPSS1工作正常、并对 ePWM 进行 TRIG
当 CMPSS1未启用时、CMPSS3工作正常、它会触发 ePWM 和外部 IO
只要我启用 CMPSS1、CMPSS3就不再工作。
我已经加入了2个初始化代码段,但在 CMPSS1中看不到哪些指令可能会阻塞 CMPSS3?
此致
Francois
空 Comp1Init (空)
{
//! 初始化输出电压比较器。
//!
//! \param 无。
//!
//! CMPSS1
//!
//! 返回0无。
EALLOW;
CpuSysRegs.PCLKCR14.bit.CMPSS1 = 1;/* 1:模块时钟被打开。 *
Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;/* 1比较器/DAC 被启用*
/*比较器高电平*/
Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = 0;/* 0由内部 DAC 驱动的比较器的反相输入*
Cmpss1Regs.COMPDACCTL.bit.SELREF = 0;/* 0 VDDA 是 DAC 的电压基准*
Cmpss1Regs.DACHVALS.bit.DACVAL = 2048;//3560;
Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = 0;/* 0异步比较器输出驱动 CTRIPH */
//Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL = 0;/* 0异步比较器输出驱动 CTRIPOUTH *
/*输入高电平= A2 */
AnalogSubsysRegs.CMPHPMXSEL.bit.CMP1HPMXSEL = 0;// 0:A2 High Positive *
/* EPwmA 上的触发区*/
EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX0 = 0;//将 TRIP4配置为 CTRIP1H */
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX0 = 1;// 1:启用 Mux0的相应输出以驱动 ePWM-XBAR 的 TRIP4 */
EDIS;
}
空 COMP3Init (空)
{
//! 初始化输出电压比较器。
//!
//! \param 无。
//!
//! CMPSS3
//!
//! 返回0无。
EALLOW;
CpuSysRegs.PCLKCR14.bit.CMPSS3 = 1;// 1:模块时钟被打开。 *
Cmpss3Regs.COMPCTL.bit.COMPDACE = 1;/* 1比较器/DAC 被启用*
/*比较器高电平*/
Cmpss3Regs.COMPCTL.bit.COMPHSOURCE = 0;/* 0由内部 DAC 驱动的比较器的反相输入*
Cmpss3Regs.COMPDACCTL.bit.SELREF = 0;/* 0 VDDA 是 DAC 的电压基准*
Cmpss3Regs.DACHVALS.bit.DACVAL = 2048;//3560;
Cmpss3Regs.COMPCTL.bit.CTRIPHSEL = 0;/* 0异步比较器输出驱动 CTRIPH */
Cmpss3Regs.COMPCTL.bit.CTRIPOUTHSEL = 0;/* 0异步比较器输出驱动 CTRIPOUTH *
/*输入高电平= B3 */
AnalogSubsysRegs.CMPHPLXSEL.bit.CMP3HPMXSEL = 3;// 3:B3为高电平正数*/
/* EPwmA 上的触发区*/
EPwmXbarRegs.TRIP7MUX0TO15CFG.bit.MUX4 = 0;//将 TRIP7配置为 CTRIP3H */
EPwmXbarRegs.TRIP7MUXENABLE.BIT.MUX4 = 1;// 1:启用 Mux0的相应输出以驱动 ePWM-XBAR 的 TRIP7 */
/*到引脚的输出*/
OutputXbarRegs.OUTPUT5MUX0TO15CFG.bit.MUX4 = 0;/* 00:为 Mux0选择.0输入*/
OutputXbarRegs.OUTPUT5MUXENABLE.BIT.MUX4 = 1;/* 1:启用 Mux0的相应输出以驱动 OUTPUT5的 OUTPUT5输出- XBAR *
GpioCtrlRegs.GPADIR.bit.GPIO28 = 1;/* 1:引脚为输出*/
GpioCtrlRegs.GPAMUX2.bit.GPIO28=1;
GpioCtrlRegs.GPAGMUX2.bit.GPIO28 = 1;
EDIS;
}
当您说"CMPSS3不再工作"时、GPIO28上的输出和 PWM 跳闸是否都停止工作、或者它只是一个还是另一个? COMPSTS 寄存器是否显示正确的状态? 您能详细说明吗?
代码中没有任何内容会对我产生影响。 您是否介意分享 PWM 配置中与跳闸配置相关的部分?
惠特尼
您好、Whitney、
感谢您处理我们的问题。
当 CMPSS3是单独的时、GPIO28和 ePWM 一起跳闸
进一步了解您的信息,我在不使用和使用 Comp1Init()的情况下做了一些实验。
<或>是比较器条件
1 3 COMPSTS1 COMPSTS3 GPIO28 ePWM
尊敬的 Francois:
为了进行调试、现在我们尝试隔离比较器和 ePWM 连接、只关注比较器。 如果您只将 CMPSS1和 CMPSS3路由到输出 XBAR、它们在一起单独初始化时是否按预期工作?
您好 Frank、
感谢您的回复。 我已经对比较器进行了更多调查、但我更愿意听取您的意见?
我在打开时钟和配置之间增加了一个小延迟、现在正在工作。
下面是我添加的内容、现在 CMPSS 似乎已正确初始化。
空 COMP3Init (空)
{
//! 初始化输出电压比较器。
//!
//! \param 无。
//!
//! CMPSS3
//!
//! 返回0无。
uchar i;
EALLOW;
CpuSysRegs.PCLKCR14.bit.CMPSS3 = 1; // 1:模块时钟被打开。 *
I = 0;
操作
I ++;
while (i!= 0);
Cmpss3Regs.COMPCTL.bit.COMPDACE = 1; /* 1比较器/DAC 被启用*
/*比较器高电平*/
Cmpss3Regs.COMPCTL.bit.COMPHSOURCE = 0; /* 0由内部 DAC 驱动的比较器的反相输入*
Cmpss3Regs.COMPDACCTL.bit.SELREF = 0; /* 0 VDDA 是 DAC 的电压基准*
Cmpss3Regs.DACHVALS.bit.DACVAL = 2048;//DataFlash.VOutMax * VOUTGAIN;
Cmpss3Regs.COMPCTL.bit.CTRIPHSEL = 0; /* 0异步比较器输出驱动 CTRIPH */
Cmpss3Regs.COMPCTL.bit.CTRIPOUTHSEL = 0; /* 0异步比较器输出驱动 CTRIPOUTH *
/*输入高电平= B3 */
AnalogSubsysRegs.CMPHPLXSEL.bit.CMP3HPMXSEL = 3; // 3:B3为高电平正数*/
/* EPwmA 上的触发区*/
EPwmXbarRegs.TRIP7MUX0TO15CFG.bit.MUX4 = 0; //将 TRIP5配置为 CTRIP3H */
EPwmXbarRegs.TRIP7MUXENABLE.BIT.MUX4 = 1; // 1:启用 Mux0的相应输出以驱动 ePWM-XBAR 的 TRIP5 */
/*到引脚的输出*/
OutputXbarRegs.OUTPUT5MUX0TO15CFG.bit.MUX4 = 0; /* 00:为 Mux0选择.0输入*/
OutputXbarRegs.OUTPUT5MUXENABLE.BIT.MUX4 = 1; /* 1:启用 Mux0的相应输出以驱动 OUTPUT5的 OUTPUT5输出- XBAR *
//GpioDataRegs.GPASET.bit.GPIO28 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO28 = 1; /* 1:引脚为输出*/
GpioCtrlRegs.GPAMUX2.bit.GPIO28=1;
GpioCtrlRegs.GPAGMUX2.bit.GPIO28 = 1;
EDIS;
}
尊敬的 Francois:
我很高兴您找到了权变措施、但解决方案有点奇怪。 我从未见过这种情况。 我想知道它是否与 PCLKCR14的读取-修改-写入有关、因为它包含所有 CMPSS 的时钟开启。 如果可以、请尝试下面的几个实验、以便我们能够弄清发生了什么。
1.如果您在启用 CMPSS1和 CMPSS3后立即返回原始代码、您能否检查两个 CMPSS 的 COMPDACE 位以查看它们是否确实设置为1?
2.要确认这不是读-修改-写问题、在使用 PCLKR14启用 CMPSS1和 CMPSS3时、而不是使用 CpuSysRegs.PCLKCR14.bit.CMPSS1和 CpuSYSRegs.PCLKCR14.bit.CMPSS3时、请使用 CpuSysRegs.PCLKCR14.PCKCR14.all。 在 CMPSS1配置代码中、写入一个只开启 CMPSS1的值。 在 CMPSS3代码中、将其写入一个同时打开 CMPSS1和 CMPSS3的值。
您好、Frank、
根据您的建议,我已经测试了以下内容:
1)
删除我的权变措施
当我初始化两个 CMPSS (1然后是3)时、3不起作用
PCLK14 = 0x0000 0005 (两个 CMPSS 都计时)
Cmpss1Regs.COMPCTL.COMPDACE = 1 ->确定
Cmpss3Regs.COMPCTL.COMPDACE = 0 ->错误(这就是问题所在)
2)
删除我的权变措施
将 CpuSysRegs.PCLKCR14.ALL = 0x0001;置于 COMP1Init()中
将 CpuSysRegs.PCLKCR14.ALL = 0x0005;置于 Comp3Init()中
PCLK14 = 0x0000 0005 (两个 CMPSS 都计时)
Cmpss1Regs.COMPCTL.COMPDACE = 1 ->确定
Cmpss3Regs.COMPCTL.COMPDACE = 0 ->错误
我认为问题是时钟稳定问题、如果我与调试器分步执行程序、那么就可以了。
此致
Francois
尊敬的 Francois:
感谢您执行附加调试。 是的、您是对的、这看起来像是时钟延迟问题。 这种行为是意外的。 即使在配置模块之前存在时钟延迟、我也希望 CMPSS1和 CMPSS3都需要相同的延迟、但根据您的分析、CMPSS1不需要延迟、而 CMPSS3需要延迟。
如果您不介意、可以再运行一个实验吗? 我想确认哪个 CMPSS 表现出该行为。 是否可以对所有7个 CMPSS 重复相同的实验? 打开每个 CMPSS 的时钟、写入 COMPDACE 并检查是否设置为1。
您好 Frank、
我已经完成了以下操作,这里的结果是:
尊敬的 Francois:
感谢您进行额外的调试。 这很有意思。 让我进行一些本地调查、然后返回给您。 预计下周周二会收到回复。
尊敬的 Francois:
事实证明、此问题已在本地确定、受影响的器件已更新了反映此问题的文档。 F28004x 器件错过了此更新。 正如您正确识别的那样、在模块寄存器可以被写入之前、启用到模块的时钟需要一个延迟。 此延迟为5 NOP。 我已提交一个 TT、以将此备注添加到 F28005750的 TRM 中。 很抱歉给您带来不便。
您好 Frank、
感谢您确认5 nop 后、我将在所有比较器初始化中实施您的解决方案。
最好的平地机
Francois