用430完成脉宽和频率的测量

楼主
用430完成脉宽和频率的测量
[P]#include <msp430x14x.h>
unsigned int pwm_start,pwm_end,pwm_wide=0;  
float fre=0.000;
#define uchar unsigned char
#define uint  unsigned int
#define lint  long int[/P][P]
unsigned int start,end;
float data,num,m1;
long int m2=10,j=0;
uchar a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0->9,共阴;
uchar num1,num2,num3,num4,num5,num6;[/P][P]
void delay(uint j)    //延时函数
{  uint x,y;
   for(x=j;x>0;x--)
   for(y=50;y>0;y--);
}[/P][P]void xianshi(float fre)//数码管动态显示函数(P2->位,P3->段)
{
  lint tt,ttt,tttt,ttttt;
  tt=(lint)fre;  //整数部分
  ttt=(lint)(fre*10);//第一位小数
  tttt=(lint)(fre*100);//第二位小数
  ttttt=(lint)(fre*1000);
  num1=(tt/100)%10;
  num2=(tt/10)%10;
  num3=tt%10;
  num4=ttt%10;
  num5=tttt%10;
  num6=ttttt%10;
  P2OUT |= BIT0;//亮第一个数码管
  P3OUT=a[num1];
  delay(6);
  P2OUT=0x00;
  P2OUT = 0x02;//亮第二个数码管
  P3OUT=a[num2];
  delay(6);
  P2OUT=0x00;
  P2OUT = 0x04;//亮第三个数码管
  P3OUT=a[num3];
  P3OUT |=BIT7;//点亮小数点
  delay(6);
  P2OUT=0x00;
  P2OUT = 0x08;//亮第四个数码管
  P3OUT=a[num4];
  delay(6);
  P2OUT=0x00;
  P2OUT = 0x10;//亮第五个数码管
  P3OUT =a[num5];//第一位小数
  delay(6);
  P2OUT =0x00;
  P2OUT = 0x20;//亮第六个数码管
  P3OUT =a[num6];//第二位小数
  delay(6);
  P2OUT=0x00;
}[/P][P]
void main (void)
{
 WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗定时器
 P1SEL = BIT2;                             //设置P1.2端口为功能模块使用,CCI0A
 P2DIR =0x3f; //位选
 P3DIR =0xff; //段选
 P2OUT =0x00;
 P3OUT =0x00;
                     
 TACTL = TASSEL0+TACLR+TAIE+MC1;           //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式
 CCTL1 = CM_3+SCS+CAP+CCIE+CCIS0;          //捕获模式,上升和下降都捕获,CCI0A为捕获信号源[/P][P] _EINT();                                  //中断允许
  for(;;)
   {                                         
   _BIS_SR(LPM0_bits + GIE);
   _NOP();
   pwm_wide=(pwm_end-pwm_start+overflow*65536)*0.000125;
   fre=1/(2*pwm_wide);  // 频率
   xianshi(fre);
   }
} [/P][P]// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{  
   
  switch(TAIV)  
 {case 2:    
      if(TACCTL1 & CCI)  
       pwm_start=CCR1;    
     else  
       pwm_end=CCR1;            
     break;  
  case 4:  
     break;  
  case 10: overflow++;
     break;  
  }  
  LPM0_EXIT;  
}  [/P][P] [/P][P]请各位大虾帮忙看一下这个程序有什么问题么,指导一下!谢谢啦!![EM14][/P]
1楼
哎,[EM03]又是那种贴出代码出叫别人寻答案的贴子....
[URL=http://www.microcontrol.cn/BBS/a/a.asp?B=100&ID=2673]http://www.microcontrol.cn/BBS/a/a.asp?B=100&ID=2673[/URL]
2楼
[P]该程序存在以下问题:
1,unsigned pwm_wide;已经定义了pwm_wide为整型的,而pwm_wide=(pwm_end-pwm_start+overflow*65536)*0.000125计算出来的结果是float型的,这就出现了一个问题
2,float data,num,m1和 long int m2=10,j=0中定义的data、m1、m2就没用
建议将pwm_wide=(pwm_end-pwm_start+overflow*65536)*0.000125;
fre=1/(2*pwm_wide); 改为data=(pwm_end-pwm_start+overflow*65536)*0.000125;
fre=1/(2*data); 然后再显示
不知还有什么问题吗!!??[IMG=0,absmiddle]http://bbs.eeworld.com.cn/images/smilies/default/puzzle.gif[/IMG] [/P]
3楼
[P]要计算每步公式,必须要在这公式里所用到的变量都要为同类型数据。
在计算完毕后,再将所需转类型的一一独立转换过来。
估计你的问题是太大口了,将不同数据类型混合运算所致...。[/P]
4楼
[P]恩,谢谢版主!![EM14][/P]

电脑版 Page created in 0.0625 seconds width 2 queries.