реклама на сайте
подробности

 
 
> Непонятки с MSP430FE425, Странное увеличение тока потребления в режиме LPM3
Rostislav
сообщение May 20 2011, 08:24
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 127
Регистрация: 6-07-08
Из: Москва
Пользователь №: 38 765



Всем привет!

Суть проблемы: имеется устройство с питанием от сети и возможностью питания от батарейки. При нарастании (или определенном постоянном уровне) напряжения на входе стабилизатора ток потребления микроконтроллера в режие LPM3 увеличивается, а затем снижается. Все бы ничего, но напряжение просаживается на 0,2В. Возможно из-за этого устройство иногда не выходит из спячки. Да и работа модуля SVS микроконтроллера при напряжении менее 2,5В может быть нестабильна.

Коллеги! К подскажет, в чем может быть дело? Я ничего не понимаю! sad.gif sad.gif sad.gif

На схеме указал точки замера напряжений. Синий луч показывает увеличение тока потребления (напряжение на резисторе 1кОм инвертировано).

Помогите, пожалуйста!


Код
   const unsigned char Key1 = 0x04;
   const unsigned char cSWON = 0x02;
   const unsigned char PJ = 0x04;

   const unsigned char cLED = 0x20;
   const unsigned char cTM  = 0x02;
   const unsigned char cRW  = 0x01;

   __task void main (void);
  

int __low_level_init (void)
{
   /* Insert your low-level initializations here */
   /*============================================*/
   /* Choose if segment initialization           */
   /* should be done or not.                     */
   /* Return: 0 to omit initialization           */
   /* Return: 1 to run initialization            */
   /*============================================*/

   // Stop WDT
   WDTCTL = WDTPW + WDTHOLD;

   // Если возвращаемый параметр =1, то вся память RAM обнуляется, иначе - нет.
   return (1);
}

// TimerA Interrupt Routine
#pragma vector = TIMERA0_VECTOR
__interrupt void TimerA0_ISR (void)
{
   if ((LCDCTL & LCDON) == 0)
     {
        SVSCTL = 0x0F0;
     }
   // Часы
   .....
   //
   if ((LCDCTL & LCDON) == 0)
     {
        // Выход из энергосбережения
        _BIC_SR_IRQ (LPM3_bits);                      // Clear LPM3 bits from 0(SR)
     }
}

// Bsic Timer 2 interrupt service routine
#pragma vector = BASICTIMER_VECTOR
__interrupt void basic_timer_isr (void)
{
   .....
   .....
   .....
   SVSConrol ();
}

void SVSConrol (void)
{
   if ((SVSCTL & SVSOP) == SVSOP)  // Если сработал супервизор, то уход в спячку
     {
        if ((ESPCTL & ESPEN) == ESPEN)
          {
             // Stop measurement (set Embedded Signal Processing into "Idle" mode)
             // Set Embedded Signal Processing into "Idle" mode
             set_esp_idle ();
             SD16CTL = (SD16LP + SD16DIV0 + SD16DIV1 + SD16SSEL0 + SD16SSEL1);
          }
        // Disable USART interrupt
        IE1 &= ~(URXIE0);

        // Disabled USART0 TXD/RXD
        U0ME &= ~(UTXE0 + URXE0);

        // Stop Basic Timer
        BTCTL = (BTHOLD + BTDIV);

        // Запрещаем прерывания от Basic Timer
        IE2 &= ~(BTIE);

        // LCD OFF
        LCDCTL &= ~(LCDON);

        // TM OFF
        P1DIR = (cLED + cRW);

        // СИД ON, RW ON (Подгрузка источника питания - дополнительный гистерезис по питанию для надежного срабатывания супервизора)
        P1OUT = (cTM);

        // SB1 OFF
        P2OUT = 0;

        // Разрешаем вложенные прерывания (нас интересуют только от таймера TimerA)
        _EINT (); // Enable Interrupts (глобально)

        do
          {
             do
               {
                  SVSCTL = VLDOFF;
                  while ((SVSCTL & SVSON) == SVSON);
                  _BIS_SR (LPM3_bits);
                  _NOP ();
                  //
                  SVSCTL = 0x0F0;
                  while ((SVSCTL & SVSON) != SVSON);
               }
             while ((SVSCTL & SVSOP) == SVSOP);
             // Переинициализация FLL (запускаем для восстановления частоты DCO)
             InitFLL ();
          }
        while ((SVSCTL & SVSOP) == SVSOP);                          // Повторный контроль для надежности

        // Инициализация таймера B (TimerB)
        BTCTL = (BTIP2 + BTFRFQ0);     // f(LCD) = ACLK / 64 = 512 Hz, f(INTB) = 1024 Hz

        // Разрешаем прерывания от Basic Timer
        IE2 |= (BTIE);
     }
}

void InitFLL (void)
{
   SCFI0 = (FLLD_2 | FN_2);          // Интегратор системной частоты - 4 МГц
   FLL_CTL0 = (DCOPLUS | XCAP18PF);  // Регистр управления модулем FLL. DC генератор в диапазон 1.3-12.1 МГц.
   SCFQCTL = 63;                     // Регистр контроля тактирования системы
   // Ждем некоторое время для установления частоты DCO
   WaitNmks ((signed long) (32768));
}

__task void main (void)
{
   InitFLL ();

   for (;;)
     {
        _DINT ();

        SVSCTL = 0x0F0;

        P1DIR  = (cRW + cLED + cTM);   // Бит0 - R/W
                                       // Бит1 - ТМ
                                       // Бит5 - LED
        P2DIR  = (cSWON + 0x010);      // Бит1 - SWON
                                       // Бит2 - Key
                                       // Бит4 - TXD
                                       // Бит5 - RXD
        P1OUT = (cRW + cLED + cTM);
        P2OUT = (cSWON);
        P1SEL = 0;
        P2SEL = 0x038;                 // P2.4,5 = USART0 TXD enable, RXD enable
                                       // P2.3 = SVSIN
        P1IE  = 0;                     // Disable Port 1 interrupts
        P2IE  = 0;                     // Disable Port 2 interrupts
        P1IFG = 0;                     // Clear Port 1 interrupt Flags
        P2IFG = 0;                     // Clear Port 2 interrupt Flags

        // Конфигурирование LCD контроллера
        LCDCTL = (LCDON + LCD4MUX + LCDP1 + LCDP0);  // LCD config : Duty = 1/4, Bias = 1/3

        // Инициализация таймера A (TimerA)
        TACTL   = (TASSEL0 + MC0);
        TACCR0  = 32767;                             // Период срабатывания таймера А
        TACCTL0 = (CCIE);

        // Инициализация таймера B (TimerB)
        BTCTL = (BTIP2 + BTFRFQ0);                   // f(LCD) = ACLK / 64 = 512 Hz, f(INTB) = 1024 Hz
        IE2 |= (BTIE);                               // Разрешаем прерывания от Basic Timer

        // Enable Interrupts (глобально)
        _EINT ();

        while (...) // Цикл выполняется пока не разрешен перезапуск системы
          {
             .....
             .....
             .....
             .....
          }
     }
}


Сообщение отредактировал Rostislav - May 20 2011, 08:49
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Guest_@Ark_*
сообщение May 20 2011, 22:36
Сообщение #2





Guests






Цитата
Коллеги! К подскажет, в чем может быть дело? Я ничего не понимаю!

ИМХО, первое что нужно сделать - это покопать даташит на предмет минимальной скорости нарастания
напряжения питания при старте. Например, для PIC-ов этот параметр равен 50мВ/мс. То есть, если питание
растет быстрее указанной величины - обеспечивается нормальный старт. Если медленнее - возможны проблемы.
....
Вот еще, знающий человек посоветовал:
Цитата
Цитата(rezident @ 21.5.2011, 1:58)
.... посоветуйте людям в этой теме почитать раздел 23.2.5 Comparator_A, Port Disable Register CAPD в MSP430x4xx Family User's Guide (Rev. J) - slau056j.pdf. А то "мужики-то и не знают", обсуждая в том топике странный на их взгляд эффект.

http://focus.ti.com/lit/ug/slau056j/slau056j.pdf


Сообщение отредактировал @Ark - May 21 2011, 19:37
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 10:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.0356 секунд с 7
ELECTRONIX ©2004-2016