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.
工具/软件:Code Composer Studio
主席先生,
我正在尝试使用正弦查找表生成正弦 PWM。 但我没有得到任何输出、您能告诉我错误的地方。 我从 e2e.ti.com 的另一个链接中引用的查找表。
谢谢你
Bighnaraj Panda
您已将 PWM 1中断分配给在比较 A 匹配时发生。 由于 CMPA 已设置为大于时基周期的值、因此不会发生中断、因此永远不会发生匹配。 原因在第175行中、您使用未初始化的变量"IntCount"索引到正弦表中。
由于您在不同的 INTSEL 值之间来回跳转、因此 CMPB 也是如此。 纠正这些问题、您将开始看到中断。
我假设您要更改 ISR 内部的 CMPA/B 设置、在这种情况下、您需要确保查找表条目始终低于 TBPRD、否则不会发生中断。
此致、
Richard
Richard、
很抱歉我的答复很晚,但我用各种不同的方式来理解你的答复。 请解释一下我的 CMPA 值是如何大于时基周期的设置值的。 我已初始化
IntCount = 0;
但我没有得到任何结果。
感谢你的答复
Bighnaraj Panda
Bighnaraj、
您在哪里初始化了"IntCount"? 在您提供的代码中、该变量在第18行中声明、而没有初始化程序、因此它采用未知值。
在第175行中、您使用此未知偏移量索引到正弦表中、那么 EPwm1Regs.CMPA.bit.CMPA 取什么值? 未知、对吧? 如果它大于 PWM1 TBPRD 寄存器、则永远不会看到任何中断、PWM2和 PWM3也是如此。
如果您只是在 第18行初始化"IntCount"、它将起作用。
此致、
Richard
Richard、
我将 IntCount 初始化为
_interrupt void epwm1_ISR (void)
{
interrupt_count++;
unsigned long IntCount = 0;
…
也在 ePWM 的定义范围内
空 InitEPwm1Examples()
{
unsigned long IntCount = 0;
(笑声)
但是、现在我得到了一条直线。 因为我认为它没有得到比较、所以请您详细说明为什么它没有得到比较。
谢谢你
Bighnaraj Panda
Bighnaraj、
您现在获得中断的唯一原因是您已在 Pwm1Examples()中初始化 IntCount,而 IntCount 是在该函数中首次使用的。 但是、当您再次将其初始化为 ISR 内部的局部变量时、每次触发中断时、它始终为零、并且您始终访问正弦阵列中的第一个元素。 IntCount 必须是全局变量、而不是局部变量。
我建议您删除这两个本地声明、返回到此线程顶部的原始代码、然后在第18行初始化 IntCount。 我在我的机器上运行它。
此致、
Richard
Richard、
是的、我执行了相应的操作、但我获得了恒定输出。
空 InitEPwm1Examples()
{
unsigned long IntCount = 0;
//
//设置 TBCLK
//
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;//设置计时器周期801 TBCLK
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器
(笑声)
空 InitEPwm2Examples()
{
unsigned long IntCount = 0;
//
//设置 TBCLK
//
EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;//设置计时器周期801 TBCLK
EPwm2Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm2Regs.TBCTR = 0x0000;//清除计数器
(笑声)
空 InitEPwm3Examples()
{
unsigned long IntCount = 0;
//
//设置 TBCLK
//
EPwm3Regs.TBPRD = EPWM3_TIMER_TBPRD;//设置计时器周期801 TBCLK
EPwm3Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm3Regs.TBCTR = 0x0000;//清除计数器
(笑声)
我是否正确更改了它。
谢谢你
Bighnaraj Panda
您现在应该会获得中断、但最好去掉这些局部变量、然后按照我所说的操作-即具有一个全局 IntCount 变量、该变量在第18行中初始化。
如果您在每个 ISR 的第一行放置一个断点、您应该能够单步执行每个断点-会发生什么情况?
您能解释一下恒定输出的含义吗?"
谢谢。
此致、
Richard
Richard、
是的、我也尝试了生成全局变量
int interrupt_count = 1;
unsigned long IntCount=0;
谢谢你
Bighnaraj Panda
Bighnaraj、
好的、谢谢。 您不需要局部变量"IntCount" anWhere。
我看到了'scope 布线、但它是什么? PWM 输出?
这是一件事: 我认为这是一个 PWM 输出、您的意思是使用正弦表调制 PWM 占空比、但您的代码中没有任何地方会写入 ISR 内的 PWM 比较寄存器、因此我不确定您会看到什么。 可以详细说明吗?
此致、
Richard
Richard、
是的、它是 EPWM1上的输出。 我想我已经把它与 InitEPwm1Example 定义中的比较寄存器进行了比较、如下所示
空 InitEPwm1Examples()
{
//unsigned long IntCount = 0;
//
//设置 TBCLK
//
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;//设置计时器周期801 TBCLK
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm1Regs.TBCTR = 0x0000;//清除计数器
//
//设置比较值
//
EPwm1Regs.CMPA.bit.CMPA = SineTable[IntCount];//设置比较 A 值
EPwm1Regs.CMPB.BIT.CMPB = SineTable[IntCount];//设置比较 B 值
您能不能建议我需要在 ISR 内部进行哪些更改
谢谢你
Bighnaraj Panda
Bighnaraj、
您已经初始化了占空比、但如果希望在程序运行时更改占空比、则必须在 ISR 中写入该占空比。 将上面设置比较值的两行复制到 PWM1 ISR 末尾。
此致、
Richard
Richard、
是的、我已经执行了相应的操作、但仍然、输出是恒定的
_interrupt void epwm1_ISR (void)
{
interrupt_count++;
当计数器递减计数= CMPB 时、//生成第二个中断
if (interrupt_count = 2)
{
GpioDataRegs.GPBDAT.bit.GPIO63 = 1;//将 GPIO-63设置为高电平
// GpioDataRegs.GPBSET.BIO63 = 1;//将 GPIO-63设置为高电平
// GpioDataRegs.GPADD.bit.GPIO14 = 1;//将 GPIO-14设置为高电平
// GpioDataRegs.GPASET.bit.GPIO14 = 1;//将 GPIO-14置为高电平
EPwm1Regs.ETSEL.bit.INTSEL = 7;
}
//当计数器递减计数= CMPB 时生成中断
//当计数器递增计数= CMPA 时、复位下一个中断以再次生成
其他
{
GpioDataRegs.GPBDAT.bit.GPIO63 = 0;//将 GPIO-63设置为低电平
// GpioDataRegs.GPBCLEAR.bit.GPIO63 = 1;//将 GPIO-63设置为低电平
// GpioDataRegs.GPADAT.bit.GPIO14 = 0;//将 GPIO-14设置为低电平
// GpioDataRegs.GPACLEAR.bit.GPIO14 = 1;//将 GPIO-14置为低电平
EPwm1Regs.ETSEL.bit.INTSEL = 4;
INTERRUPT_COUNT = 1;
}
EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
//if (IntCount < 100)
//{
// IntCount++;
//}
//else
// IntCount = 0;
EPwm1Regs.CMPA.bit.CMPA = SineTable[IntCount];//设置比较 A 值
EPwm1Regs.CMPB.bit.CMPB = SineTable[IntCount];
}
谢谢你
Bighnaraj Panda
尊敬的 Bighnaraj:
这将会变得有点复杂。 您所做的基本上是正常的、但您需要更改一些内容。 首先、让我们尝试一个实验。 将 CMPA/CMPB 设置更改为低于 TBPRD 的某个固定值。 您需要在 ISR 和初始化例程中执行此操作。 使用如下内容:
EPwm1Regs.CMPA.bit.CMPA = 0x200;
EPwm1Regs.CMPB.bit.CMPB = 0x300;
现在构建并运行该程序。 您看到输出了吗? 我想您会看到一个不同于以前的固定值。 然后、在 ePWM1 ISR 的第一行放置一个断点、并检查它在您每次运行程序时是否触发。 请告诉我它是否执行此操作以及您发现的内容。 谢谢。
此致、
Richard
Richard、
我知道、如果我将进行设置
EPwm1Regs.CMPA.bit.CMPA,TBPRD 周期内的值,那么我将得到一个方波脉冲响应。 但我无法理解如何使 sine_table 的查找表值与"EPwm1Regs.CMPA.bit.CMPA"寄存器相比较。
谢谢你
Bighnaraj Panda
Bighnaraj、
您能否首先确认您是否在 PWM1 ISR 开始处重复到达断点? 我想你应该是这样的。
此致、
Richard
Richard、
是的、这是通过 EPWM1 (J4引脚40)获取的 PWM 输出。 我想通过将输出 PWM 占空比与正弦波进行比较来调制输出 PWM 占空比。 如果您可以建议我如何在 ISR 内调制占空比、 以书面形式
EPwm3Regs.CMPA.bit.CMPA = SineTable[IntCount];
我尝试将当前正弦值分配给比较位寄存器、以便产生调制 PWM 波。
谢谢你
Bighnaraj Panda
Bighnaraj、
请回答我关于在 PWM1 ISR 上重复触发的问题吗?
在 epw1_ISR 的第一行放置一个断点、然后运行程序。 你可以到达吗?
再次运行程序。 您是否再次访问它?
在发生这种情况之前、查找表是不相关的。
此致、
Richard
Richard、
我研究了一些示例程序和有关正弦查找表的链接。 根据您的建议、我尝试为比较值集修改 ISR 内的占空比。 现在、我将获得占空比相等的方波脉冲。 您是否可以建议进行任何修改。 以下是我所做的修改
谢谢你
Bighnaraj Panda
Richard、
我将断点放在这里
interrupt_count++;
当我运行程序时、它将停止。 它未到达断点。 我是否应该更改查找表。
谢谢你
Bighnaraj Panda
Bighnaraj、
您的代码有两个问题。 其中一个涉及正弦表、但在我们到达该表之前、我需要确保您的代码反复到达这些 ISR、否则没有意义。
前面我要求您对代码进行一些更改、以删除对正弦表的读取并检查 ISR 条目。 回顾一下这个帖子-这是这个主题中的第五个帖子。 请删除这些读数、运行测试、并告知我是否正常工作。 现在忘记输出、我只想知道它是否进入 ISR。 谢谢。
此致、
Richard
Richard、
我删除了 CMPA 寄存器内的 sine_Table[IntCount]的读数、但 ISR 处的断点仍然不会随着所附图像更新寄存器
EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD/2;//SineTable[IntCount];//设置比较 A 值
EPwm1Regs.CMPB.bit.CMPB = EPwm1Regs.TBPRD/2;//SineTable[IntCount];//设置比较 B 值
谢谢你
Bighnaraj Panda
Bighnaraj、
对代码进行了大量更改、我很难跟上步伐、因此我想尝试另一种方法。 我附加了一个 C 文件、我认为它与您现在拥有的文件非常接近。 我希望您用这个替换您正在处理的文件。
然后、照常编译和加载、并在第99行上放置一个断点、然后运行程序。 您应该在每次运行时都达到此断点。 请确认发生了这种情况。 谢谢。
此致、
Richard
Richard、
我在第99行放置一个断点。 当我运行代码时、该断点处的寄存器值不会递增或显示任何值。
谢谢你
Bighnaraj Panda
Bighnaraj、
我没有问过寄存器。 我想知道的是、每次运行程序时、您是否达到了断点。 我将假定您已到达 BP。 如果这是错误的、请告诉我;否则、您需要查看以下内容。
您的初始问题是 CMPA/B 被载入大于 TBPRD 的值。 这意味着 PWM 中断最初是在 CMPA 递增计数事件上配置的、但从未发生过。 错误加载 CMPx 寄存器的原因是 IntCount 变量未初始化。 我解释说您需要初始化全局变量、我相信您现在已经这样做了。
查找表中的第一个条目为零。 通常、这不会导致问题、但您的代码正在 CMPA 递增计数和 CMPB 递减计数之间切换中断触发器。 当阈值为零时、这会导致生成一个在 PIE 级别未确认的中断、并且中断停止。 如果您注释掉第109行和第120行、您可能会发现中断正常工作。 我尚未分析您丢失中断的原因、但我建议首先尝试这样做、以确保您在继续之前获得可靠的中断。
我不知道查找表的完整性。 我知道您在另一个论坛主题中找到了它。 我观察到您使用2500加载 TBPRD、并且表中大多数条目的高16位大于该值、这意味着当您将这些值加载到 CMPx 寄存器中时不会获得中断。 您需要考虑表中与 TBPRD 寄存器相关的内容。
如果感兴趣、您可能希望查看您所使用器件的1天技术讲座实验4中的正弦表。 我已附上该文件、您可以在此处找到其他实验课程材料:
training.ti.com/c2000-workshops
但愿这对您有所帮助。
此致、
Richard