Рубрики
|
индикация |
события |
инструменты |
беспроводная связь |
датчики |
источники питания |
компоненты |
корпуса |
микроконтроллеры |
приборы |
промышленная мебель |
прочее |
сетевые решения |
силовая электроника |
средства разработки |
новые технологии |
Интересные статьи
Рубрика: прочее
Использование режимов пониженного энергопотребления РЧ-трансиверов
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}
Проблема заключается в том, что если прерывание на «пробуждение» поступает в момент, когда напряжение на выходе регулятора находится в пределах 0,5...1,6 В, то это может привести к зависанию ядра, потерям данных в оперативной памяти и регистрах и другим проблемам (рис. 4).
Рис. 4. гарантированные и негарантированные «пробуждения» трансивера сс2430
Для борьбы с этим явлением рекомендуется использование внешнего регулятора (рис. 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. блок-схема изменения потребления тока
На экране осциллографа измерения могут выглядеть примерно так, как показано на рисунке 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
другие статьи
Комментарии
Комментариев нет. Ваш комментарий будет первым.
Чтобы оставить свой комментарий Вам необходимо зарегистрироваться.