Jump to content
    

ADC msp430afe253

Доброе время суток господа форумчане.

 

Столкнулся с такой проблемкой - завести АЦП на контроллере MSP430AFE253.

В этом кристале на борту присутствует 24 битный сигма-дельта АЦП. Вот его то и хочу попользовать.

 

 

#include  <msp430afe253.h>

  unsigned int i,j;
  unsigned int pressure;                                           
  unsigned long int results[10];
  unsigned long int res_temp;
  unsigned int temp;  
  
  void main(void)
{
  
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

//--------------------ADC-------------------------//

//adc_init;
  __MSP430_HAS_SD24_A3__;
  SD24INCTL0 |= SD24INCH0 + SD24INTDLY0;                                 //выбор первого (нулевого) канала и задержка
  SD24CTL |= SD24REFON + SD24SSEL0;                                         // внутренний опорник и такт
  SD24CCTL0 |= SD24UNI + SD24IE + SD24LSBACC + SD24SNGL;    // униполярность прерывания младший байт сингл конверт
  for (i = 0; i < 0x3600; i++)                                                            // задержка перед стартом внутреннего опорника
  {
    _NOP();  
    _NOP();  
    _NOP();  
  }
  
  while (1)
  {

     for (i = 0; i < 10; i++)            
       {
         SD24CCTL0 |= SD24SC;           //старт преобразований
    // сдесь втыкал задержки                                                   
         results[i] = (SD24MEM0)-10;     //сохранение результата в массив -10 использовано чтобы точно не было переполнения
         SD24CCTL0 &= ~SD24SC;       //стоп преобразований
       }
      
     for (i = 0; i < 10; i++)             
       {
         temp = temp + results[i];
       }     
     
    pressure = temp/10;       // здесь должны получить усредненные значения.

  }
}

 

 

теперь собственно проблема: в ячейке SD24MEM0 данные есть, но они не всегда записываются в переменную, а как то 1 раз из 5. пробовал делать и программную задержку до установки флага SD16IFG, и просто пропуск пары операций проца, и по прерываниям.

 

вторая проблема в том что данные в ячейке SD24MEM0 каждый раз разные и варьируются от 0x0000 до 0xFFFF даже если оба провода посадить на GND. данные в SD24MEM0 смотрел в при отладке, пользую IAR

 

третья проблема, если идти пошагово отладчиком, то при выполнении цикла какие то значения записываются и какой то результат получается, и он всегда разный, если же отправить процессор выполнять программу самому по кругу, то конечное значения всегда будет одно и то же, с какого бы места не запустилась программа, он первый раз получает какое то значение и после его не изменяет.

 

скажите в каком месте я дурак) заранее спасибо

Share this post


Link to post
Share on other sites

В коде нет проверки флага SD24IFG. Данные можно читать только когда данный флаг в "1". При чем тут SD16IFG?

В строчке temp = temp + results; судя по форматам данных (int = int + long int) будет происходить потеря данных

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...