您好!
我正在尝试生成5个方波、它们之间的偏移为72度。 我在比较模式下使用计时器 B。 我的问题是我无法初始化输出引脚的初始状态。 我希望其中两个信号从低电平开始、其他三个信号从高电平开始、以便能够实现所需的相移。
谢谢
Nitish
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.
您好!
我正在尝试生成5个方波、它们之间的偏移为72度。 我在比较模式下使用计时器 B。 我的问题是我无法初始化输出引脚的初始状态。 我希望其中两个信号从低电平开始、其他三个信号从高电平开始、以便能够实现所需的相移。
谢谢
Nitish
您好!
您的发现很有意义、因为它显示了我所解释的内容:您的初始状态将被输出模式的默认初始状态覆盖。
我可能有人建议如何解决您的问题、但这取决于您的申请、因此您必须在事后告诉我这是否对您可行:
您可以将 Timer_B 与7个捕获/比较寄存器结合使用、CCR0将设置您的 PWM 周期、您可以使用剩余的 CCRx (或其中的5个)对不同的 PWM 信号进行相移并确定占空比。 我建议使用"切换"模式作为输出模式、并使用计时器的向上计数模式。 但是、需要的是、在 生成中断 并将其设置为下一个值后、重新配置每个 CCRx (例如、第一个 PWM 信号的 CCR1)。
让我们以一个示例为例:
您的 CCR0为2000 (PWM 周期)。
CCR1最初为200、因此当 TBxR 达到200时、您将收到一个中断、OUT1置1。 现在您将 CCR1重新配置为1200、这样 OUT1将在 TBxR 达到1200时复位。
CCR2最初为300、因此当 TBxR 达到300时、您将收到一个中断、OUT2被置位。 现在您将 CCR2重新配置为1300、这样 OUT2将在 TBxR 达到1300时复位。
现在、您可以根据 自己的需求调整班次和 PWM 周期。 在我的示例中、TBxR 在到达 CCR0后被清零。
注意:您必须注意有足够的时间来实际执行 CCRx 的重新配置。 这取决于所需的两个边沿和您为 Timer_B 使用的时钟之间的时间
请告诉我这是否有帮助。
此致、
Britta
#include
/**
* main.c
*
/ void main (void)
{
WDTCTL = WDTPW + WDTHOLD; //停止 WDT
/*P1DIR |= BIT0; // ACLK 设置为引脚
P1SEL |= BIT0;
P2DIR |= BIT2; // SMCLK 设置为引脚
P2SEL |= BIT2;
P7DIR |= BIT7; // MCLK 设置为引脚
P7SEL |= BIT7;*/
P5SEL |= BIT2+BIT3; //端口选择 XT2
P5SEL |= BIT4+BIT5; //端口选择 XT1
UCSCTL6 &=~XT2OFF; //在
UCSCTL6上设置 XT2 &=~XT1OFF; //在
UCSCTL6上设置 XT1 |= XCAP_3; //内部负载电容
UCSCTL1 = DCORSEL_5;
UCSCTL2 = FLLD_1 +(218);
// XT1默认开启、因为它是 FLL 的默认基准-内部负载电容?
//循环直到 XT1、XT2和 DCO 稳定
执行
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);
//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
UCSCTL6 &=~XT2DRIVE0; //根据减少 XT2驱动
//预期频率
UCSCTL4 |= SELA_0 + SELS_5; //选择 SMCLK、ACLK 源和 DCO 源
P5SEL |= 0x80;
P5DIR |= 0x80;
// P5OUT |= BIT7;
P7SEL |= 0x50;
P7DIR |= 0xFF;
//P7OUT |= 0x50;
P3SEL |= 0x60;
P3DIR |= 0xFF;
//P3OUT &=~(BIT4+BIT5);
TB0CCR0 = 89;
//TB0CCTL1 |= BIT2;
// TB0CCTL2 |= BIT2;
// TB0CCTL4 |= BIT2;
TB0CCTL1 = OUTMOD_7;
TB0CCR1 = 68;
TB0CCTL2 = OUTMOD_4 + CCIE;
TB0CCR2 = 18;
TB0CCTL4 = OUTMOD_4 + CCIE;
TB0CCR4 = 14;
TB0CCTL5 = OUTMOD_4 + CCIE;
TB0CCR5 = 32;
TB0CCTL6 = OUTMOD_4 + CCIE;
TB0CCR6 = 50;
TB0CTL = TBSSEL_2 + MC_1 + TBCLR + TAIE;
_bis_register (LPM0_Bits + GIE);
while (1);
}
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=TIMERB0_vector
__interrupt void TIMERB0_ISR (void)
#elif defined (_TIMERB0_TRIBERSIR_
)(void)(void TI_BIMCU_)(void)(void TIMER0)(void TI_TRIBERST_TRIBERSIR_)(void)(void BI_TRIBERSIR_)(
#endif
{
switch (__even_in_range (TB0IV、12))
{
案例4:
如果(TB0CCR2 == 18)
{
TB0CCR2 = 86;
}
其他
{
TB0CCR2 = 18;
}
中断;
案例8:
如果(TB0CCR4 = 14)
{
TB0CCR4 = 36;
}
其他
{
TB0CCR4 = 14;
}
中断;
案例10:
如果(TB0CCR5 == 32)
{
TB0CCR5 = 54;
}
其他
{
TB0CCR5 = 32;
}
中断;
情况12:
如果(TB0CCR6 == 50)
{
TB0CCR6 = 72;
}
其他
{
TB0CCR6 = 50;
}
中断;
默认值:
中断;
}
}
//中断似乎不起作用。 您能告诉我哪里出了问题吗?