本帖最后由 斯诺 于 2014-4-8 10:06 编辑
#include "msp430g2452.h"
//==========================================================================//
//=============================Wdt_reset====================================//
void wdt_reset(void)
{
WDTCTL = WDTPW + WDTCNTCL ;
}
//==========================================================================//
//===========================Init_Capture===================================//
void Init_Capture(void)
{
P1DIR&=~BIT1;
P1SEL|=BIT1;
BCSCTL2 |= SELM0;
BCSCTL2 |= DIVS_0;
TACTL |=TASSEL_2+TAIE+TACLR;
CCTL0 |=CM_1+SCS+CAP+CCIS_0+CCIE; //上升沿捕获+同步捕获+开捕获+timerA为捕获+打开捕获中断
TACTL |=MC_2; //连续模式
}
//==========================================================================//
//===============================adc_init===================================//
void adc_init(void)
{
ADC10CTL1 = INCH_10 + ADC10DIV_3; // Temp Sensor ADC10CLK/4
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON+ ADC10IE;
}
//==========================================================================//
//=============================定义全局变量=================================//
typedef struct
{
float time;
float duty;
unsigned int Cap_Tar;
unsigned long Cap_First;
unsigned long Cap_Next;
unsigned long Cap_Last;
unsigned long temp;
unsigned char IntDegF;
unsigned char IntDegC;
}user_t;
extern user_t user;
void adc_proc(void)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
// oF = ((A10/1024)*1500mV)-923mV)*1/1.97mV = A10*761/1024 - 468
user.temp = ADC10MEM;
user.IntDegF = ((user.temp - 630) * 761) / 1024;
// oC = ((A10/1024)*1500mV)-986mV)*1/3.55mV = A10*423/1024 - 278
user.temp = ADC10MEM;
user.IntDegC = ((user.temp - 673) * 423) / 1024;
__no_operation();
}
//==========================================================================//
//===============================主程序=====================================//
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;// Stop WDT
_DINT();//关中断
if (CALBC1_8MHZ==0xFF) // If calibration constants erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_8MHZ; // Set range
DCOCTL = CALDCO_8MHZ; // Set DCO step + modulation */
Init_Capture();
adc_init();
_EINT();//开中断
while(1)
{
adc_proc();
wdt_reset();
}
}
//===========================================================================//
//============================TIMER0_VECTOR==================================//
user_t user;
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void timer_A(void)
{
if((user.Cap_Tar==0)&&( CCTL0 &=~CM_1))
{
CCTL0 |=CM_2;
user.Cap_First = TACCR0; //第一个上升沿时间
user.Cap_Tar++;
}
else if((user.Cap_Tar==1)&&( CCTL0 &=~CM_2))
{
CCTL0 |=CM_1;
user.Cap_Next = TACCR0;//第一个下降沿时间
user.Cap_Tar++;
}
else if((user.Cap_Tar==2)&&( CCTL0 &=~CM_1))
{
CCTL0 |=CM_2;
user.Cap_Last = TACCR0;//第二个上升沿时间
user.Cap_Tar++;
}
else if((user.Cap_Tar==3)&&( CCTL0 &=~CM_2))
{
user.duty=(user.Cap_Next-user.Cap_First)*100.00/(user.Cap_Last-user.Cap_First);
user.time=7900000.0/(user.Cap_Last-user.Cap_First);
TACTL |=TACLR;
CCTL0 |=CM_1;
user.Cap_Tar=0;
}
}
|