|
程序目的:
當(dāng)ADC采樣值Temp與參考值target的差在給定區(qū)間范圍內(nèi)時(shí),無(wú)操作;
當(dāng)ADC采樣值與參考值target的差超出區(qū)間上限時(shí),4個(gè)LED燈向一個(gè)方向輪留滅(同時(shí),逐步增大target的值,目的是使得兩者的差最后停在區(qū)間內(nèi));
同理,當(dāng)兩者差低于區(qū)間下限時(shí),4個(gè)LED燈向另外一個(gè)方向輪留滅(同時(shí),逐步減小target的值,目的是使得兩者的差最后停在區(qū)間內(nèi));
問(wèn)題所在:
我們?cè)诟淖兡M信號(hào)大。-800mV~1200mV)的過(guò)程中,發(fā)現(xiàn)一開(kāi)始LED會(huì)按著預(yù)想的根據(jù)三種情況分別停止不動(dòng)、正向流動(dòng)、或者反向流動(dòng)。但是幾秒后LED 就停滯在任意一種狀態(tài)了,然后不管怎樣改變模擬信號(hào),LED都無(wú)動(dòng)于衷。
我們猜測(cè)可能是哪里進(jìn)入死循環(huán)了,也可能是我們的兩個(gè)中斷程序有問(wèn)題(timerB的中斷是0.5秒一次,就是LED輪流滅掉的間隔時(shí)間),但是我們不知道具體問(wèn)題在哪里。
跪求各位大俠拔刀相助,感恩不盡。!
#include "in430.h"
#include <msp430x14x.h>
#include "Config.h"
////////////////////////////////////////////// 變量聲明
uchar flag2;
static uchar Flag=0;
uint count;
uint TEMP;
uint target;
//////////////////////////////////////////////////////////// 函數(shù)定義
void ADC_Init()
{
//選擇ADC通道,設(shè)置對(duì)應(yīng)IO口的功能模式
ADC12CTL0|= ADC12ON + SHT0_7 + REF2_5V + REFON;//+ADC12OVIE; //ADC電源控制開(kāi),16個(gè)CLK
ADC12CTL1|= ADC12SSEL1 + ADC12SSEL0; //SMCLK做時(shí)鐘源
ADC12MCTL0= SREF0 + INCH_0; //參考控制位及通道選擇
ADC12IE|= 0x01; //中斷允許
ADC12CTL0|= ENC;
//使能轉(zhuǎn)換器
}
void Port_Init()
{
P6DIR |=0xff;
P6OUT &= 0x00;
P6DIR &= ~BIT0;
P6SEL|=0x01;
}
void motor_zheng(unsigned int LED_NUM) // LED正向轉(zhuǎn)
{
switch(LED_NUM)
{
case 0
LED8 =BIT4;
break;
case 1:
LED8 =BIT;
break;
case 2:
LED8 =BIT6;
break;
case 3:
LED8 =BIT7;
break;
default
_NOP();
break;
}
}
void motor_fan(unsigned int LED_NUM) // LED反向轉(zhuǎn)
{
switch(LED_NUM)
{
case 0:
LED8 =BIT7
break;
case 1:
LED8 =BIT6
break;
case 2:
LED8 =BIT5
break;
case 3:
LED8 =BIT4
break;
default:
_NOP()
break;
}
}
void motor_control(uint t) // LED在三種情況下的運(yùn)動(dòng)模式 綜合函數(shù)——control
{
if(flag2==1)
{
if(TEMP<0x0800)
{
if(0x0800-TEMP>0x0100)
{
count++;
motor_zheng(count%4);
}
else
_NOP()
else
{
if(TEMP-0x0800>0x0100)
{
count++;
motor_fan(count%4);
}
else
_NOP()
}
flag2=0
}
else
_NOP();
}
//***********************************************************************
// 系統(tǒng)時(shí)鐘初始化,外部8M晶振
//***********************************************************************
void Clockk_Init()
{
uchar i;
BCSCTL1 |=DIVA_3;
BCSCTL1&=~XT2OFF; //打開(kāi)XT2振蕩器
BCSCTL2|=SELM1+SELS; //MCLK為8MHZ,SMCLK為8MHZ
do{
IFG1&=~OFIFG; //清楚振蕩器錯(cuò)誤標(biāo)志
for(i=0;i<100;i++)
_NOP();
}
while((IFG1&OFIFG)!=0); //如果標(biāo)志位1,則繼續(xù)循環(huán)等待
IFG1&=~OFIFG;
}
void timerb_init()
{
TBCTL=TBCLR+TASSEL_1+ID_2+MC_1;
TBCCTL0= CCIE;
TBCCR0=512;
}
/////////////////////////////////////////////////////////////////////////////////////////// main 函數(shù)
int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
timerb_init();
Clockk_Init();
Port_Init();
ADC_Init();
_EINT(); //使能中斷
Flag=1;
target=0x0800;
while(1)
{
while(Flag==1)
{
ADC12CTL0 |= ADC12SC; //開(kāi)啟轉(zhuǎn)換
ADC12CTL0 &= ~ADC12SC; //清零
Flag=0; //清零標(biāo)志位
}
motor_control(target);
}
return 0;
}
//*************************************************************************
// ADC中斷服務(wù)程序
//*************************************************************************
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
while(ADC12OVIE==1){P6OUT &=~BIT3;};
P6OUT |=BIT3;
Flag = 1 ;
TEMP = ADC12MEM0 ; //讀取ADC轉(zhuǎn)換值
if(TEMP>0x0800)
P6OUT &= ~BIT2;
else
P6OUT |= BIT2;
}
#pragma vector=TIMERB0_VECTOR
__interrupt void TIMERB_ISR(void)
{
flag2=1;
TBCTL &=~TBIFG;
}
|
|