⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timera实现测量脉冲宽度.c

📁 430各模块例程包
💻 C
字号:
/*TimerA实现测量脉冲宽度范例
源处:微控设计网 DC / 2005.12./www.microcontrol.cn
1-程序描述
     利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量。
     本例程用到了定时器A的CCI1A端口(例如MSP430F14X的P1.2引脚)作捕获外部输入的脉冲电平跳变,同时结合简单的软件算法就能实现脉冲宽度的测量。在实际应用中可根据例程中的start,end,overflow三个变量来计算脉冲宽度。此功能模块在实际产品应用中体现出有较高的应用价值。

2-例程 */

#include <msp430x14x.h> 
unsigned int start,end;
unsigned char overflow;

void main (void)
{
 WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗定时器
 P1DIR = BIT0+BIT4;                        //设置P1.0方向为输出

 P1SEL = BIT2;                             //设置P1.2端口为功能模块使用 
 TACTL = TASSEL0+TACLR+TAIE+MC1;           //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式
 CCTL1 = MC0+SCS+CAP+CCIE;                 //输入上升沿捕获,CCI0A为捕获信号源

 _EINT();                                  //中断允许
 while(1);                                 //LOOP
} 

#pragma vector=TIMERA1_VECTOR              //定时器A中断处理
__interrupt void timer_a(void)
{
  switch(TAIV)                              //向量查询
  {
	  case 2:                              //捕获中断
        if(CCTL1&CM0)                      //上升沿
        { 
           CCTL1=(CCTL1&(~CM0))|CM1;       //更变设置为下降沿触发
           start=TAR;                      //记录初始时间
           overflow=0;                     //溢出计数变量复位
        }
        else if (CCTL1&CM1)                 //下降沿
        {  
           CCTL1=(CCTL1&(~CM1))|CM0;       //更变设置为上升沿触发
           end=TAR;                        //用start,end,overflow计算脉冲宽度
        }    
        break;
     case 10:                               //定时器溢出中断
       overflow++;
       break;                              //溢出计数加1
     default:
		 break;
  } 
} 
//例程结束
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -