электронные компоненты
и
или
например MAX232 DIP16
например MAX232 ADM232
скачать прайс-лист
Новости
Программа поставок
Электронная библиотека
Форум
О компании
Контакты
WAP

Рубрики

| индикация | события | инструменты | беспроводная связь | датчики | источники питания | компоненты | корпуса | микроконтроллеры | приборы | промышленная мебель | прочее | сетевые решения | силовая электроника | средства разработки | новые технологии |

Интересные статьи

Рубрика: прочее

Использование режимов пониженного энергопотребления РЧ-трансиверов

30.04.2008 Многообразие режимов работы с пониженным энергопотреблением позволяет использовать современные радиочастотные трансиверы в устройствах с батарейным питанием. В статье рассказывается о режимах пониженного энергопотребления трансиверов Texas Instruments CC111xFx/CC251xFx/CC243x из производственной линейки Chipcon.

Трансиверы CC111xFx/CC251xFx/CC243x имеют пять основных режимов работы:

  • Активный режим: Режим полной функциональности. Включен внутренний стабилизатор напряжения и питание подается на ядро. Активны высокочастотные тактовые генераторы – либо по отдельности, либо оба вместе. Также работают либо RC-, либо кварцевый генератор 32,768 кГц, либо они оба одновременно.
  • Режим PM0: Аналогичен активному, но процессор находится в ждущем режиме, то есть код не выполняется.
  • Режим PM1: Включен внутренний стабилизатор напряжения и питание подается на ядро. Ни один из тактовых генераторов не работает. Работает либо RC-, либо кварцевый генератор 32,768 кГц. Система перейдет в активный режим по сигналу RESET, или по сигналу внешнего прерывания, или по срабатыванию таймера спящего режима.
  • Режим PM2: Питание на ядро не подается. Ни один из тактовых генераторов не работает. Работает либо RC-, либо кварцевый генератор 32,768 кГц. Система перейдет в активный режим по сигналу RESET, или по сигналу внешнего прерывания, или по срабатыванию таймера спящего режима. Информация о состоянии USB для трансивера CC2511Fx будет потеряна при вхождении в режим PM2. Таким образом, не следует использовать режим PM2 с USB.
  • Режим PM3: Питание на ядро не подается. Ни один из генераторов не работает. Система перейдет в активный режим либо по сигналу RESET, либо по сигналу внешнего прерывания. Информация о состоянии USB для трансивера CC2511Fx будет потеряна при вхождении в режим PM3. Этот режим также не следует использовать с USB.

Требуемый режим выбирается установкой битов SLEEP.MODE. После установки этих битов необходимо установить биты IDLE в регистре PCON SFR, что переведет трансивер в выбранный режим. Надо заметить, что при SLEEP.MODE≠0 прерывания и переключение между генераторами блокированы. Также надо соблюдать гарантированное время нахождения тактовых генераторов в режимах пониженного энергопотребления. Если это время будет меньше, чем указано в описаниях, то могут быть коллизии. На рисунке 1 указан пример кода на языке С для перевода трансиверов в режимы PM0-PM3. Для трансиверов CC111xFx/ CC251xFx при «пробуждении» из режимов PM{2-3} есть небольшая вероятность того, что SLEEP.

/* код на языке С: */
void main(void) 
{
/* Здесь необходимо вставить соответствующий код, указанный на */
/* рисунках 6 и 7. Не подходит для режима РМО! */
/* Настройка и разрешение прерываний (Sleep-таймер, порт) */
/* по которым трансивер будет «просыпаться» */
/* Замечание: */
/* Для входа в режим РМ{2 - 3}для CClllxFx/CC251xFx следующий */
/* блок кода должен быть заменен кодом из рисунка 2 */
/* Начало блока кода */
/* Установка SLEEP.MODE в соответствии с нужным режимом РМ, */
/* например, РМ1. */
SLEEP = (SLEEP & OxFC) | 0x01;
/* Необходимо вставить три NOP для того, чтобы позволить */
/* процессу блокирования прерываний закончиться перед следующей */
/* проверкой битов SLEEP.MODE. Надо заметить, что прерывания */
/* блокируются при SLEEP.MODE * 0, таким образом, время между */
/* установкой SLEEP.MODE * 0, и записью в PCON.IDLE должно быть */
/* как можно меньше. Если прерывание возникнет перед тем, как */
/* команды NOP закончатся,  процедура обработки прерываний */
/* очистит SLEEP.MOD-биты в соответствии с кодом на рисунке 8. */
asm("NOP"); asm("NOP"); asm("NOP");
/* Если во время команд NOP прерывание не поступит, */
/* то прерывания эффективно заблокируются в этом месте кода */
/* Если биты SLEEP.MODE будут очищены в этом месте, это будет */
/* означать, что их очистила процедура обработки прерываний */ 
/* во время команд NOP и трансивер не войдет в режим РМ. */
if (SLEEP & 0x03) 
{
/* Установка PCON.IDLE для входа в выбранный режим РМ, т.е. РМ1. */
PCON |= 0x01;
/* Трансивер сейчас в выбранном режиме и «проснется» */
/* по прерыванию таймера или внешнего порта */
/* Первая инструкция после выхода из режима РМ. */
asm("NOP");
} 
/* Конец блока кода */
/* Здесь надо вставить соответствующий код, указанный */
/* на рисунках 6 и 7. Не подходит для режима РтО! */
...
}

Рис. 1. пример кода на языке с для перевода трансиверов в режимы

MODE-биты будут ошибочно установлены в отличное от нуля значение перед тем, как бит PCON. IDLE будет очищен микроконтроллером. Вследствие этого трансиверы CC111xFx/CC251xFx немедленно вновь перейдут в режим PM{2-3}. Так как причина пробуждения (прерывание) все еще будет активна в этот момент, трансиверы CC111xFx/CC251xFx «проснутся» и снова перейдут в режим PM{2-3}, что приведет к зависанию, из которого можно выйти только по сигналу RESET.

Для того чтобы быть уверенным, что биты SLEEP.MODE установлены в 0, рекомендуется передавать посредством DMA-передачи определенное количество байт в регистр SLEEP. Этот регистр переключается записью DMAREQ.DMAREQx битов непосредственно перед записью бита PCON.IDLE, однако это требует определенных условий:

  • Трансивер CC111xFx/ CC251xFx должен работать на максимально возможной частоте HS RC-генератора.
  • Генератор HS XOSC должен быть отключен
  • Кэш-память должна быть отключена

Следующий код на рисунке 2 предполагает, что трансивер CC111xFx/CC251xFx уже работает на максимально возможной скорости HS RC-генератора. Код, выделенный жирным цветом, критичен ко времени выполнения, поэтому должен быть использован без изменений.

/* код на языке С: */
/* Инициализация буферов источников и DMA дескрипторов для DMA   */
/* передачи. */
unsigned char __xdata PM2_BUF[7] =
{0x06,0x06,0x06,0x06,0x06,0x06,0x04};
unsigned char __xdata PM3_BUF[7] =
{0x07,0x07,0x07,0x07,0x07,0x07,0x04};
unsigned char __xdata dmaDesc[8] =
{0x00,0x00,0xDF,0xBE,0x00,0x07,0x20,0x42};
void main(void)
{
...
/* сохранение текущего DMA дескриптора нулевого канала 0 */
/* и остановка текущих передач, если канал используется */
unsigned char storedDescHigh = DMA0CFGH;
unsigned char storedDescLow = DMA0CFGL;
DMAARM |= 0x81;
/* Связывание дескриптора с правильным источником */
/* Замените &РМ2 BUF на &РМЗ BUF если используется РМЗ */
dmaDesc[0](unsigned int)& PM2_BUF >> 8;
dmaDesc[l](unsigned int)& PM2_BUF;
 
/* Связывание дескриптора с DMA каналом 0 и его активация */
DMA0CFGH = (unsigned int)&dmaDesc >> 8;
DMA0CFGL = (unsigned int)SdmaDesc;
DMAARM = 0x01;
/* Замечание! в этом месте надо убедиться, что все прерывания, */
/* которые не будут использоваться для «пробуждения» */
/* трансивера, были отключены, как описано в главе "Power */
/* Management Control" описания. */
/* Синхронизация с положительным фронтом сигнала генератора */
/* 32 кГц как описано в главе "Sleep Timer and Power Modes".
char temp = WORTIMEO;
while(temp = WORTIMEO);
/* Убедитесь, что генератор XOSC отключен при входе в режим */
/* РМ{2 - 3}и что кэш отключена. */
/*  Замените 0x06 на 0x07, если используется РтЗ */
MEMCTR |= 0x02;
SLEEP = 0x06;
/* Вход в режим так, как рассказано в главе "Power Management */
/* Control" описания. Убедитесь, что DMA-канал 0 активирован */
/* непосредственно перед установкой PCON.IDLE. */
asm("NOP");
asm("NOP");
asm("NOP");
if (SLEEP & 0x03)
{
asm("MOV 0xD7,#0x01");
asm("NOP");
/* DMAREQ = 0x01; */
/* Needed to perfectly align the */
/* the DMA transfer. */
/* PCON |= 0x01; */
asm("ORL 0x87,#0x01");
asm("NOP");
}
/* Включение кэша. */
MEMCTR &= ~0x02;
/* Связывание DMA канала О с оригинальным дескриптором и его */
/* инициализация, если он использовался перед входом в режим РМ */
DMA0CFGH = storedDescHigh;
DMA0CFGL = storedDescLow;
DMAARM = 0x01;
...
}

Рис. 2. пример кода для начала DMA-передачи PM0…PM3

Трансивер CC243x не имеет таких проблем с пробуждением, как CC111xFx/CC251xFx. Таким образом, процедура ввода CC243x в режим PM{2-3} такая же, как описана на рисунке 1. Надо лишь заметить, что CC243x должен вводиться в режим PM{2-3} на максимально возможной скорости HS RC-генератора. Однако в кристаллах версии D для CC243x есть другая проблема с «пробуждением» из режимов PM{2-3}. Трансивер CC243x имеет встроенный регулятор, который выдает напряжение 1,8 В для питания ядра при входных 2,0...3,6 В. Типичное напряжение в режиме PM{2-3} показано на рисунке 3.

Рис. 3. напряжение на регуляторе в режиме PM{2 - 3}

Рис. 3. напряжение на регуляторе в режиме PM{2 - 3}

Проблема заключается в том, что если прерывание на «пробуждение» поступает в момент, когда напряжение на выходе регулятора находится в пределах 0,5...1,6 В, то это может привести к зависанию ядра, потерям данных в оперативной памяти и регистрах и другим проблемам (рис. 4).

Рис. 4. гарантированные и негарантированные пробуждения трансивера сс2430

Рис. 4. гарантированные и негарантированные «пробуждения» трансивера сс2430

Для борьбы с этим явлением рекомендуется использование внешнего регулятора (рис. 5).

Рис. 5. принципиальная схема применения внешнего регулятора напряжения

Рис. 5. принципиальная схема применения внешнего регулятора напряжения

При возвращении трансиверов CC111xFx/CC251xFx (рис. 6) и СС243х (рис. 7) в активный режим важно правильно сделать проверку/инициализацию генераторов. Собственно код возвращения в активный режим для трансиверов CC111xFx/CC251xFx/CC243x: показан на рисунке 8.

/* код на языке С: */
Void main(void)
{
/* Следующий код должен быть выполнен как перед вхождением */
/* в режим РМ, так и после «пробуждения»: */
/* Очистка CLKCON.OSC для того, чтобы трансивер */
/* CClllxFx/CC251xFx работал на частоте генератора HS XOSC. */
/* Это необходимо, если генератор HS XOSC не был запущен перед */
/* входом в режим РМ */
CLKCON &= OxBF;
/* Проверка SLEEP.XOSC_STB для того, чтобы быть уверенным, что */
/* генератор HS XOSC  стабильно работает перед продолжением */
/* выполнения кода */
while(!(SLEEP & 0x40));
/* Установка SLEEP.OSC_PD для выключения генератора HS RCOSC */
SLEEP |= 0x04;
...
}

Рис. 6. проверка/инициализация генераторов для CC111xFx/CC251xFx

/* код на языке С: */
Void main(void)
{
...
/* Следующий код должен быть выполнен как перед вхождением в */
/* режим РМ, так и после «пробуждения». Однако, надо заметить, */
/* что он необходим, только если необходимо запустить генератор */
/* HS XOSC в активном режиме: */

/* Установка SLEEP.OSC_PD для включения генератора HS XOSC */
/* (генератор HS RCOSC уже запущен) */
SLEEP &= OxFB;
/* Проверка SLEEP.XOSC_STB для того, чтобы быть уверенным, что */
/* генератор HS XOSC  стабильно работает перед продолжением */
/* выполнения кода */
while(!(SLEEP & 0x40));
/* В соответствии с описанием СС243х  необходимо добавить */
/* соответствующее количество команд ЫОР, что дает 64 мкс */
/* задержки перед включением генератора HS XOSC */
asm("NOP");
/* Очистка CLKCON.OSC для включения генератора HS XOSC. */
CLKCON &= OxBF;
/* Проверка CLKCON.OSC , для того, чтобы быть уверенным, что */
/* трансивер СС243х переключился на работу от генератора */
/* HS XOSC */
while (CLKCONS0x40);
/* Установка SLEEP.OSC_PD для выключения генератора HS RCOSC */
SLEEP |= 0x04;
...
}

Рис. 7. проверка/инициализация генераторов для сс243х

/* код на языке С: */
/* процедура обработки прерываний таймера спящего режима (ISR) */
_PRAGMA(vector=VECT(5, 0x2В)) __near_func __interrupt void
ST_ISR(void);
_PRAGMA(vector=VECT(5, 0x2B)) __near_func __interrupt void
ST_ISR(void)
{
/* Очистка IRCON.STIF (Флаг прерывания таймера спящего режима) */
IRCON &= 0x7F;
/* Очистка WORIRQ.EVENT0_FLAG (Флаг внешнего прерывания таймера */
/* спящего режима) */
/* Это необходимо только для трансивера CClllxFx/CC251xFx! */
WORIRQ &=  OxFE;
...
/* Необходимо очистить биты SLEEP.MODE  для того, чтобы */
/* прерывание также могло возникнуть и перед тем как трансивер */
/* войдет в режим РМ. Если это прерывание возникнет в течении */
/* работы трех команд NOP (перед тем, как прерывания */
/* заблокируются) в коде из рисунка 1, то очистка битов */
/* SLEEP.MODE будет гарантировать, что приложение не войдет */
/* в режим РМ. */
SLEEP &= OxFC;
}
/* Процедура обработки внешних прерываний, например из порта 1 */
_PRAGMA(vector=VECT(15, 0x7В)) __near_func __interrupt void
Pl_ISR(void);
_PRAGMA(vector=VECT(15, 0x7B)) __near_func __interrupt void
Pl_ISR(void)
{
/* Очистка PlIFG.bitl (флага внешнего прерывания Portl.Pinl) */
P1IFG = OxFD;
/* Очистка IRCON2.P1IF (флага прерываний порта 1) */
IRCON2 &= 0xF7;
...
/* Необходимо очистить биты SLEEP.MODE  для того, чтобы */
/* прерывание также могло возникнуть и перед тем как трансивер */
/* войдет в режим РМ. Если это прерывание возникнет в течении */
/* работы трех команд NOP (перед тем, как прерывания */
/* заблокируются) в коде из рисунка 1, то очистка битов */
/* SLEEP.MODE будет гарантировать, что приложение не войдет */
/* в режим РМ. */
SLEEP &= OxFC;
}

Рис. 8. Код возвращения в активный режим

При использовании для питания трансиверов аккумуляторов важно знать, за какое время устройство разрядит используемый элемент. Для определения потребления можно использовать следующую схему (рис. 9) на примере ZigBee-трансиверов CC2430.

Рис. 9. блок-схема изменения потребления тока

Рис. 9. блок-схема изменения потребления тока

На экране осциллографа измерения могут выглядеть примерно так, как показано на рисунке 10.

Рис. 10. вид измерений на экране осциллографа

Рис. 10. вид измерений на экране осциллографа

Итого имеем следующие данные, обобщенные в таблице 1.

Таблица 1. потребляемые токи в каждом из режимов

Интервал Описание Ток, мА Длительность, мс Потребление, мА/мс
1 Переход из спящего режима в режим генератора HS RCOSC 16 МГц 0,75 0,49 0,3675
2 Переход в режим генератора HS XOSC 32 МГц 12 1,8 21,6
3 CMSA/CA алгоритм. Трансивер в режиме приема. 31 1,6 32,86
4 Переключение из режима приема в режим передачи. 18 0,19 3,42
5 Передача пакетов. Трансивер в режиме передачи. 29 0,58 16,82
6 Переключение из режима передачи в режим приема 18 0,11 1,98
7 Прием подтверждения от координатора. Трансивер в режиме приема 31 1,1 34,1
8 Обработка пакетов. Ядро в режиме 32 МГц 12 1,1 13,2
9 Переход в спящий режим (PM0 → PM2). Ядро в режиме 16 МГц. 7 0,62 4,34

Вычисляем общее потребление, оно получается 128,7 мА/мс.

Попробуем рассчитать время жизни батареи при односекундных интервалах опроса:

Потребление во время опроса:

Потребление во время сна:

Общее потребление в сутки:

Если питать устройство от двух последовательно соединенных 1,5 В батарей емкостью, например 3,1 А/ч, то время жизни батарей составляет 1000 дней.

Таким же образом можно рассчитать время жизни батарей и при других значениях интервала опросов.

Литература

  • Application Note AN053 Measuring power consumption with CC2430 & Z-Stack
  • Design Note DN106 Power Modes in CC111xFx, CC243x, and CC251xFx
  • Application Note AN044 CC2430 Revision D, Power Modes.

(c) В. Нестеров. Новости Электроники за 2008 г., №4, стр. 27-31

другие статьи другие статьи

Комментарии

Комментариев нет. Ваш комментарий будет первым.


Чтобы оставить свой комментарий Вам необходимо зарегистрироваться.



Моя корзина
ваша корзина пуста
Розничные заказы:
(3822) 566-300
(3822) 562-300
Оптовые заказы:
(3822) 55-65-30
(3822) 55-95-73
Факс:
(3822) 56-08-97

Полезные ссылки

Все статьи
Техническая документация
FTP-сервер
Каталог продукции

| Новости | Программа поставок | Электронная библиотека | Форум | О компании | Контакты | WAP |

Платан - официальный поставщик Поиск электронных компонентов ChipFind: поисковая система по поставщикам радиокомпонентов Поиск электронных компонентов CATALOG.METKA.RU
дизайн: Анна Кубарева программирование: Дмитрий Завражнов © ООО Элград 2007-2010