VccRead на ATTiny13
- Войдите на сайт для отправки комментариев
Пнд, 29/07/2013 - 23:33
Всем привет. Для реализации одной задумки нужно как-то считать напряжение питание микроконтроллера ATTiny13. Недавно случайно наткнулся на статью где вроде бы всё хорошо, попробовал код на ардуино - работает:
http://www.youtube.com/watch?v=EZbOaSX29Xo
Но на написал простенький скетч для тиньки:
static int vccRead(byte us =250) { ADMUX = 1<<REFS0; // опорное напряжение - Vcc ADMUX |= 0x0E; // объект измерения - внутренний источник // стабилизированного напряжения 1.1В delayMicroseconds(us); ADCSRA |= 1<<ADSC; // запуск АЦ-преобразования while(ADCSRA & (1<<ADSC)); // и ожидание его завершения word x = ADC; return x ? (1100L * 1023) / x : -1; } void setup() { pinMode(4, OUTPUT); } void loop() { digitalWrite(4, HIGH); delay(vccRead() / 10); digitalWrite(4, LOW); delay(vccRead() / 10); }
При программной эмуляции ничего не происходит, тоесть функция vccRead() не имеет никакого значения.
Наперед Спасибо.
Всё разобрался:
Кстати интересная функция... особенно когда питаете микроконтроллер от батареи и не хотите чтобы он убил её.
Хотя работает уже на макетке нетак как в протеусе, мигает то 18 раз то 3 раза то 10 а должно примерно один раз на 1 вольт, тоесть если напряжение питания 3.5 В то мигает 3 раза если 5 - 5...
http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-... - посмотрите еще здесь...
Я в Английском не силён, нашёл код:
Вставил в IDE выбрал ATtiny13 и вот что мне среда выдаёт:
sketch_jul30d.ino: In function 'long int readVcc()':
sketch_jul30d:11: error: 'MUX3' was not declared in this scope
sketch_jul30d:11: error: 'MUX2' was not declared in this scope
Ну, значит ваш вариант не подходит под "else" и надо разбираться в регистрах самостоятельно...
http://html.alldatasheet.com/html-pdf/80274/ATMEL/ATTINY13/4483/34/ATTIN...
Ключевые слова: "bandgap reference"
И на том спасибо :)
Вижу что у меги есть нога AREF pin вот походу от неё мега и узнаёт напряжение питания. В тини такой нету.
А можно ссылку где вы взяли вот эту недокументированную возможность измерения внутреннего источника и для чего его в общем измерять?
ADMUX |= 0x0E;
// объект измерения - внутренний источник
// стабилизированного напряжения 1.1В
в оригинальном ДШ такого нет. Есть только mux0 и mux1.
Тут http://www.stepwood.com/avrsuite/2013/01/21/opredelenie-napryazheniya-pi...
Ответил автор статьи, к сожалению невозможно таким способом узнать напряжение питания. В голову приходит только DC-DC конвертор на 5 В...
Доброго времени суток !
На ATtiny13 не получится. Идея данного решения основывается на том что АЦП настроен для замера между AVcc и Aref.
AVcc в arduino подключен на 5В тоесть на питание. Внутри atmega есть стабилизированный источник 1.1В. Самое главное 328ая можен подвключить на вход АЦП этот внутренний источник, а ATTiny13 НЕТ. 328ая сделав замер до 1.1В пересчитав получает полную величину AVcc - тоесть питания.
Спасибо за помощь.
Насколько я понимаю если не получится сделать программно то должно получится аппаратно? Подскажите как пожалуйста.
Для начала интересует сколько у вас литиевых батарей. если одна то ставите lowdrop стабилизатор например HT7133 на 3.3В. Падение на нем всего 0,1В, но максимальный ток 30мА. Для тиньки хватит 30 мА, а вот выходной полевик питать уже от батареи (если я правильно понял вы спрашиваете для проекта велофары).
Правда рабочее напряжение всего получается 3,4-4,2В. Есть также HT7130 на 3В , который лучше подойдет и рабочее напряжение полчается 3,1-4,2. Батарею полнее используете. Так как питание Vcc у вас стабильное через делитель измеряйте напряжение на батарее и вам больше не нужен внутренний опорник
только не забудьте настроить фьюзы Bodlevel чтобы у вас тинька не отрубалась при питании 3 или 3.3 В
можете поставить 2.7В или вообще отключить
и еще. полевиком напрямую с тиньки лучше не управлять. во первых ток ограничен, будет плавать напряжение питания, во вторых 3В(незнаю сколько падение на внутренних транзисторах тиньки) может быть недостаточно чтобы открыть полевик. сделайте небольшой драйвер
хотя если светодиды не очень мощные можно применить IRLML2502 с которым может и получится запустить без драйвера
надо проверять
Вот график моего транзистора которого я выпаял из старой материнки:
PHB55N03LT.
Я тут подумал, а что если использовать стабилитрон на напряжение 3.3В, когда напряжение достигнет 3.3 то значение АЦП будет 1023 что будет сигнализировать тиньке что пора или уменьшать режим или заснуть вообще...
у вашего транзистора емкость затвора выше 1230пф и тинька с таким слабым стабилизатором может просто не открыть полностью транзистор, да и питание будет скакать и работать все нестабильно будет
у IRLML2502 емкость 740пф кажется
а вот со стабилитроном честно сказать не понял
Ок, спасибо, правда этот в смд корпусе, а я всё делаю грубо и на макетной плате, с моим паяльником смд это убийство.
а вот со стабилитроном честно сказать не понял
Питать планирую тиньку от того же источника, без стабов, и на один АЦП подать стабилизированное напряжение в 3.3 В которое хочу получить при помощи стабилитрона, АЦП будет постоянно возвращать значение меньше 1023-х, ведь там напряжение меньше напр. питания, когда напряжение достигнет напряжения стабилизации стабилитрона то уже значение ацп приблизится до 1023...
Я ведь верно размышляю?
вы что паяете 60 ватным советстким паяльником?
а насчет стабилитрона неплохая идея, само напряжение питания тяжело будет измерять, нужна апроксимация, а вот просто отследить что достигло напряжение при котором выключить подойдет. но это нужно постоянно ацп гонять. хотя вместо стабилитрона я бы взял лучше TL431 например. у него зависимость от температуры меньше (вы же не дома будете использовать устройство)
а можно вообще принцип поменять. зачем измерять напряжение ацп.
поставьте TL431, переменным резистором настройте уровень срабатывания. и как только напряжение достигнет заданного уровня на выходе получите 0 или 1 (смотря какую схему сделаете). и обрабатывайте сколько хотите. и тиньку разгрузите
TL431 - отличный выход из ситуации, но это лишние детали, на данном этапе буду использовать тиньку, она любит работать, мощи достаточно... но всё равно спасибо.
Не задаюсь целью сделать точную индикацию напряжения, мне нужно отследить только 2 значения, первое когда нужно уменьшить уровень, пока понятия как это программно сделать немею... ну до этого ещё долго.
ЗЫ 65 ваттним паяльником паяю :)