原创 [TI博客大赛]基于MSP430定时器频率测量

2012-11-15 14:44 3941 9 14 分类: MCU/ 嵌入式

 

/******************************************************************************
函数功能:基于定时器捕获功能的测量频率
 
*******************************************************************************/
#include"msp430x16x.h"
#include "GB2312.h"
#include "lcd.h"
 
/******************************函数声明*************************************************/
void jiemian(void);
 
void init_port(void);
void Clock_Init();
void CAP_Init();
void Init_DAC12();
void D_G_DAC12(uchar doit);
void ADC12_Init();
 
void Display_freq(int f);
void menu(void);
void Display_Value(int val);
/***************************变量定义*******************************************/
static unsigned int str[2]={0};
static unsigned int cap[10]={0};
static unsigned int count = 0;
static unsigned int temp= 0;
static long int Count_sum =0;
static unsigned int overflow= 0;
static unsigned int m = 0,n =0;
 
#define  Num_of_Results  100
static float A0sum=0.0;
 
static unsigned int index = 0;  //中断服务程序中的静态变量
static float A0results[Num_of_Results];    //保存ADC  A0通道的转换结果的静态数组
static unsigned int A0value=0;
static unsigned int flag = 0;
 
/*=============================================================================
颜色的宏定义    blue_greenred ; black ; green ; white ; blue ; yellow ; purple */
 
/*================================主函数========================================*/
void main()
{     
    WDTCTL = WDTPW + WDTHOLD;       //关看门狗 
    Clock_Init();                  //单片机时钟初始化
    init_port();                  //单片机端口初始化               
    LCD_Init();                  //液晶初始化   
    delay_ms(100);
   // jiemian();
    menu();
  
    Init_DAC12();       //初始化DAC12
    D_G_DAC12(100);           //打开DAC12通道1
 
    ADC12_Init();
    CAP_Init();
      
    _EINT();
    
    while(1);
    
    
     
}
 
 
/*==================================TA的初始化设置=========================================
函数名称: void CAP_Init()
函数功能:定时器A捕获设置,用于捕获上升沿
函数参数:
=========================================================================================*/
void CAP_Init()
{
 
  TBCCR0 = 50000; //定时40ms
  TBCCTL0 |=CCIE;
  TBCTL |=TBSSEL1 + ID_3 + MC_1+TBCLR;//选择8M-SMCLK时钟,8分频 
  
 
  TACCTL1 |= CM0 + SCS + CCIS_0 + CAP +CCIE;//上升沿触发,同步模式 shi能中断
  TACTL |=TASSEL1 + ID_3 + MC1;//选择8M-SMCLK时钟,8分频 
  
}
 
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B0 (void)
{
   //TACCTL1 &= ~CCIE; 
   flag = 1;
}
 
/*==================================TA的中断服务程序=========================================
函数名称: Timer_AISR
函数功能: 定时器A中断服务子函数,捕获待测信号上升沿
函数参数:
=========================================================================================*/
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
  
  switch (TAIV)         //向量查询
  {
   case 2:            //捕获中断
     str[temp]=TACCR1;
     temp++;
     if(temp == 2)
     {
       temp=0;
       count =str[1]-str[0];
       cap[m]=count;
       m++;
       if(m==4)
       {
         m=0;
         Count_sum=0;
         for(n=0;n<4;n++)
         {
           
           Count_sum += cap[n];
        
         }
         Count_sum=Count_sum/4;
         Count_sum=(int)(1000000/Count_sum);
         Display_freq(Count_sum);        
       
       }
     }
    break;
    
  case 4:   
    break;
  case 10:             //定时器溢出中断 
    overflow++;       //溢出次数
    break;   
    default:
    break;
   
  }
 
  
}
 
 
 
           
/*================================================================ 
函数名称: init_port(void)
函数功能: 430单片机IO口初始化
函数参数:
=================================================================*/
void init_port(void)
{
  P4DIR=0XFF;               //(P3/P4控制液晶的锁存器???)
  P3DIR = 0XFF;
 
  P1DIR &=~ BIT2;        //设置P1.2为输入
  P1SEL |= BIT2;        //设置P1.2为模块功能,即捕获源
  
  P6SEL |= 0x03;    // P6.0 P6.1为ADC通道输入 其中6.为 峰峰值测量通道  6.为波形采集通道
    
}
 
/**********************************
 函数功能:
          初始化DAC12
 特点:
     只用单通道1,由P6.7输出
***********************************/
void Init_DAC12()
{
    /****************设置ADC12参考电压***********************/
    ADC12CTL0 = REF2_5V + REFON;//参考电压为2.5V + 打开内部参考电压源
    
    /****************设置DAC12通道1*************************/
    DAC12_1CTL = DAC12IR + DAC12AMP_7 + DAC12ENC + DAC12LSEL_1;//满量程为参考电压,中速度/电流输出,12位分辨率,Vref+为参考电压
    DAC12_1CTL |= DAC12CALON;//自动校准DA输出    
    /*****************等待校准结束**************************/
    while(DAC12_1CTL & DAC12CALON == DAC12CALON);//通道1
}
 
 
/*********************************
函数功能:
          打开/关闭DAC12;
函数内容:
          doit = 0--关闭; 
          doit = 100--运行;
**********************************/
void D_G_DAC12(uchar doit)
{
if (doit == 0)
{
          DAC12_1CTL &= ~DAC12ENC;//关闭DAC12通道1
}
else if (doit == 100)
{
 DAC12_1CTL |= DAC12ENC;    //打开DAC12通道1
}
}
/*============================================================================= 
函数名称: ADC12_Init()
函数功能: 430单片机ADC12初始化
函数参数:
=============================================================================*/
void ADC12_Init()
{
   
   /*  ADC12CTL0 |= ADC12ON+SHT0_6+MSC+REF2_5V + REFON ; // SHT0_6分频系数n=32  采样周期25.6us  39K的采样率
      // 打开ADC12模块+设置采样保持定时器0分频系数n=64+多次采样/转换位
     //采集信号有SHI仅首次触发
      ADC12CTL1 |= SHP+CONSEQ_2;            // SHP=1采样信号采自定时器,由采集输入信号的上升沿触发采集定时
                                            //单通道多次转换模式
      ADC12IE = 0x02;                       // 允许A1中断 ADC12IFG.1
      ADC12CTL0 |= ENC;                     // 允许转换
      ADC12CTL0 |= ADC12SC;                 // 开始转换
   
  */
      ADC12CTL0=ADC12ON+SHT0_8+MSC+REF2_5V + REFON ;   // 打开ADC,设置时钟ADC12CLK 为ADC12OSC 5M,
       //内部参考电压2。5V  分频系数n=32    MSC采集信号有SHI仅首次触发
      ADC12CTL1=SHP+CONSEQ_3;                       //设置采样信号来源采样定时器,序列通道多次转换模式
      ADC12MCTL0=INCH_0;                           //Vr+=Vref+,Vr-=AVss    A0通道
      ADC12MCTL1=INCH_1+ EOS;                    //Vr+=Vref+,Vr-=AVss    A1通道
      //EOS  由此通道产生序列结束控制位
      ADC12IE = 0x02;                       // 允许A1中断 ADC12IFG.1
   
      ADC12CTL0 |= ENC;                     // 允许转换
      ADC12CTL0 |= ADC12SC;                 // 开始转换
      
}
 
 
/*******************************************
函数名称:ADC12ISR
功    能:ADC中断服务函数,在这里用多次平均的
          计算P6.0口的模拟电压数值
参    数:无       
返回值  :无
********************************************/
 
 
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)
{
  
  DAC12_1DAT = ADC12MEM1;
  
 if(flag!=0)
 {
  flag = 0; 
 A0results[index] = ADC12MEM0;         // 储存A0通道的转换数据
 
 if(index == Num_of_Results-1)
            {
 
                  unsigned int i;                 
                  index = 0;                        //重新归零
                  A0value =0;
                  for(i = 0; i < Num_of_Results; i++)  
                  {
                     
                    A0sum += A0results;
        
                  }
                  
                   A0sum = A0sum / 100;       //除以
                   A0value = (int)(A0sum*3.3*2.2/4095*1000);
                   Display_Value(A0value); 
            }
   
    
 index++; 
 
 }
  
}
 
 
/******************************时钟模块*****************************************
函数功能:初始化XT2时钟函数
*******************************************************************************/
void Clock_Init()
{
   uint iq0;
   
   BCSCTL1 &= ~XT2OFF;     //打开XT2振荡器
   
   do
   {
      IFG1 &= ~OFIFG; //清除振荡器失效标志
      for (iq0 = 0xFF; iq0 > 0; iq0--); //延时,等待XT2起振
   }
   
   while ((IFG1 & OFIFG) != 0); //判断XT2是否起振
   
   BCSCTL2 = SELM_2 + SELS;        //选择MCLK、SMCLK为XT2
                                        //为高速时钟 不分频,均为8M
}
 
 
void jiemian(void)
{
  //========================界面1=====================================  
       LCD_clear(green); delay_ms(20); //刷屏,显示全绿色
    
        Display_hanzi_s(2,1,jma,3,green, red);     delay_ms(400);
        Display_hanzi_s(0,2,jmb,8,green, red);     delay_ms(400);
        Display_hanzi_s(2,3,jmc,3,green, red);     delay_ms(300);
        
        Display_hanzi_s(0,5,jmd,4,green,  blue);     delay_ms(300);
        Put_Char(8,5,0,58,green,black);  //冒号
        Display_hanzi_s(5,5,shuxiao,2,green, black);     delay_ms(400);
        Display_hanzi_s(5,6,ghj,3,green, black);     delay_ms(500);
        Display_hanzi_s(5,7,lxf,3,green, black);     delay_ms(700);
        Display_hanzi_s(2,7,zu,2,green, black);     delay_ms(100);
        
        LCD_clear(white); delay_ms(20); //刷屏,显示全绿色
 
}
 
 
void menu(void)
{
  Display_hanzi_s(0,1,Tm,8,white,blue);
  Display_hanzi_s(0,5,fre,4,white,black);
  Put_Char(8,5,0,58,white,blue);  //冒号
  Display_hanzi_s(1,4,ffz,3,white,black);
  Put_Char(8,4,0,58,white,blue);  //冒号
   Put_Char(14,4,0,86,white,red); //v
  Put_Char(14,5,0,72,white,red);//H
  Put_Char(15,5,0,122,white,red);//z
}
 
void Display_freq(int f)
{
                   Put_Char(12,5,1,f%10,white,black); //最低位 
                   f=f/10;
 
                   Put_Char(11,5,1,f%10,white,black); //次低位  
                   f=f/10;
  
                   Put_Char(10,5,1,f%10,white,black);  // 高位
                                   
}
 
void Display_Value(int val)
{
 
                   Put_Char(13,4,1,val%10,white,white); //次低位  
                   val=val/10;
  
                   Put_Char(12,4,1,val%10,white,white);  // 高位
                   val=val/10;
                                       
                   Put_Char(11,4,1,val%10,white,purple);  // 极高位
                   val=val/10;
                   
                   Put_Char(10,4,0,46,white,red); //打点
                   
                   Put_Char(9,4,1,val%10,white,purple); 
                   
                  
}
PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户1757358 2015-4-13 19:48

看看

用户377235 2014-8-18 08:52

为什么还要加一个DAC转换呢、、、

用户1687253 2013-9-27 09:41

哥们 你的程序中哪段是关于SVPWM算法的呢?搞不明白,解释下呗?

用户445337 2013-8-10 13:54

嗯嗯,顶一个,学习了~

用户447311 2013-5-14 17:19

不错

用户447311 2013-5-14 17:17

不错

用户413797 2012-10-16 12:07

不错啊!

用户377235 2012-9-22 11:34

找了很久直流马达源程序。

用户593939 2012-9-21 22:53

参考和学习了

用户593939 2012-9-21 22:47

参考了
相关推荐阅读
用户380727 2013-03-07 12:08
闭关学习
又是一个转折点,压力很大,需要很多准备,多学习。...
用户380727 2012-12-30 23:57
值得一读的高精度 TI 正峰值检测英文原版文档
  这个是英文原版的正峰值检测文档,非常值得大家细细的品味,我按照文档中的电路验证过精度非常高,误差只有20mv.虽然是英文的但是还是能读懂的,还是可以好好阅读一下,对电路的原理的理解有一定帮...
用户380727 2012-12-29 12:42
DIY style- U盘MP3制作
《好声音》--STM32 U盘MP3 有想法就大胆的去实现吧! 大三的时候做的一个小制作,实验室手工打造,主控芯片采用 STM32,在一块开发板上做了转接板 引出来外扩的,解码芯片是采用V...
用户380727 2012-12-28 12:32
即将过去的2012
玛雅人没有预言到2012世界末日,生活依旧,即将过去的2012,几多欢喜,回顾过往的日子,几许唏嘘,向前看,还有几天时间,合理安排,希望2013的第一件大事是过去的这半年应该得到的结果!加油!...
用户380727 2012-12-01 19:09
加油!
12月新的征程!新的开始!不要迟疑!不要等待! 坚持你的梦想走下去!加油!...
用户380727 2012-11-27 09:51
【TI博客大赛】430也疯狂--MSP430单片机产生SPWM波
MSP430在功率电子方面的一个应用,由MSP430产生SPWM波的主程序,由于程序较多所以完整的程序在附件里。这个程序是原来做比赛的时候用的,单片机出来的波形经过整形再经过光耦以及其他变换后用来...
EE直播间
更多
我要评论
5
9
关闭 站长推荐上一条 /3 下一条