打印

请教MSP430F5438A 的 P7.3 如何捕捉方波? 我 这个代码问题在哪儿?

[复制链接]
1054|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vcxz_1982|  楼主 | 2015-11-19 13:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MSP430F5438A 的 P7.3接了个PWM输出的模块, 对应的是TA1.2, 请问如何用这个口捕捉方波? 我下面你的代码无法进入中断 Case 2.
另外, 请问Read函数如何写最好呢? 是根据标志位判断
Read()
{
1. 开启捕捉
2. 等待标志位=1, 得到结果
3. 关闭捕捉
}
这样写对吗? 还是让他一直捕捉?




ulong start= 0;
ulong end= 0;
ulong diff= 0;
uint overflow=0;
uchar cap_flag= 0;

#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1(void)
{
       
        switch(__even_in_range(TA1IV,14)) //向量查询
               
        {
        case 2: //捕获中断
        {
                if(TA1CCTL2&CM0) //上升沿
                {
                        cap_flag= 0;
                        TA1CCTL2=(TA1CCTL2&(~CM0))|CM1; //更变设置为下降沿触发
                        start=TA1CCR2; //记录初始时间
                        overflow=0; //溢出计数变量复位
                }
                else if (TA1CCTL2&CM1) //下降沿
                {
                        TA1CCTL2=(TA1CCTL2&(~CM1))|CM0; //更变设置为上升沿触发
                        end=TA1CCR2; //用start,end,overflow计算脉冲宽度
                        diff= end-start;
                        cap_flag= 1;
                }
        }
        break;
               
        case 10: //定时器溢出中断
                overflow++;
                break; //溢出计数加1

        default:
                break;
               
        }
       
}


void Init_Timer1_A3(void)
{

        P7SEL|=BIT3;//选择p7.3第二功能
        P7DIR &=~BIT3;//选择p7.3方向为输入
        TA1CCTL2&=~(CCIS1+CCIS0); // 捕获源为P7.3,即CCI0A(也是CCI0B)
        TA1CCTL2|=CM0+SCS+CAP; //下降沿捕获,同步捕获,工作在捕获模式

        // TA1CCTL0|=CCIE; //允许捕获比较模块提出中断请求
        TA1CCTL2|=CCIE; //允许捕获比较模块提出中断请求
        // TA1CCTL2|=CCIE; //允许捕获比较模块提出中断请求

//        TA1CTL|=TASSEL_2; //选择时钟SMCLK
//        TA1CTL|=TACLR; //定时器清零,      
//        TA1CTL|=MC_2;//定时器开始计数(连续计数模式0~0xFFFF) TBCTL|=MC_2;

                TA1CTL = TASSEL_1 + MC_2 + TACLR + TAIE;
}



相关帖子

沙发
dirtwillfly| | 2015-11-19 13:56 | 只看该作者
你是要捕获方波的周期还是占空比?

使用特权

评论回复
板凳
baimiaocun2015| | 2015-11-19 13:56 | 只看该作者
要一直处于捕获状态的。。这相当于一个中断的。。

使用特权

评论回复
地板
vcxz_1982|  楼主 | 2015-11-19 14:10 | 只看该作者
dirtwillfly 发表于 2015-11-19 13:56
你是要捕获方波的周期还是占空比?

占空比.

这个传感器模块:

1个周期100mS, 代表0~100级别.
高电平代表1, 比如如果维持了10毫秒的高电平, 那么就代表10级别.

使用特权

评论回复
5
vcxz_1982|  楼主 | 2015-11-19 14:12 | 只看该作者
baimiaocun2015 发表于 2015-11-19 13:56
要一直处于捕获状态的。。这相当于一个中断的。。

问题是我的程序还要读取其他传感器, 这个传感器模块只是其中一种.

这个传感器是在不停的输出方波.
如果一直处于捕获状态, 会不会影响其他代码运行?

使用特权

评论回复
6
精彩人生sun| | 2015-11-19 14:56 | 只看该作者
没见你清除中断标志。应该中断中清标志了吧

使用特权

评论回复
7
vcxz_1982|  楼主 | 2015-11-19 15:08 | 只看该作者
精彩人生sun 发表于 2015-11-19 14:56
没见你清除中断标志。应该中断中清标志了吧

我现在主要问题是, 总是进入中断, 但是没有进入case 2

使用特权

评论回复
8
dirtwillfly| | 2015-11-19 15:18 | 只看该作者

使用特权

评论回复
9
vcxz_1982|  楼主 | 2015-11-19 22:54 | 只看该作者
问题解决了, 受益于dirtwillfly的指点,

主要问题是:
1. 定时器里面代码不宜过多
2. 没有考虑溢出的累积.
3. 没有考虑8M晶振1/8分频后.

下面2个帖子
https://bbs.21ic.com/icview-293369-1-1.html

http://hanwangwang1989.blog.163. ... 590172010718754659/

使用特权

评论回复
评分
参与人数 2威望 +15 收起 理由
dirtwillfly + 10 很给力!感谢分享经验
xyz549040622 + 5
10
xyz549040622| | 2015-11-20 08:10 | 只看该作者
灰哥就是厉害

使用特权

评论回复
11
zhangbo1985| | 2015-11-20 10:50 | 只看该作者
这个在检查下相关的寄存器设置的吧,这个容易跟定时器的功能混淆的。

使用特权

评论回复
12
vcxz_1982|  楼主 | 2015-11-20 18:30 | 只看该作者
<p>ulong start= 0;
ulong end= 0;
ulong diff= 0;
uint overflow=0;

#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1(void)
{</p><p> switch(TA1IV) //向量查询
{
case TA1IV_TA1CCR2: //捕获中断
{
  if(TA1CCTL2&CM0) //上升沿
  {
   TA1CCTL2=(TA1CCTL2&(~CM0))|CM1; //更变设置为下降沿触发
   start=TA1CCR2; //记录初始时间
   overflow=0; //溢出计数变量复位
  }
  else if (TA1CCTL2&CM1) //下降沿
  {
   TA1CCTL2=(TA1CCTL2&(~CM1))|CM0; //更变设置为上升沿触发
   end=TA1CCR2; //用start,end,overflow计算脉冲宽度
   TBCTL|=TBCLR;
   diff= ((overflow*65536) + end-start)/1000;
   // cap_flag= (end>=start);
  }
}
break;
  
case TA1IV_TA1IFG: //定时器溢出中断
  overflow++;
  break; //溢出计数加1</p><p> default:
  break;
  
}</p><p>
}</p><p>
void Init_Timer1_A3(void)
{
P7SEL|=BIT3;//选择p7.3第二功能
P7DIR &=~BIT3;//选择p7.3方向为输入

TA1CCTL2 = CCIS0; // 捕获源为P7.3   CCI2B
TA1CCTL2|= CM1+SCS+CAP; //下降沿捕获,同步捕获,工作在捕获模式
TA1CCTL2|= CCIE;

TA1CTL = TASSEL_2+ID_3+TACLR+TAIE+MC_2;
// 先捕获下降沿 CM1. 然后再中断里面的下降判断中设置捕获上升沿.
}


</p><p> </p>
感谢您的帮助! 把代码贴出来分享一下. 8M晶振.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

202

帖子

1

粉丝