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

 
 
> LPC1768 SLEEP & LPC_PINCON->PINMODE
truebest
сообщение Jul 12 2013, 06:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 12-05-10
Пользователь №: 57 214



Пытаюсь добиться от LPC1768 минимального энергопотребления. В аппноте AN10915 говорят что по умолчанию все ноги контроллера являются входами + подключен внутренний pull-up резистор. Рекомендуют сперва на всех GPIO выключить pull-up резисторы. Ок лезем в юзермануал а там...
Там сказано что в карте регистров существует с PINMODE0 - PINMODE7 и PINMODE9. Ок Лезем ниже где расписаны эти регистры, там существует описание только для PINMODE0 - PINMODE4 PINMODE7 PINMODE9.
Лезем в хеадер lpc17xx.h там вообще с PINMODE0 по PINMODE9 все есть ренистры. Что точно нужно менять непонятно..

Минимального энергопотребления удалось добиться когда я на всех GPIO включаю только pull-down резисторы в режиме котроллера power down моя плата потребляет 330микроампер(реально из них контроллер потребляет около 150мка что много для этого режима сна). Если я все gpio настраиваю как non-pull-up non-pull-down и отправляю котроллер в power down то моя плата потребляет 1.1ма.
Перед сном отключаю все то можно деинициализирую UARTты ADC и прочее.


Собственно вопросы, сколько существует реально PINMODE регистров?
Что нужно сделать чтобы добиться минимального энергопотребления?

Сообщение отредактировал truebest - Jul 12 2013, 06:48
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
truebest
сообщение Jul 12 2013, 09:02
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 12-05-10
Пользователь №: 57 214



Решение типа:
CODE
LPC_PINCON->PINSEL0 = 0x00000000;
LPC_PINCON->PINSEL1 = 0x00000000;
LPC_PINCON->PINSEL2 = 0x00000000;
LPC_PINCON->PINSEL3 = 0x00000000;
LPC_PINCON->PINSEL4 = 0x00000000;
LPC_PINCON->PINSEL5 = 0x00000000;
LPC_PINCON->PINSEL6 = 0x00000000;
LPC_PINCON->PINSEL7 = 0x00000000;
LPC_PINCON->PINSEL8 = 0x00000000;
LPC_PINCON->PINSEL9 = 0x00000000;
LPC_PINCON->PINSEL10 = 0x00000000;

/*Выключаем Pull-up*/
LPC_PINCON->PINMODE0 = 0xAAAAAAAA;
LPC_PINCON->PINMODE1 = 0xAAAAAAAA;
LPC_PINCON->PINMODE2 = 0xAAAAAAAA;
LPC_PINCON->PINMODE3 = 0xAAAAAAAA;
LPC_PINCON->PINMODE4 = 0xAAAAAAAA;
LPC_PINCON->PINMODE5 = 0xAAAAAAAA;
LPC_PINCON->PINMODE6 = 0xAAAAAAAA;
LPC_PINCON->PINMODE7 = 0xAAAAAAAA;
LPC_PINCON->PINMODE8 = 0xAAAAAAAA;
LPC_PINCON->PINMODE9 = 0xAAAAAAAA;

/*Все GPIO как выходы*/
LPC_GPIO0->FIODIR = 0xFFFFFFFF;
LPC_GPIO1->FIODIR = 0xFFFFFFFF;
LPC_GPIO2->FIODIR = 0xFFFFFFFF;
LPC_GPIO3->FIODIR = 0xFFFFFFFF;
LPC_GPIO4->FIODIR = 0xFFFFFFFF;

/*Все GPIO в 0*/
LPC_GPIO0->FIOCLR = 0xFFFFFFFF;
LPC_GPIO1->FIOCLR = 0xFFFFFFFF;
LPC_GPIO2->FIOCLR = 0xFFFFFFFF;
LPC_GPIO3->FIOCLR = 0xFFFFFFFF;
LPC_GPIO4->FIOCLR = 0xFFFFFFFF;

Позволило снизить до 250микроампер. Все равно много.
Внутренне отключение всяких блоков в LPC_SC->PCONP не дает никаких результатов.

Сообщение отредактировал IgorKossak - Jul 12 2013, 13:03
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jul 12 2013, 12:04
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Какая у Вас тактовая частота?

Я с системой тактирования у LPC не очень знаком. Но скажу по аналогии с MSP430. Там тоже несколько генераторв.
Когда проц отправляете в спячку, нужно выключать "быстрый" тактовый генератор (в процах он обычно где-то на 1 МГц) и перходить на тактирование от медленного генератора. В MSP430 это внутренний RC генератор на 12 кГц. От этого геренратора тактируется таймер, по которому должен проснуться проц, или какая-нибудь другая периферия. Как только возникает событие, которое пробуждает проц, нужно в обработчике этого события включить быстрый тактовый генератор, дождаться установки режима колебаний (а Кортексах это установка флага, в MSP -- можно сразу) и переключить тактирование ядра на этот генератор.

Наверняка Вам это уже известно, но я все же скажу -- КМОП-структуры потребляют тогда, когда происходит у них переключение из "0" в "1" или обратно. И вот тут не все так просто, как кажется на первый взгляд!

Потребление происходит в момент перехода. Ожидается, что чем выше тактовая частота, тем должны быть круче фронты у сигналов внутри МК. Незначительно, но круче. Иначе говоря, время перехода из "0" в "1" на более высокой частоте чуть-чуть должно быть меньше, чем на низкой тактовой частоте. Теоретически, на очень маленькой частоте, когда, допустим, что фронт мы формируем в ручную с помощью переменного резистора, при напряжении около половины питания, через комплиментарные структуры потечет ток. Об этом я уже писал выше. Таким образом, время перехода определяет сколько времени будет протекать этот ток. Это значит, что при одном и том же количестве переходов (допустим 10000), общее (интегральное) для одного и того же участка программы, время протекания тока будет больше если этот участок программы будет выполняться на более низкой частоте.

Вообще-то тут лучше рисовать, но я не очень расположен сейчас к рисункам. Поэтому предлагаю вот такой ход. Допустим, прога должна совершить те же самые 10000 переходов и снова уснуть до слудующей побудки. Пусть побудки будут происходить один раз в секунду.

Так вот, допустим на тактовой частоте 12 кГц, время протекания сквозного тока составляет 25 нс, а на тактовой частоте 1 МГц -- 10 нс. Точных значений я не знаю, да и скорее всего вряд ли кто их знает. Но для примера сгодится.

Допустим так же, что суммарный сквозной ток этих коротких импульсов составляет 1 мкА.

Допустим, мы работаем на 12 кГц. Таким образом перемножаим 1 мкА х 25 нс х 10000 переходв и получаем 250 мкА. Это интегральное значение нужно рстянуть на одну секунду.

Теперь допустим, что мы заставили ядро работать на 1 МГц. Снова перемножаем 1 х 10 х 10000 = 100 мкА. И это значение мы снова должны растянуть на односекундный период.

С одной стороны, на частоте в 1 МГц будет большой и короткий бросок тока, когда процессор работает, а на 12 кГц -- небольшой ппо амплитуде, но растянутый по времени. В остальное время, когда ядро вообще спит и, считается, что тока не потребляет. Практика подтверждает, что если проц, который все время спит, но раз в секунду просыпается чтобы выполнить какую-то работу, и если проц для этой работы запускать на максимальной частоте, то общее потребление будет ниже, чем если бы проц запускался на более низкой частоте.

Бли-ин! Кто это всё читать!? Наверно действительно надо было рисовать. С картинками все процессы намного понятнее.

ЗЫ.
Для ориентации и как пределный случай. Я недавно делал один девайс на MSP430 с батарейным питанием. Вопросы экономии стояли очень жестко. Проц просыпался каждую секнудны, проверял сигналы и снова засыпал. Прога написана на Си. Итоговое потребление схемы составило 12-14 мкА. Причем проц жрал примерно половину. В момент пробуждения я его его тактировани на частоте в 20 МГц. В режиме спячки -- 12 кГц. Не расценивайте это как хваствовство, просто оценивайте каких результатов можно вообще добиться. В принципе, можно было участок проги вообще написать на ассемблере, тогда примерно еще можно было бы на половину уменьшить потребление проца. Но зачем? Сама схема устройства потребляет, да и саморазряд источника тоже имеется. Так что дальнейшее снижение энергопотребления проца не имел особого смысла.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 16:45
Рейтинг@Mail.ru


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