前辈 前辈们 快来救救我吧 都一周多了

2019-03-24 14:45发布

小弟 我卡住了
好几天了 
希望前辈们指教啊
我这个程序是产生相位互差90度 
出来的波形是 一样的 怎么回事啊
#include <msp430x14x.h>
unsigned int flag1=0,flag2=0,num=0; 全局变量
void Init_Clock(void)      
{
   int i=0;
   BCSCTL1 &= ~XT2OFF;                       // XT2on
  do
  {
  IFG1 &= ~OFIFG;                           // Clear OSCFault flag
  for (i = 0xFF; i > 0; i--);               // Time for flag to set
  }
  while ((IFG1 & OFIFG));                   // OSCFault flag still set?
  BCSCTL2 |= SELM_2 + SELS;                 // MCLK = SMCLK = XT2 (safe)
  // _EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句
}
void main(void)
{
   WDTCTL = WDTPW + WDTHOLD;
   Init_Clock();
   //定时器B的初始化
   P4DIR |= BIT1+BIT2; // P4.1 - P4.2output
   P4SEL |= BIT1+BIT2; // P4.1 - P4.2 TBx options
   P2DIR |= BIT6+BIT7; //
   TBCTL =TBSSEL_2+TBCLR;   //SMCLK
   TBCCR0 = 19999-1;  20ms
   TBCTL |=MC_1+ID_3; 增加模式 1/8分频
   //定时器A初始化
   TACTL=TASSEL_2+TACLR;//SMCLK
   TACCTL0=CCIE;//CCR0中断允许
   TACCR0=5000-1; 5ms
   TACTL |= MC_1+ID_3+TAIE; 增加模式 1/8分频 开中断
   _EINT();    开中断
   while(1)
  {
   if(flag1==1)
    {
     TBCCR0 = 19999-1;
     TBCCTL1 = OUTMOD_7; // CCR1 reset/set  
     TBCCR1 = 9999; // CCR1 PWM duty cycle 占空比为50%
    // TBCCTL1 = CCIE; 
     flag1=0;
    }
   if(flag2==1)
    {
     TBCCR0 = 19999-1;
     TBCCTL2 = OUTMOD_7;
     TBCCR2 = 9999;    占空比为50%
     //TBCCTL2 = CCIE; 
     flag2=0;
    }
  }
} #pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)         定时器A 中断
   {  
   
     num++;
 switch(TAIV)
 {
   case 2:break;
   case 4:break;
   case 10:
      switch(num)
      {      case 0:break;
             case 1:flag1=1;   num=1,置位flag1
                    P2OUT&=~BIT6;      p2.6灯亮
                    break;
             case 2:flag2=1;               置位flag2
                    P2OUT&=~BIT7;     p2.7灯亮
                    TACTL&=~TAIE;     关定时器A中断
                    TACTL=MC_0;       定时器A 停止模式                      num=0;                     break;
            } 
  }}   [ 本帖最后由 t_shaojun126 于 2012-3-21 10:20 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
osoon2008
1楼-- · 2019-03-26 09:38
我不是前辈,还很嫩。

1. 是不是你的周期太长, 你没有测量完全。
2. 不要再中断里加太多东西。
3. 可不可以使用这种方法。
timer-interrput()
{
    state2 = state1;
    state1 = ~state1;
}
t_shaojun126
2楼-- · 2019-03-26 11:14
 精彩回答 2  元偷偷看……
wangfuchong
3楼-- · 2019-03-26 11:32
http://www.deyisupport.com
问问吧
好像看到过类似的,忘了有没有

笨办法不要用输出模式,直接用中断操作I/O,可能要3个CCR,而且要注意中断中执行时间
用输出模式,还是不熟悉那么多模式,没那个脑筋去琢磨到底能不能做到
鸵鸟蝈蝈
4楼-- · 2019-03-26 12:03
如果是固定占空比的话,还是可以实现的。
我的想法是:
两个Timer采用相同的时钟源。
一路:TimerA,正常PWM输出。参考Output Example, Timer in Up Mode,Out Mode2
另一路:用TimerB做定时反转IO功能。在TimerA CCR0中断中设置TimerB延时(产生相位差),TimerB中断中反转IO,并且重新设置TBCCR0的计数值(高电平),再计数设置GPIO低电平。

只有这样了,你可以试试。
wangfuchong
5楼-- · 2019-03-26 12:07
 精彩回答 2  元偷偷看……
wangfuchong
6楼-- · 2019-03-26 15:52
原帖由 问路者 于 2012-3-21 12:17 发表 很简单的,用一个定时器就行了,CCR0来控制周期,两个捕获模块CCR1,CCR2来设置输出信号占空比及相位,输出模式应该是2吧,翻转/置位,忘了是哪个了,你可以再查查。这样你就可以在两个输出脚上得到90度相位的信号, ...

能不能稍微详细一点呢?那个CCR2用什么模式?

一周热门 更多>

相关问题

    相关文章