搜索
bottom↓
回复: 80

430149定时器测量低频脉宽

[复制链接]

出0入0汤圆

发表于 2013-6-17 16:01:48 | 显示全部楼层 |阅读模式
本帖最后由 gfy200866 于 2013-6-17 16:39 编辑

现在在用430149开发板做一个测量外部方波信号高电平宽度的实验。不知道为什么显示老是不正确。特来请教高手指点。
配置如下:1、430149单片机。
          2、选P1.2为功能口,TA1(CCI1A为信号源 输入)
               3、开机默认上升沿,同步,捕获,捕捉到上升沿后,再捕捉下降沿,两者的差值便是外部信号高电平宽度。
          4、时钟为SMCLK,8分频,连续计数模式,允许溢出中断;
               5、信号输入为外部提供的低频方波,高电平宽度,在70MS。
          6、为了便于观察,直接接到12864LCD上,显示5位数字。

现在的问题是:我参照标准的流程改动的程序,采集到高电平的脉宽后,送显示总是不正确和我外接的脉冲信号不一致。不知道什么回事,很是上火啊。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2013-6-17 16:03:34 | 显示全部楼层
下面附上的是主程序部分:
//********************************************************************
//128*64液晶显示
//开发板使用TIMERA进行连续计数模式的实验,
//测量P1.2口,输入的外部方波信号,检测“高电平”宽度,输入为70MS左右。
//捕捉到的高电平的宽度WIDE通过LCD显示出来。
//钟源为XT2CLK 8MHZ设置 1/8 分频后,时钟为 1M,这
//样70ms 的脉宽应该得到 70ms/(1000000)=70000!
//显示前数据除以10后送显示,应该为7000;
//********************************************************************

#include <msp430x14x.h>
#include "Config.h"                //开发板配置头文件,主要配置IO端口信息
unsigned int start,end,wide=1000;
unsigned char overflow;

//*************************************************************************
//           主函数
//*************************************************************************
void main(void)
{
  
  WDT_Init();                        //看门狗关闭
  Clock_Init();                      //系统时钟设置MCLK时钟源为XT2CLK;SMCLK时钟源为XT2CLK 均为8MHZ;

  Close_LED();                       //关闭数码管显示


  P1SEL |= BIT2;                       //;P1.2为功能口,TA1(CCI1A input)
  TACTL=TASSEL_2+MC_2+TACLR+TAIE+ID_3;//时钟为SMCLK**,连续计数模式,清楚定时器,允许溢出中断;8分频
  CCTL1=CM_1+SCS+CAP+CCIE+CCIS_0;     //开机默认上升沿捕捉,同步,捕获,开中断。*CCI1A为信号源*,  
  LCD_Init();                         //lcd初始化
  
  _EINT();//开中断
  
  while(1)
  {
  HEX_TO_BCD(wide,sjbcd00);
  numxs();                  //显示wide脉宽值 ,初始值为1000;
  delay_ms(100);

   }   
}

//***********************************************************************
//             TIMERA中断服务程序,需要判断中断类型
//***********************************************************************

#pragma vector = TIMERA1_VECTOR//TA捕获中断服务程序
__interrupt void Timer_A(void)
{
  switch(TAIV)                                  //需要判断中断的类型
  {
  case 2://TA1中断                       //捕获中断
    if (CCTL1&CM_1)                      //上升沿中断到来
    {   
      start=TAR;                        //同CCR1;                             
      CCTL1=(CCTL1&(~CM_1))|CM_2;        //改为下降沿触发
        
      overflow=0;                      //溢出计数复位
    }
    else if (CCTL1&CM_2)                 //下降沿捕捉
    {
      end=TAR;//TAR;
      CCTL1=(CCTL1&(~CM_2))|CM_1;         //改为上升沿触发

      wide=overflow*(65535/10)+(end-start)/10;//计算wide脉宽值

      HEX_TO_BCD(wide,sjbcd00);//BCD吗转换。
      numxs();//显示wide脉宽值  
      delay_ms(100);//延时100MS

    }         
    break;  
  case 10:
    overflow++;  //溢出计数加1;70MS的脉宽一定会溢出的
    HEX_TO_BCD(wide,sjbcd00);
    numxs();// 保持显示捕捉到的“高电平”宽度,显示wide脉宽值 ,
    delay_ms(100);
    break;
  default:
    break;   
  }
}

出0入0汤圆

 楼主| 发表于 2013-6-17 16:04:37 | 显示全部楼层
本帖最后由 gfy200866 于 2013-6-17 16:42 编辑

系统时钟设置子程序如下:
void Clock_Init()
{
  uchar i;
  BCSCTL1&=~XT2OFF;                 //打开XT2振荡器
  BCSCTL2|=SELM1+SELS;   // MCLK时钟源为XT2CLK;SMCLK时钟源为XT2CLK 均为8MHZ;
  do{
    IFG1&=~OFIFG;                   //清楚振荡器错误标志
    for(i=0;i<100;i++)
      _NOP();
  }
  while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
  IFG1&=~OFIFG;
}

出0入0汤圆

 楼主| 发表于 2013-6-17 16:07:21 | 显示全部楼层
其他的程序都是基本的配置程序不会影响到该程序的调试:
比如:void WDT_Init()
{
  WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
}


HEX_TO_BCD(wide,sjbcd00);//转BCD码程序
  numxs();                  //送显示程序,显示wide脉宽值 ,初始值为1000;
  delay_ms(100);   //延迟程序,

出0入0汤圆

 楼主| 发表于 2013-6-17 16:22:08 | 显示全部楼层
本帖最后由 gfy200866 于 2013-6-17 16:44 编辑

因为我采集的信号是低频的,高电平在70ms,;
晶振源为XT2CLK 8MHZ设置 1/8 分频后,时钟为 1M,这样70ms 的脉宽应该得到 70ms/(1000000)=70000!
为了便于显示,数据除以10后送显示,应该为7000;即: wide=overflow*(65535/10)+(end-start)/10;//计算wide脉宽值
不知道这样对不对。现在显示老是不稳定。显示经常在12136和17717这两个数字附近显示。
我感觉应该是那里没有设置好。在中断程序中CASE 2的最后加入清零指令后也是一样?(TACTL=TACLR或者overflow=0;)
不知道那位大虾做过类似的,请指点一二。

出0入0汤圆

 楼主| 发表于 2013-6-17 16:30:32 | 显示全部楼层
本帖最后由 gfy200866 于 2013-6-17 16:49 编辑

我采集的这个信号,应该会使定时器溢出,溢出时是不是计数满了为FFFF(65535);那么溢出的次数值乘以65535再加上,上升沿和下降沿采集到数据的差值是不是就最后高电平的宽度;即: wide=overflow*65535+end-start

出0入0汤圆

 楼主| 发表于 2013-6-17 16:50:57 | 显示全部楼层
不知道那里没搞对,一直没找到原因,还望高手指点一二

出0入0汤圆

发表于 2013-6-17 17:25:41 | 显示全部楼层
粗略地看了一眼     wide=overflow*65535+end-start  这个公式计算溢出了

出0入0汤圆

 楼主| 发表于 2013-6-18 08:08:12 | 显示全部楼层
祥子 发表于 2013-6-17 17:25
粗略地看了一眼     wide=overflow*65535+end-start  这个公式计算溢出了

谢谢你的回答,但是送显示前我已经处理了啊? wide=overflow*(65535/10)+(end-start)/10;//计算wide脉宽值

出0入0汤圆

 楼主| 发表于 2013-6-18 08:35:43 | 显示全部楼层
我又把输入信号改为脉宽为17ms,这样定时器就应该不会溢出了,计算公式改为wide=end-start;//计算wide脉宽值 ;但是显示确实55870-55930之间变化显示的数字。还是不对??

出0入0汤圆

发表于 2013-6-18 08:50:57 | 显示全部楼层
gfy200866 发表于 2013-6-18 08:35
我又把输入信号改为脉宽为17ms,这样定时器就应该不会溢出了,计算公式改为wide=end-start;//计算wide脉宽值 ...

建议设置断点,手动根据寄存器的值计算下,看下结果是否正确。

出0入0汤圆

 楼主| 发表于 2013-6-18 08:59:48 | 显示全部楼层
祥子 发表于 2013-6-18 08:50
建议设置断点,手动根据寄存器的值计算下,看下结果是否正确。

谢谢,这个怎么设置,是在仿真状态下吗?没用过

出0入0汤圆

发表于 2013-6-18 09:17:16 | 显示全部楼层
gfy200866 发表于 2013-6-18 08:59
谢谢,这个怎么设置,是在仿真状态下吗?没用过

是的,仿真状态下。

先理清思路,看下程序是怎么运行的。  
在获取到两个寄存器值后,设置一个断点。

出0入0汤圆

 楼主| 发表于 2013-6-18 09:30:30 | 显示全部楼层
祥子 发表于 2013-6-18 09:17
是的,仿真状态下。

先理清思路,看下程序是怎么运行的。  

谢谢,软件仿真可以吗?(必须外接仿真器吗?),还有怎么给怎么给外部输入信号赋初值呢?

出0入0汤圆

 楼主| 发表于 2013-6-18 09:40:06 | 显示全部楼层
下面是我仿真时的图片

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2013-6-18 13:32:11 | 显示全部楼层
LZ改下外部脉冲的宽度,使你的程序可以测量,多测试几个值,看下实际的脉冲宽度和你测出的宽度,是不是成整倍关系,然后就好分析问题了

出0入0汤圆

 楼主| 发表于 2013-6-18 13:38:23 | 显示全部楼层
laujc 发表于 2013-6-18 13:32
LZ改下外部脉冲的宽度,使你的程序可以测量,多测试几个值,看下实际的脉冲宽度和你测出的宽度,是不是成整 ...

大虾, 你终于来了,呵呵太感谢了。我现在把脉宽该成高电平17ms的。这样应该不会溢出了。计算公式改成wide=end-start;//计算wide脉宽值;结果显示为55870--55943之间,也是不正确的啊。而且也不稳定显示。

出0入0汤圆

 楼主| 发表于 2013-6-18 13:56:39 | 显示全部楼层
我又做了一个高电平宽度为35.6MS的信号,公式成wide=end-start;//显示为55870--55940最后停止在55939;最后我又把频率改为30.2;显示仍然不变化最后停止在55939

出0入0汤圆

 楼主| 发表于 2013-6-18 14:02:43 | 显示全部楼层
laujc 发表于 2013-6-18 13:32
LZ改下外部脉冲的宽度,使你的程序可以测量,多测试几个值,看下实际的脉冲宽度和你测出的宽度,是不是成整 ...

怎么我发现该了几个信号显示都一样呢,高电平分别为15;17;30;35MS。结果wide送显示后都是一样的呢?都在55900附近

出0入0汤圆

 楼主| 发表于 2013-6-18 14:22:42 | 显示全部楼层
我又调了一个高电平宽度在240us的信号,结果输出也是55900附近变动?

出0入0汤圆

发表于 2013-6-18 14:40:05 | 显示全部楼层
确定16进制转10进制没转换错误?

你的计数肯定会溢出,但不会溢出两个计数最大值,那么计算时怎么不直接用 wide = end-start +65535;(wide可以定义为长整形撒)

  

出0入0汤圆

发表于 2013-6-18 14:44:37 | 显示全部楼层
你在脉冲起始的时候再开启定时器,等脉冲结束的时候读出定时器的值

出0入0汤圆

 楼主| 发表于 2013-6-18 15:31:04 | 显示全部楼层
五木 发表于 2013-6-18 14:40
确定16进制转10进制没转换错误?

你的计数肯定会溢出,但不会溢出两个计数最大值,那么计算时怎么不直接用 ...

HEX转BCD应该没问题的。我这边显示只能5位。所以我定义了wide为int型。如果超出,把数据除以10在送wide,然后送显示,这样有问题吗?

出0入0汤圆

 楼主| 发表于 2013-6-18 15:36:21 | 显示全部楼层
我把高电平宽度调到200US左右,显示竟然还是不变。这个宽度应该是没有定时器溢出的,我把溢出标志overflow送显示发现。竟然是1;这么个脉宽也会溢出呢。我现在不管输入什么频率的脉宽好像采集到的wide都是一个值。咋回事哪

出0入0汤圆

 楼主| 发表于 2013-6-18 15:38:51 | 显示全部楼层
yy8047 发表于 2013-6-18 14:44
你在脉冲起始的时候再开启定时器,等脉冲结束的时候读出定时器的值

开定时器??我没专门执行这个操作啊?

出0入0汤圆

发表于 2013-6-18 15:41:22 | 显示全部楼层
gfy200866 发表于 2013-6-18 15:31
HEX转BCD应该没问题的。我这边显示只能5位。所以我定义了wide为int型。如果超出,把数据除以10在送wide, ...

你可以试试多次采样,取平均值试试。

我用过HT的读脉宽,最宽脉宽2ms,双沿中断触发。

你的数据对10取模后还有计算式,引入误差肯定不少!

建议一步一步的调试,把每一步得到的数据都显示出来。比如上升沿得到的数据显示出来,下降沿得到的数据也 显示出来,处理得到的脉宽同样显示出来,最后转换为十进制后的也显示出来。这样就能发现哪个地方的问题了!

出0入0汤圆

 楼主| 发表于 2013-6-18 15:44:05 | 显示全部楼层
五木 发表于 2013-6-18 15:41
你可以试试多次采样,取平均值试试。

我用过HT的读脉宽,最宽脉宽2ms,双沿中断触发。

好的谢谢,我试试。我现在输入不同频率的信号,输出显示wide.基本都是一样的,郁闷啊

出0入0汤圆

 楼主| 发表于 2013-6-18 16:18:23 | 显示全部楼层
五木 发表于 2013-6-18 15:41
你可以试试多次采样,取平均值试试。

我用过HT的读脉宽,最宽脉宽2ms,双沿中断触发。

我把上升沿开始后得到的第一个数据start,显示发现是一个不断变动的数据;按说不应该变的啊。我有在这个加入另定时器清零指令,TACTL |=TACLR;,然后start送显示是0,正确。;接着我又把下降沿来是捕捉到的定时器end送显示,结果是38730到38770之间变化的数字,(上升沿捕捉时定时器已经清零),此时改变输入信号频率,显示仍然不变。

出0入0汤圆

发表于 2013-6-18 16:25:50 | 显示全部楼层
gfy200866 发表于 2013-6-18 15:38
开定时器??我没专门执行这个操作啊?

你不是要测高电平的脉宽吗,那就先将IO口设置成上升沿中断,进入中断后立即开启定时器计数,等下跳沿时捕获好像是自动保存数值的,你只要读出该数值就行了。你先前那种方法前后沿的误差太大了,就是你中断立即进入也都有误差的,不过只有一边的误差相对来说小些

出0入0汤圆

 楼主| 发表于 2013-6-18 16:36:47 | 显示全部楼层
本帖最后由 gfy200866 于 2013-6-18 16:38 编辑
yy8047 发表于 2013-6-18 16:25
你不是要测高电平的脉宽吗,那就先将IO口设置成上升沿中断,进入中断后立即开启定时器计数,等下跳沿时捕 ...


是这样吗?进入上升沿中断后执行下面两调语句
TACTL=TASSEL_2+MC_2+TACLR+TAIE+ID_3;//时钟为SMCLK**,连续计数模式,清楚定时器,允许溢出中断;8分频
  CCTL1 = CM_1+SCS+CAP+CCIE+CCIS_0;
然后在下降沿的时候直接读定时器:wide=TAR;
这样就行了?
然后p1.2的口子再设置为上升沿中断??

出70入0汤圆

发表于 2013-6-18 16:55:11 | 显示全部楼层
gfy200866 发表于 2013-6-18 08:08
谢谢你的回答,但是送显示前我已经处理了啊? wide=overflow*(65535/10)+(end-start)/10;//计算wide脉宽 ...

指教谈不上,我水平也不咋地,没搞过430.你的overflow 是不是只有0或者1两种状态,如果是这样的话在测量过程中如果溢出了好多次比如10次吧,那你就无法记录,所以你得到的值在两个比较小的值之间徘徊。这仅仅是我的猜想,不知道对不对。

出70入0汤圆

发表于 2013-6-18 16:59:47 | 显示全部楼层
gfy200866 发表于 2013-6-17 16:30
我采集的这个信号,应该会使定时器溢出,溢出时是不是计数满了为FFFF(65535);那么溢出的次数值乘以65535再 ...

刚才看错了,你overflow大于10,甚至不到10应该就会溢出了,应该是溢出问题

出0入0汤圆

 楼主| 发表于 2013-6-18 17:14:35 | 显示全部楼层
#pragma vector = TIMERA1_VECTOR//TA捕获中断服务程序
__interrupt void Timer_A(void)
{
  switch(TAIV)                                  //需要判断中断的类型
  {
  case 2://TA1中断                       //捕获中断
    if (CCTL1&CM_1)                      //上升沿中断到来
    {  TACTL |=TACLR;     //定时器清零
      overflow=0;                      //溢出计数复位
    }
    else if (CCTL1&CM_2)                 //下降沿捕捉
    {
      wide=TAR;
      CCTL1=(CCTL1&(~CM_2))|CM_1;         //改为上升沿触发
      HEX_TO_BCD(wide,sjbcd00);//BCD吗转换。
      numxs();//显示wide脉宽值  
      delay_ms(1000);//延时100MS

    }         
    break;  
  case 10:
    overflow++;  //溢出计数加1;70MS的脉宽一定会溢出的
    break;
  default:
    break;   
  }
}
改动了一下还是不行,现在的问题好像是;检测不到输入的脉宽,而不是不准的问题,晕了呵呵

出0入0汤圆

 楼主| 发表于 2013-6-19 08:15:25 | 显示全部楼层
绿茶山人 发表于 2013-6-18 16:59
刚才看错了,你overflow大于10,甚至不到10应该就会溢出了,应该是溢出问题 ...

我认为定时器应该是从0开始计数到FFFF;时溢出,然后在重0开始计数,来回循环的啊。overflow是随着溢出次数的增加在不断增加;具体值应该根据输入脉宽,直到下次上升沿中断来了后overflow=0;然后开始下一轮的测量脉宽操作。

出70入0汤圆

发表于 2013-6-19 08:49:02 | 显示全部楼层
gfy200866 发表于 2013-6-19 08:15
我认为定时器应该是从0开始计数到FFFF;时溢出,然后在重0开始计数,来回循环的啊。overflow是随着溢出次 ...


我觉得定时器溢出技术overflow没问题,但觉得你overflow在大于10以后计算出来的wide值会溢出。

出0入0汤圆

 楼主| 发表于 2013-6-19 10:40:24 | 显示全部楼层
yy8047 发表于 2013-6-18 16:25
你不是要测高电平的脉宽吗,那就先将IO口设置成上升沿中断,进入中断后立即开启定时器计数,等下跳沿时捕 ...

我现在用的是定时器捕获中断啊,不开定时器,怎么进入中断啊?

出0入0汤圆

 楼主| 发表于 2013-6-19 10:46:50 | 显示全部楼层
绿茶山人 发表于 2013-6-19 08:49
我觉得定时器溢出技术overflow没问题,但觉得你overflow在大于10以后计算出来的wide值会溢出。 ...

我显示输入了很多不同宽度的信号,但是输出的wide值都是一样的,是不是就应为溢出的原因啊。
但是我直接显示溢出值overflow=0的啊??

出70入0汤圆

发表于 2013-6-19 10:55:05 | 显示全部楼层
gfy200866 发表于 2013-6-19 10:46
我显示输入了很多不同宽度的信号,但是输出的wide值都是一样的,是不是就应为溢出的原因啊。
但是我直接 ...

你看看你捕获中断和溢出中断是不是都能按正常逻辑进入,如果都能正常进入的话,应该就是wide溢出了。

出0入0汤圆

 楼主| 发表于 2013-6-19 11:08:02 | 显示全部楼层
绿茶山人 发表于 2013-6-19 10:55
你看看你捕获中断和溢出中断是不是都能按正常逻辑进入,如果都能正常进入的话,应该就是wide溢出了。 ...

进入上升沿我把采集的定时值直接显示start=001(此时定时器我给了个清零指令TACTL |=TACLR;)
进入下降沿后我把采集的定时器值,也直接送显示看了下end=21700左右。不管外部信号如何变化都是这个显示。
很是奇怪,
感觉,能进入中断,上下沿也能区分,就是捕捉不到实时的测量值

出0入0汤圆

发表于 2013-6-19 11:56:21 | 显示全部楼层
你把switch抛弃试试看,那个语句很耗时间的,还有好像应该读CCR1吧,而不是TAR

出0入0汤圆

 楼主| 发表于 2013-6-19 13:15:52 | 显示全部楼层
yy8047 发表于 2013-6-19 11:56
你把switch抛弃试试看,那个语句很耗时间的,还有好像应该读CCR1吧,而不是TAR ...

switch丢掉咋判断沿呐,这里不应该有问题吧

出0入0汤圆

发表于 2013-6-19 15:47:48 | 显示全部楼层
用if去判断啊

出0入0汤圆

发表于 2013-6-19 17:15:11 来自手机 | 显示全部楼层
可悲啊。应该在低电平时开启捕获,在上升沿和下降沿分别捕获计数值,注意是捕获。然后每次溢出中断计数值加1。采用32位进行计算,否则溢出。
    另一种方法,就是让定时器工作在门控方式。门控信号有效前读数,对溢出中断进进计数,当门控关闭时再读计数器的值。然后计算门控宽度。

出0入0汤圆

发表于 2013-6-19 17:21:30 来自手机 | 显示全部楼层
老了,只能动嘴了。各位有430单片机的可以验证一下。

出0入0汤圆

 楼主| 发表于 2013-6-20 08:04:05 | 显示全部楼层
yy8047 发表于 2013-6-19 15:47
用if去判断啊

哦哦,我还以为你说去掉switch呢呵呵。我现在显示不仅仅有一点误差的问题,好像根本就检测不到似的;但是确实进入了中断。你的建议我可以先试试,先谢谢啦!

出0入0汤圆

 楼主| 发表于 2013-6-20 08:09:31 | 显示全部楼层
yxw_bob 发表于 2013-6-19 17:15
可悲啊。应该在低电平时开启捕获,在上升沿和下降沿分别捕获计数值,注意是捕获。然后每次溢出中断计数值加 ...

我上电就设置上升沿捕捉,然后在上升沿捕捉start;下降沿捕捉end;然后高电平宽度wide=start-end;这样有何不妥啊。
还望大哥指点一下啊。还有是不是我初始设置的时钟啥的有什么不对的啊。我找了又找也没发现,你给指点一下呗。
我加入了不同的输入信号,70MS;30MS;10MS;1MS;200US;效果咋多不行捏

出0入0汤圆

发表于 2013-6-20 08:55:17 | 显示全部楼层
关于捕获好像是有例子的吧

出0入0汤圆

 楼主| 发表于 2013-6-20 09:37:08 | 显示全部楼层
yy8047 发表于 2013-6-20 08:55
关于捕获好像是有例子的吧

我这个就是参照课本上例子做的。所以主程序应该没问题的啊。就例子上没写清,定时器,时钟源等的配置。只是用文字备注一下。我按照例程的意思,改的。但是不知道怎么的就是不行啊。问题找了好久了。我刚开始用430很多地方还不太明白,还请老手们给指点一下啊。

出0入0汤圆

发表于 2013-6-20 09:51:21 | 显示全部楼层
我也时间太久记不清了。你先用不要超过计数值溢出的脉宽来试,读计数值是读保存的捕获值,不是读计数器的值

出0入0汤圆

 楼主| 发表于 2013-6-20 11:33:25 | 显示全部楼层
yy8047 发表于 2013-6-20 09:51
我也时间太久记不清了。你先用不要超过计数值溢出的脉宽来试,读计数值是读保存的捕获值,不是读计数器的值 ...

谢谢你的指点。我已经该正对CCR1的值了。也更改了不同的频率输入信号(都是连续不断的方波信号);
也更改了中断源的口子该为P1.2;CCI2A;输入。效果是一样的。
现在还是捕捉不争正确值,显示还跳数,
是不是我时钟源,或者定时器的设置有问题啊。我现在直接晕了,也看不出来了。大虾,给帮忙审审这一块。

出0入0汤圆

发表于 2013-6-20 11:40:20 | 显示全部楼层
gfy200866 发表于 2013-6-20 11:33
谢谢你的指点。我已经该正对CCR1的值了。也更改了不同的频率输入信号(都是连续不断的方波信号);
也更改 ...

那个P1.2对应的是CCR几啊,是CCR1吗,这个也要对应才是

出0入0汤圆

 楼主| 发表于 2013-6-20 11:42:22 | 显示全部楼层
yy8047 发表于 2013-6-20 11:40
那个P1.2对应的是CCR几啊,是CCR1吗,这个也要对应才是

是CCR1;这个应该错不了的

出0入0汤圆

发表于 2013-6-20 14:41:08 | 显示全部楼层
上升沿捕获用IO中断试试看,还有把显示等放到主程序中去

出0入0汤圆

 楼主| 发表于 2013-6-20 15:37:51 | 显示全部楼层
yy8047 发表于 2013-6-20 14:41
上升沿捕获用IO中断试试看,还有把显示等放到主程序中去

上升沿捕获用IO中断:是用IO口捕捉上升沿,那然后怎么才能测量脉宽呢?
另外我采集的信号是一个连续不断的方波信号,也就是定时中断会一直有的,显示没发放进主程序,放进去也不显示的,就是说一直在中断中,程序没回到主程序的。
还有个疑问?定时器是什么时间开始定时的,我在上升沿采集到的CCR1,怎么是个很大的数字,也有较大变化,这时不是刚开始定时,CCR1不应该是0的吗?

出0入0汤圆

发表于 2013-6-21 08:28:40 | 显示全部楼层
IO上升沿中断只是开启定时器计数,在下降沿读出捕获值,关闭定时器并清零
显示最好还是放主程序,计数值用全局变量就是啊,中间可能会有显示丢掉,但应该不影响你观察的,

出0入0汤圆

 楼主| 发表于 2013-6-21 08:59:45 | 显示全部楼层
yy8047 发表于 2013-6-21 08:28
IO上升沿中断只是开启定时器计数,在下降沿读出捕获值,关闭定时器并清零
显示最好还是放主程序,计数值用 ...

接入的信号是一个连续不断的方波信号。所以中断也是不断存在的。
我在开头定义wide=1001;主程序中显示wide;中断里给wide在赋值一个固定数333;
下面有两种显示情况
1、先不接入方波信号开机,
  开机后显示1001; 然后接入信号,此时显示是中断中的赋值333
    这种显示是正确的。
2、我一直接着方波信号给单片机。
  上电后,液晶屏没有任何的显示,是白屏,重启后也是这样,一直白屏;
  这时,只有把信号去掉,才能显示,再次接入信号后,才显示中断里的赋值333了。
这个是什么情况?
   感觉一直加入中断,程序就回不到主程序似的。

出0入0汤圆

发表于 2013-6-21 09:04:12 | 显示全部楼层
你的方波什么频率啊,看来不完全是你的捕获问题啊

出0入0汤圆

发表于 2013-6-21 09:06:32 | 显示全部楼层
可以先做个测试,把显示放到主程序中,在方波中断中直接对wide累加,不用赋其他值,直到你的显示正常了再去调方波捕获吧

出0入0汤圆

 楼主| 发表于 2013-6-21 09:31:22 | 显示全部楼层
yy8047 发表于 2013-6-21 09:06
可以先做个测试,把显示放到主程序中,在方波中断中直接对wide累加,不用赋其他值,直到你的显示正常了再去 ...

好的,
我想请教一下,定时器是在什么时间开始和结束的呢?
我设置定时器A为:连续增计数模式,同步捕获。
TACTL=TASSEL_1+MC1+TACLR+TAIE;////时钟为ACLK,连续计数模式,清楚定时器,允许溢出中断;
CCTL1=CM_1+SCS+CAP+CCIE+CCIS_0;   //上升沿捕捉,同步,捕获,开中断。
那么定时器是什么时间开始计数的呢。是在上面两条指令语句执行完,还是在捕捉到上升沿后开始的呢?
这个地方我一直比较迷糊

出0入0汤圆

发表于 2013-6-21 09:34:07 | 显示全部楼层
这个你就要看看位定义了,怎么操作前面我已经说过了
建议你还是先把显示搞正常再说吧

出0入0汤圆

 楼主| 发表于 2013-6-21 09:58:01 | 显示全部楼层
yy8047 发表于 2013-6-21 09:04
你的方波什么频率啊,看来不完全是你的捕获问题啊

方波现在用到的是高电平为2MS左右的。这个宽度,影响捕获吗?

出0入0汤圆

 楼主| 发表于 2013-6-21 10:04:47 | 显示全部楼层
yy8047 发表于 2013-6-21 09:34
这个你就要看看位定义了,怎么操作前面我已经说过了
建议你还是先把显示搞正常再说吧 ...

按你的建议单独做了一下,在主程序显示,wide;中断里wide++.
显示结果是,从0不断加,加到500左右就溢出了。

但是如果一直接着信号,开机后还是不显示的。必须先断开信号。显示后在接上才行。
按说不应该这样的啊、

出0入0汤圆

发表于 2013-6-21 10:49:36 | 显示全部楼层
现在你中断里还有些什么
可以试试进中断后清标识然后立即退出,当然那个累加还留着,再看看带信号启动正常不

出0入0汤圆

 楼主| 发表于 2013-6-21 10:55:39 | 显示全部楼层
yy8047 发表于 2013-6-21 10:49
现在你中断里还有些什么
可以试试进中断后清标识然后立即退出,当然那个累加还留着,再看看带信号启动正常 ...

#pragma vector = TIMERA1_VECTOR//TA捕获中断服务程序
__interrupt void Timer_A(void)
{
  switch(TAIV)                                  //需要判断中断的类型
  {
  case 2://TA1中断                       //捕获中断
    if (CCTL1&CM_1)                      //上升沿中断到来
    {       start=CCR1;//start=CCR2;//TAR;//CCR1;//TAR;                        //同CCR1;                             
      CCTL1=(CCTL1&(~CM_1))|CM_2;//CCTL2=(CCTL2&(~CM_1))|CM_2; //        //改为下降沿触发
      wide++;
      
      
    }
    else if (CCTL1&CM_2)//(CCTL2&CM_2)//                 //下降沿捕捉
    {
      end=CCR1;//end=CCR2;//TAR;//CCR1;//TAR;
      CCTL1=(CCTL1&(~CM_2))|CM_1; //CCTL2=(CCTL2&(~CM_2))|CM_1;//        //改为上升沿触发

    }         
    break;  
  case 10:
    wide=wide;
    break;
  default:
    break;   
  }
}
中断里已经没有什么东西了。清什么标识?
退出?是说关定时器吗?

出0入0汤圆

发表于 2013-6-21 11:20:12 | 显示全部楼层
中断标识不用清吗,记不清了
退出就是退出中断函数啊,那个switch还在啊

出0入0汤圆

 楼主| 发表于 2013-6-21 12:33:21 | 显示全部楼层
yy8047 发表于 2013-6-21 11:20
中断标识不用清吗,记不清了
退出就是退出中断函数啊,那个switch还在啊

switch执行到break不就完了吗?然后不就能自动退出中断的吗?

出0入0汤圆

 楼主| 发表于 2013-6-22 10:00:30 | 显示全部楼层
祥子 发表于 2013-6-18 08:50
建议设置断点,手动根据寄存器的值计算下,看下结果是否正确。

各位兄弟们,问题解决了。主要是定时器工作顺序的问题我搞混了。
在此要特别感谢一下,帮助指点过我的兄弟们:
yy8047 ;祥子 ;laujc ;五木 ;绿茶山人 ;yxw_bob 等等。。。
感谢你们给与我的无私帮助,从这个小问题中,我也学到了不少其他的东西。
谢谢各位兄弟。

出0入0汤圆

 楼主| 发表于 2013-6-22 10:01:12 | 显示全部楼层
laujc 发表于 2013-6-18 13:32
LZ改下外部脉冲的宽度,使你的程序可以测量,多测试几个值,看下实际的脉冲宽度和你测出的宽度,是不是成整 ...

各位兄弟们,问题解决了。主要是定时器工作顺序的问题我搞混了。
在此要特别感谢一下,帮助指点过我的兄弟们:
yy8047 ;祥子 ;laujc ;五木 ;绿茶山人 ;yxw_bob 等等。。。
感谢你们给与我的无私帮助,从这个小问题中,我也学到了不少其他的东西。
谢谢各位兄弟。

出0入0汤圆

 楼主| 发表于 2013-6-22 10:01:36 | 显示全部楼层
五木 发表于 2013-6-18 14:40
确定16进制转10进制没转换错误?

你的计数肯定会溢出,但不会溢出两个计数最大值,那么计算时怎么不直接用 ...

各位兄弟们,问题解决了。主要是定时器工作顺序的问题我搞混了。
在此要特别感谢一下,帮助指点过我的兄弟们:
yy8047 ;祥子 ;laujc ;五木 ;绿茶山人 ;yxw_bob 等等。。。
感谢你们给与我的无私帮助,从这个小问题中,我也学到了不少其他的东西。
谢谢各位兄弟。

出0入0汤圆

 楼主| 发表于 2013-6-22 10:02:08 | 显示全部楼层
yy8047 发表于 2013-6-18 16:25
你不是要测高电平的脉宽吗,那就先将IO口设置成上升沿中断,进入中断后立即开启定时器计数,等下跳沿时捕 ...

各位兄弟们,问题解决了。主要是定时器工作顺序的问题我搞混了。
在此要特别感谢一下,帮助指点过我的兄弟们:
yy8047 ;祥子 ;laujc ;五木 ;绿茶山人 ;yxw_bob 等等。。。
感谢你们给与我的无私帮助,从这个小问题中,我也学到了不少其他的东西。
谢谢各位兄弟。

出0入0汤圆

 楼主| 发表于 2013-6-22 10:02:42 | 显示全部楼层
绿茶山人 发表于 2013-6-18 16:55
指教谈不上,我水平也不咋地,没搞过430.你的overflow 是不是只有0或者1两种状态,如果是这样的话在测量 ...

各位兄弟们,问题解决了。主要是定时器工作顺序的问题我搞混了。
在此要特别感谢一下,帮助指点过我的兄弟们:
yy8047 ;祥子 ;laujc ;五木 ;绿茶山人 ;yxw_bob 等等。。。
感谢你们给与我的无私帮助,从这个小问题中,我也学到了不少其他的东西。
谢谢各位兄弟。

出0入0汤圆

 楼主| 发表于 2013-6-22 10:03:23 | 显示全部楼层
yxw_bob 发表于 2013-6-19 17:15
可悲啊。应该在低电平时开启捕获,在上升沿和下降沿分别捕获计数值,注意是捕获。然后每次溢出中断计数值加 ...

各位兄弟们,问题解决了。主要是定时器工作顺序的问题我搞混了。
在此要特别感谢一下,帮助指点过我的兄弟们:
yy8047 ;祥子 ;laujc ;五木 ;绿茶山人 ;yxw_bob 等等。。。
感谢你们给与我的无私帮助,从这个小问题中,我也学到了不少其他的东西。
谢谢各位兄弟。

出0入0汤圆

 楼主| 发表于 2013-6-22 10:05:18 | 显示全部楼层
特别要感谢yy8047兄弟,不厌其烦的多次指点。

出0入4汤圆

发表于 2013-6-22 20:15:13 | 显示全部楼层
gfy200866 发表于 2013-6-22 10:05
特别要感谢yy8047兄弟,不厌其烦的多次指点。

好学生,解决问题是要说明一下,这样也有利于后来人。

出70入0汤圆

发表于 2013-6-24 07:53:09 | 显示全部楼层
gfy200866 发表于 2013-6-22 10:03
各位兄弟们,问题解决了。主要是定时器工作顺序的问题我搞混了。
在此要特别感谢一下,帮助指点过我的兄 ...


楼主是现在大学里难得的学习的人!必须支持!下月4号领毕业证,我是大二下学期才焕然悔悟的,早点该多好。

出0入0汤圆

发表于 2013-6-24 08:30:00 | 显示全部楼层
呵呵,客气了,论坛本来就是互相讨论互相帮助的地方嘛,问题解决了就好

出0入0汤圆

 楼主| 发表于 2013-6-24 09:21:05 | 显示全部楼层
laujc 发表于 2013-6-22 20:15
好学生,解决问题是要说明一下,这样也有利于后来人。

哈哈有兄弟们的支持,大家共同进步!

出0入0汤圆

 楼主| 发表于 2013-6-24 09:23:06 | 显示全部楼层
绿茶山人 发表于 2013-6-24 07:53
楼主是现在大学里难得的学习的人!必须支持!下月4号领毕业证,我是大二下学期才焕然悔悟的,早点该多好 ...

哈哈我已经工作了。只是原来一直用51的汇编,现在工作需要才改430C语言的。让大家见笑啦呵呵

出0入0汤圆

 楼主| 发表于 2013-6-24 09:24:03 | 显示全部楼层
yy8047 发表于 2013-6-24 08:30
呵呵,客气了,论坛本来就是互相讨论互相帮助的地方嘛,问题解决了就好

谢谢兄弟们无私奉献的精神,大家共同进步

出0入0汤圆

发表于 2013-6-24 09:49:21 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2013-6-24 10:10:37 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 15:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表