找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6148|回復(fù): 1
收起左側(cè)

大家好,我是新手一枚,遇到關(guān)于A(yíng)DC模塊、及中斷問(wèn)題,麻煩大家?guī)兔纯,不勝感激?/span>

[復(fù)制鏈接]
ID:65825 發(fā)表于 2014-9-5 10:04 | 顯示全部樓層 |閱讀模式
程序目的:
當(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;
}

回復(fù)

使用道具 舉報(bào)

ID:66032 發(fā)表于 2014-9-13 15:40 | 顯示全部樓層
你的算法是錯(cuò)的, 800轉(zhuǎn)為0x0320, 1200 轉(zhuǎn)為0x04B0, 你的temp值是在0~4096之間的數(shù),可以以任何形式比較判斷。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表