请选择 进入手机版 | 继续访问电脑版
查看: 1767|回复: 0

430149定时器测量低频脉宽

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

现在的问题是:我参照标准的流程改动的程序,采集到高电平的脉宽后,送显示总是不正确和我外接的脉冲信号不一致。不知道什么回事,很是上火啊。
下面附上的是主程序部分:
//********************************************************************
//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;   
  }
}
系统时钟设置子程序如下:
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;
}
其他的程序都是基本的配置程序不会影响到该程序的调试:
比如:void WDT_Init()
{
  WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
}


HEX_TO_BCD(wide,sjbcd00);//转BCD码程序
  numxs();                  //送显示程序,显示wide脉宽值 ,初始值为1000;
  delay_ms(100);   //延迟程序,
因为我采集的信号是低频的,高电平在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;)
不知道那位大虾做过类似的,请指点一二。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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