msp430测脉宽问题

2019-07-21 19:00发布

代码如下:
#include  <msp430g2553.h>
#include  "12864.h"
#include  "delay.h"
#define uint unsigned int
#define uchar unsigned char
unsigned long int mk=0;
uint num=0;
/************************主函数****************************/
void main(void)
{
    WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗
   BCSCTL1 = CALBC1_1MHZ;
    DCOCTL = CALDCO_1MHZ;                        // DCO 1MHz
    lcdinit();                               //复位1602液晶
//   LCD_dsp_string(1,0,"占空比:");
    LCD_dsp_string(1,0,"脉宽:");
    LCD_dsp_string(2,0,"脉宽:");
//   LCD_dsp_string(3,0,"脉宽:");
//   LCD_dsp_string(4,0,"脉宽:");
    P1IES = 0;                       // P1.4为 IO中断,上升沿
   P1IE |= BIT4;
//   P1REN |= BIT4;
//   P1OUT &= ~BIT4;                      //下拉电阻
   P1SEL |= BIT0;               //P1.0 ACLK输出
   P1DIR |= BIT0;
    BCSCTL1 |= DIVA_3;
    TACTL |= TACLR;
    TACCTL0 |= CCIE;
//   TACTL = TASSEL_2+MC_2;          //SMCLK 8M,清计数器,使能中断,连续增计模式
   
   while(1)
    {
      _EINT();
      LPM0;
      mk=num*65536+mk;
      if(mk<5000)
      {
        LCD_set_xy(1,3);
        LCD_write_dat('0'+mk/10000);
        LCD_write_dat('0'+mk/1000%10);
        LCD_write_dat('0'+mk/100%10);
        LCD_write_dat('0'+mk/10%10);
        LCD_write_dat('0'+mk%10);
        LCD_write_dat('u');
        LCD_write_dat('s');
      }
      else
      {
        mk=mk/1000;
        LCD_set_xy(1,3);
        LCD_write_dat('0'+mk/10000);
        LCD_write_dat('0'+mk/1000%10);
        LCD_write_dat('0'+mk/100%10);
        LCD_write_dat('0'+mk/10%10);
        LCD_write_dat('0'+mk%10);
        LCD_write_dat('m');
        LCD_write_dat('s');
      }
      num=0;
      TACTL |=TACLR;
      delay_ms(500);
    }
}
/************中断函数****************/
#pragma vector=TIMER0_A0_VECTOR           
__interrupt void TimerA0 (void)
{
   num++;
}
#pragma vector=PORT1_VECTOR                     // P1口中断处理函数
__interrupt void  PORT1_ISR(void)
{
   TACTL = TASSEL_2+MC_2;
   while(P1IN&BIT4 == BIT4);
   TACTL = MC_0;
   __disable_interrupt();
   mk=TAR;
   P1IFG = 0;
   LPM0_EXIT;                    // Clear CPUOFF bit from 0(SR)
}
我是使用的IO中断测的脉宽,可是实际效果不理想,就只是测ACLK8分频后都一直显示五千多ms,求大神助攻,帮忙看看。另外直接使用定时器的捕获测我也试过,但是好像只能测到1K到6K左右。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
303413992
2019-07-23 05:26
void display();
void IO();
void Delayms1(uint xms);
void InitSys()  
{  
  unsigned int i;   
  BCSCTL1&=~XT2OFF;            //打开XT2振荡器  
  do  
  {  
   IFG1 &= ~OFIFG;             //清除振荡器失效标志  
   for (i = 0xFF; i > 0; i--); //延时,等待XT2起振  
  }  
  while ((IFG1 & OFIFG) != 0); //判断XT2是否起振  
  BCSCTL2 |= SELM_2+SELS;        //选择MCLK、SMCLK为XT2,8M  
}
void main()
{
  WDTCTL = WDTPW + WDTHOLD;
  InitSys();
  P4SEL |=0x01;
  TBCCTL0 |= CM_1 + SCS + CAP +CCIE;
  TBCTL |= TBSSEL_2 + MC_2 + TBIE;
  LcdReset();
  Init_Keypad();
  P5DIR |= BIT1;
  P3DIR |= (BIT1+BIT0+BIT2+BIT3);//P3.1接按键控制个高脉冲,P3.0接控制换(123或恒流源),P3.2和P3.3控制电阻档位
  P5DIR |= BIT4;
  P5OUT&=~BIT4;
  _EINT();


#pragma vector=TIMERB0_VECTOR
__interrupt void TimerB0(void)
{
    if(TBCCTL0&CM1)
    {
        width[m++]=65536*N1+TBCCR0-cap1;
        N1=0;
        flag_IO=1;               //完成一次测量之后继续发脉冲
        TBCCTL0 = CM_1 + SCS + CAP + CCIE;
        if(m==M1)m=0;
    }
    else if(TBCCTL0&CM0)
    {
        cap1=TBCCR0;
        N1=0;
        TBCCTL0 = CM_2 + SCS + CAP + CCIE;
    }
}
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B(void)
{
    switch(TBIV)
    {
    case 14: N1++; break;
    }
}
一个用msp430f1611Tb测脉宽的程序    你要想测高频率   就不用把计数器分频了   这样就可以测出最小的脉宽=一个计数周期=1/8Us   

一周热门 更多>