Перейти к содержанию
    

LPC1768 SLEEP & LPC_PINCON->PINMODE

Пытаюсь добиться от 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделать наоборот -- неиспользуемые выводы МК разверните на выход, а резисторы подтяжек поотключайте.

Выходные CMOS-структуры в статическом режиме ток не потребляют.

 

Входные цепи из-за наводимых на них помех часто могут находятся не в "цифровом" режиме. Цифровой ркежим -- это когда на затворах транзисторов присутствует только высокий уроевнь или только низкий. В результате воздействия помех на вхлдах могут быть любые напряжения. Такаим образом, когда входное напряжение ("медленной" помехи) будет примерно равно половине напряжения питания, то входные транзисторы не будут четко закрыты. Они будут находится в "аналоговом" режиме. (Не в режиме отсечки или насыщения, а в активном режиме.) То есть через них будет протекает небольшой сквозной ток. Хоть этот ток и не большой, но в режимах сохранения энергии, он будет заметен. Тем более, что этот ток не одного вывода, а нескольких.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что нужно сделать чтобы добиться минимального энергопотребления?
Полагаю, что в LPC111х порты такие же. Чтобы добиться минимального потребления недостаточно отключить подтяжку - надо все неиспользуемые ноги перевести на вывод и вывести низкий уровень. Не могу найти тут свое сообщение, в котором описывал свои изыскания - нужно проделывать эти операции на всех разрядах порта, реализованных в семействе, а не только на тех, которые выведены наружу в конкретно вашем корпусе. Например, если в самом большом корпусе есть P3.30, а в вашем корпусе его нет - то настраивать этот разряд все равно нужно, ибо утечки текут внутри кристалла даже если эта площадка и не разварена на вывод корпуса.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решение типа:

		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
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Я с системой тактирования у 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 кГц. Не расценивайте это как хваствовство, просто оценивайте каких результатов можно вообще добиться. В принципе, можно было участок проги вообще написать на ассемблере, тогда примерно еще можно было бы на половину уменьшить потребление проца. Но зачем? Сама схема устройства потребляет, да и саморазряд источника тоже имеется. Так что дальнейшее снижение энергопотребления проца не имел особого смысла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Откуда это следует? Первый же триггер шмидта на пути тактового сигнала (а что-то подобное между генератором и ядром/периферией обязательно есть) сделает эти фронты абсолютно одинаковыми.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откуда это следует? Первый же триггер шмидта на пути тактового сигнала (а что-то подобное между генератором и ядром/периферией обязательно есть) сделает эти фронты абсолютно одинаковыми.

Это чисто мои предположения.

 

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

 

Чем-то этот феномен нужно объяснять. Вот я его и объясняю тем, что на высоких тактовых частотах фронты сигналов, проходящих через многие-многие комплиментарные КМОП-структуры, имеют всё-таки несколько большую крутизну. Поэтому импульсы сквозного тока имеют меньшую длительность (при той же амплитуде).

 

Встречный вопрос. Даже два.

 

1. А как бы Вы объяснили это явление -- небольшое снижение потребляемого тока при повышении частоты процессора?

2. На сколько я знаю (но я могу и ошибаться!), триггеры Шмитта используются только на входах портов, но никак не внутри процессорных вентилей.

 

Забыл добавить, что даже бесконечно крутой фронт может стать более пологим после прохождения нескольких комплиментарных пар. Отличное от нуля сопротивление каналов транзисторов и паразитные емкости сделают свое дело. Я, правда, это никак не могу это увязать с тактовой частотой. Так что моя, так сказать, теория -- не совсем точная. Мне тоже хочется докопаться до истины. Может-быть кто-нибудь знает, что вообще происходит?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если без пар и транзисторов.

 

 

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

 

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

 

Или я совсем про другое?:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А Вы знаете, уважаемый коллега Golikov, Вы натолкнули меня вот еще на какую мысль. Начну немного издалека.

 

Допустим, у нас имеется некая емкость, которая заряжается от какого-то источника напряжения через сопротивление. Теоретически, заряд емкости будет длится во времени бесконечно долго. Но мы с Вами не математики и физики, а инженеры. Наши пределы погрешностей составляют 1, 2, 5 и иногда даже 10%. Грубо говоря, те измерения, с которыми мы обычно имеем дело имеют вот эти названные погрешности. Теперь, если считать, что с нашей (инженерной) точки зрения процессы останавливаются тогда, когда они попадают в диапазон "наших" погрешностей, то мы сможем продвинуться дальше в наших рассуждениях.

 

Допустим, при некоторых известных параметрах (напряжение источника, сопротивление, емкость) переходной процесс заканчивается за 100 нс. При этом тратится какая-то энергия, которую косвенно мы можем оценить путем измерения тока заряда.

 

Теперь давайте увеличим сопротивление в два раза. Что мы можем сказать в целом про переходной процесс? Ну, то, что время заряда будет больше в два раза, это понятно. Но что станет с потребляемым током? По идее оно тоже уменьшиться. А что можно сказать про затраченную от источника питания энергию? -- Она не измениться.

 

Идем дальше. Допустим мы должны выполнить 1000 циклов заряд-разряд емкости. Пусть один цикл составляет 1 мкс, а циклы следуют пачками через каждые 10 мс. (Я специально так подобрал времена, чтобы было понятно, что пачка будет длиться 1 мс, а инерционность стрелочных приборов не позволит увидеть период этих пачек.)

 

Вопрос -- что покажет амперметр в первом и во втором случае, когда мы увеличили сопротивление в два раза? Ответ состоит в том, что в обоих случаях потребление энергии (а значит и показания амперметра) будет одинаковым.

 

Хорошо. Идем дальше. Как вы думаете, по какой причине у микроконтроллеров (да и вообще -- у любого процессора) существует некая граничная частота, начиная с которой он уже не в состоянии выполнять программу детерминировано?

 

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

 

Давайте ещё немного мысленно поиграемся с "отрезанием" средней части импульса. Вырезанием средней части импульса, мы как бы увеличиваем тактовую частоту. Мы можем видеть, что продолжая увеличивать частоту, форма пилы мало меняется, но зато амплитуда пилы резко начнет уменьшаться. Наверняка вы такое видели не раз в своей практике.

 

Уменьшение времени заряда-разряда конденсатора говорит о том, что он не заряжается до конца. А это значит, что количество забранной у источника питания энергии будет меньше на единицу события (фронта импульса).

 

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

 

Мне наверно следует предупредить холливар -- я не говорю о режимах работы, когда проц "молотит" постоянно. Я говорю о режимах, когда проц 90 и более процентов спит и потребляет доли микроампер, а только в 10 (и менее) процентов времени проц работает, потребляя десяток-другой миллиампер. Но поскольку в моменты бодрствования проц выполняет одно и тоже количество команд, условно совершая 1000 переходов состояния внутри ядра, то можно утверждать, что он в этот момент потребляет одно и тоже количество энергии.

 

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

 

 

Кто-нибудь понял, что я тут сказал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то вы развели тут... лес целый... транзисторы, фронты... B)

А достаточно посмотреть на график характеристики потребления CPU от частоты - по оси X отложим МГц, по оси Y - мА. Так вот - если его наклон к оси X менее 45градусов, то явно что на большей частоте при пропорционально большем времени сна, потребление будет меньше. Это если предположить, что у вас некий идеальный код, время выполнения которого не зависит от реального времени и обратно пропорционально только частоте CPU (что в реальности обычно не совсем так).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну я понял написанное:) и да я математик:)...

 

про наклон то понятно, я так понимаю человека мучит вопрос почему так...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Позволило снизить до 250микроампер. Все равно много.

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

В еррате написано что при переходе в deep sleep, pll не выключается. Может это ваш случай?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...