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条回答
dirtwillfly
1楼-- · 2019-07-21 21:02
你要测量的脉宽,大约是什么范围?
歪三扎愣
2楼-- · 2019-07-22 02:21
dirtwillfly 发表于 2015-8-3 14:20
你要测量的脉宽,大约是什么范围?

1Hz到100K左右,理论上都能达到,不知道为什么就是测不出来,我用F149也试过,不行。。。
dirtwillfly
3楼-- · 2019-07-22 06:47
歪三扎愣 发表于 2015-8-3 15:36
1Hz到100K左右,理论上都能达到,不知道为什么就是测不出来,我用F149也试过,不行。。。 ...

你的程序思路有些乱。
先考虑测量高频率的脉冲:先设置上升沿触发中断,接收到中断信号后马上改为下降沿触发中断。
这部分做好了,再考虑低频率脉冲的测量。
303413992
4楼-- · 2019-07-22 12:43
 精彩回答 2  元偷偷看……
歪三扎愣
5楼-- · 2019-07-22 14:06
dirtwillfly 发表于 2015-8-3 16:08
你的程序思路有些乱。
先考虑测量高频率的脉冲:先设置上升沿触发中断,接收到中断信号后马上改为下降沿 ...

这个我用149的定时器捕获试过了,只能测量1K到6KHz左右的脉宽,再往上就测不出来了- -
歪三扎愣
6楼-- · 2019-07-22 20:03
303413992 发表于 2015-8-4 08:23
高频测量按照楼上的思路   
弄好了之后  低频测量 弄一个变量来存寄存器溢出次数  
然后根据溢出次数+计数 ...

我用f149试过了,不行好像,只能测1K到6KHz左右的脉宽

一周热门 更多>