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条回答
歪三扎愣
2019-07-22 14:06
dirtwillfly 发表于 2015-8-3 16:08
你的程序思路有些乱。
先考虑测量高频率的脉冲:先设置上升沿触发中断,接收到中断信号后马上改为下降沿 ...

这个我用149的定时器捕获试过了,只能测量1K到6KHz左右的脉宽,再往上就测不出来了- -

一周热门 更多>