если я правильно понял стабилизировать ток вы не будете? или все таки будете? по коду вы что то измеряете и от этого зависит яркость. что измеряете?
сам давно собирался сделать драйвер
Нет, стабилизировать ничего небуду, в моем случае ток будет падать прямо пропорционально что на входе что на выходе.
Есть подстроечник, который задаёт максимальное значение для ШИМ, тоесть изменяет макс. напряжение и следовательно макс. ток, ведь закон Ома никто не отменял, ну и потом от этого значения уже подсчитывает 75/50/25/0% Гг да 0% тоесть потребление около 5мА, может будет кому и полезно. Стробоскоп вырезал, он меня бесит, да и лишние прерывания... да ну. КПД моей реализации контроллера для светодиода зависит только от транзистора, ток который кушает тинька не в счёт ну 0.21 Вт это разве мощность?
Итак, как работает, если быстро нажать и отпустить кнопку то уровень уменьшится, если же зажать то растёт каждых 2 - 3 сек. ну и само собой запоминание последнего перед выключением питания режима.
Оптимизировал немного код:
#include <EEPROM.h>
byte level = 0, light = 0;
void setup() {
pinMode(0, OUTPUT); // светодиод
pinMode(3, INPUT); // кнопка для смены режимов, пока на 3 пине
delay(200); // на всякий случай
level = EEPROM.read(0);
digitalWrite(3, HIGH); // подтяну программно резистор
}
void loop() {
if (digitalRead(3) == LOW) { // если кнопка нажата
byte time = 0;
//delay(50); // защита от случайных нажатий и дребезга
while(digitalRead(3) == LOW) { // считаем сколько мс нажата
time +=25;
delay(25);
if (time == 250) {
break; // принудительно выходим из цикла
}
}
if (time <= 100) { // если меньше секунды то увеличиваем реж.
level++;
if(level >= 5){ // нечего записывать то что не используем
level = 4; // ведь есть 4 режима
}
}
if (time == 250) { // если держать больше 2.5 секунды то уменьшаем реж.
level--;
if(level >= 5){ // если от 0 отнять 1 будет 255
level = 0; // чтобы не было 255 запишем 0
delay(500);
}
}
EEPROM.write(0, level); // запишем режим
}
// режыми
if(level == 0){ // 100%
light = 4;
}
if(level == 1){ // 75%
light = 6;
}
if(level == 2){ // 50%
light = 8;
}
if(level == 3){ // 25%
light = 16;
}
if(level == 4){ // 0%
analogWrite(0, 0);
}
else{
analogWrite(0, (analogRead(A2) / light));
}
}
Размер скетча в двоичном коде: 812 байт (из 1 024 байт максимум) пока место есть не буду уходить от отличной наглядности функций Arduino.
Обнаружил баг, который не могу никак исправить, при повышении мощности(level++) если дождаться момента именно когда только только уровень вырастает на 1 и резко отпустить кнопку то уровень уменьшится(level--) хотя должен бы остаться... Чёт мозги уже не варят или что? Причём целый день.
если есть регулятор для шим зачем кнопка? можно же просто регулятором яркость изменять, хотя регулятор похоже толкьо для подстройки
глянул в инете несколько схем драйверов на тиньке. со стабилизацией тока люди не заморачиваются. такие же регуляторы как у вас. может и действительно забить
/*
**** Core13 ***
Arduino core designed for Attiny13 and similar devices.
NO WARRANTEE OR GUARANTEES!
Written by John "smeezekitty"
You are free to use, redistribute and modify at will EXCEPT IF MARKED OTHERWISE IN A PARTICULAR SOURCE FILE!
Version 0.18
*/
#include "wiring_private.h"
//#include "pins_arduino.h"
void analogReference(uint8_t mode){
if(mode==INTERNAL)
ADMUX |= _BV(REFS0);
else
ADMUX &= ~_BV(REFS0);
}
но все равно ругается
sketch_oct15a.ino: In function 'void setup()':
sketch_oct15a:5: error: 'analogReference' was not declared in this scope
я видел эту статью. может и правда нужно так делать. хотя где логика. если захочу постоянно на внутреем опорнике измерять зачем переключаться. думаю так же ругаться будет на analogReference
Итак, баг исправлен, код занимает 836 байт, вот он:
#include <EEPROM.h>
byte level = 0, light = 0;
void setup() {
pinMode(0, OUTPUT); // светодиод
pinMode(3, INPUT); // кнопка для смены режимов, пока на 3 пине
delay(200); // на всякий случай
level = EEPROM.read(0); // считаем значение из EEPROM
digitalWrite(3, HIGH); // подтяну программно резистор
}
void loop() {
if (digitalRead(3) == LOW) { // когда нажимаем на кнопку
unsigned int time = 0;
delay(25); // защита от случайных нажатий и дребезга тактовой кнопки
while(digitalRead(3) == LOW) { // подсчитаем сколько мс нажата
time +=1;
delay(1);
if (time == 2000) { // если больше 2 сек
break; // принудительно выходим из цикла
}
}
if (time == 2000 && digitalRead(3) == LOW) { // если больше 2 сек. и ещё нажата то уменьшаем реж.
level--;
if(level >= 5){ // если от 0 отнять 1 будет 65535
level = 0; // чтобы этого не было запишем 0
}
//delay(500);
}
if (time <= 165 && time >= 50){ // если просто клацнули то увеличиваем реж.
level++;
if(level >= 5){ // нечего записывать то что не используем
level = 4; // ведь есть 4 режима
}
//delay(500);
}
EEPROM.write(0, level); // запишем режим в EEPROM
}
// режимы
if(level == 0){ // 100%
light = 4;
}
if(level == 1){ // 75%
light = 6;
}
if(level == 2){ // 50%
light = 8;
}
if(level == 3){ // 25%
light = 16;
}
if(level == 4){ // 0%
analogWrite(0, 0);
}
else{
analogWrite(0, (analogRead(A2) / light));
}
}
Режим 25%
В реале выглядит ярче но увы фотик отстойный,
Фото режима 50% вышло очень размытое, выгружать нету особого смысла, а перефоткать не получится.
Вот парочка видео:
На всё, кстати, потратил меньше 40 грн + 10 грн АКБ от старого ноута, банки оказались вполне исправными и имеют ещё как минимум половину емкости, тоесть как минимум больше 1000 мА/ч на штуку.
Идея драйвера хорошая, но мне хотелось чтобы автоматически поддерживался заданный ток при изменении питания. поэтому сделал по своему
На данный момент протестировал в протеусе. в железе еще не тестировал. пока только заданный ток, без режимов яркости
в левом верхнем углу стоит кнопка. при нажатии сопротивление нагрузки падает в 2 раза, соответтсвенно напряжение должно тоже упасть в 2 раза для сохранения заданного того. для этого стоит вольтметр
обращать внимание на кнопку, вольтметр слева и вольтметр внизу ну и конечно осциллограф (ширину шим, сигналы инвертированы)
А меряешь напряжение обычно или при помощи источника опорного напряжения? Для 8-й меги оно вроде 2.5 В.
и питание в качестве опорника, и внутренний. в конце использовал внутренний. мегу применл для теста, чтобы не было проблем с памяться на этапе програмирования
Так тааак, пробую измерять напряжение от опорника 1.1 В, это исключит стабилитрон из схемы, будет достаточно простого резистивного делителя напряжения.
И ещё открыл для себя BODLEVEL фюзы, ну и собственно калькулятор фюзов, их применение мне позволит сделать защиту от глубокого разряда не увеличивая размер кода.
Кстати, давно хотел спросить, а что будет если измерять по опорнику и подать на порт больше 1.1 В ? если дать 5 В то будет кирдык?
а фиг его знает. может и кирдык, а может будет не то значение, например так 5В-1,1В*4=0,6В, его уже измеряет. трудно сказать надо проверять или искать инфу
Выставил фюзы чтобы тинька отключалась при напряжении в 2.7 В в файлике boards.txt, зашил и.... при напряжении 2.6 ещё работает, да и ниже тоже, что же не так?
а что у вас за фигня с фьюзами? у вас стоит 7A что значит 9,6мгц без делителя и частота соответственно 9,6мгц, а в параметрах платы стоит 1,2мгц как будто делитель включен. поменяйте на 9600000 или low смените на 6A
и тогда уже проверяйте. хотя не должно быть связано. я не проверял честно сказать. по разным данным программа при напряжении ниже Bodlevel перезапустится и будет так постоянно перезапускаться, по другим она как бы встает на паузу. так что точно должно произойти я не понял
Пробовал играться со фюзами и сложилось такое впечатление что при изменении фьюзов ничего не меняется, на разных скоростях камня ШИМ работает на частоте 4 кГц.
Ядро лежит C:\Users\Администратор\Documents\Arduino\hardware\attiny13
Кстати, МК при выставлении соответствующих фьюзов напрочь отказывается отрубаться при напряжении 2.7 В. выжрал АКБ до 1.9 В. Как будто просто игнорирует их.
Разобрался с фюьзами, как выяснилось нужно было сначала записать загрузчик, кстати я перезалил файлы ядра тини13 при выборе 128 кГц тиньки "по уходили в себя"
Настроил BODLEVEL(9.6 MHz, BOD 2.7 V) теперь есть защита от глубокого разряда, так как перед тинькой, для защиты, стоит диод, то на нём падает падает пару десятых вольта.
если я правильно понял стабилизировать ток вы не будете? или все таки будете? по коду вы что то измеряете и от этого зависит яркость. что измеряете?
сам давно собирался сделать драйвер
если я правильно понял стабилизировать ток вы не будете? или все таки будете? по коду вы что то измеряете и от этого зависит яркость. что измеряете?
сам давно собирался сделать драйвер
Нет, стабилизировать ничего небуду, в моем случае ток будет падать прямо пропорционально что на входе что на выходе.
Есть подстроечник, который задаёт максимальное значение для ШИМ, тоесть изменяет макс. напряжение и следовательно макс. ток, ведь закон Ома никто не отменял, ну и потом от этого значения уже подсчитывает 75/50/25/0% Гг да 0% тоесть потребление около 5мА, может будет кому и полезно. Стробоскоп вырезал, он меня бесит, да и лишние прерывания... да ну. КПД моей реализации контроллера для светодиода зависит только от транзистора, ток который кушает тинька не в счёт ну 0.21 Вт это разве мощность?
Итак, как работает, если быстро нажать и отпустить кнопку то уровень уменьшится, если же зажать то растёт каждых 2 - 3 сек. ну и само собой запоминание последнего перед выключением питания режима.
Оптимизировал немного код:
Размер скетча в двоичном коде: 812 байт (из 1 024 байт максимум) пока место есть не буду уходить от отличной наглядности функций Arduino.
Обнаружил баг, который не могу никак исправить, при повышении мощности(level++) если дождаться момента именно когда только только уровень вырастает на 1 и резко отпустить кнопку то уровень уменьшится(level--) хотя должен бы остаться... Чёт мозги уже не варят или что? Причём целый день.
понятно. значит это не драйвер а просто регулятор
если есть регулятор для шим зачем кнопка? можно же просто регулятором яркость изменять, хотя регулятор похоже толкьо для подстройки
глянул в инете несколько схем драйверов на тиньке. со стабилизацией тока люди не заморачиваются. такие же регуляторы как у вас. может и действительно забить
Кнопка для переключения режымов яркости, это же велофара, поставлю около переключателя для удобства.
у меня по сути работает как с токоограничивающим резистором, только с большим КПД.
Кнопка для переключения режымов яркости, это же велофара, поставлю около переключателя для удобства.
у меня по сути работает как с токоограничивающим резистором, только с большим КПД.
ну да. я это и имел в виду
вы кстати не знаете как запусть ацп тиньки на внутреннем опорнике?
Тут пишут что есть проблемы, говорят что с следующей версией должны исправить.
автор пишет что работает, но есть проблемы
в wiring_analog есть функция analogReference
но все равно ругается
А данная функция использует источник опорного напряжения для АЦП для всех портов или же для какого-то конкретного?
скорее всего для всех. только на тиньке не работает или я что то неправильно делаю.
придется на си писать
Было бы неплохо посмотреть, может мне пригодится.
Нашёл неплохую инфрмацию по AnalogReference(), на сколько я понял для того чтобы считать значение АЦП и сравнять его с внутренним источником 1.1 В:
Ну а дальше по старинке сравниваем с напряжением питания... Вроде так.
я видел эту статью. может и правда нужно так делать. хотя где логика. если захочу постоянно на внутреем опорнике измерять зачем переключаться. думаю так же ругаться будет на analogReference
Итак, баг исправлен, код занимает 836 байт, вот он:
Вроде бы как все работает, видео:
http://www.youtube.com/watch?v=Guv-4oeQrrg
Сделал парочку фоток, расстояние до стены ~ 10 метров:
http://i4.imageban.ru/out/2013/10/30/6ccea299ed8ab78293870cbbf2a19fba.jpg
Режим 100%
http://i2.imageban.ru/out/2013/10/30/469b2095a6cb07e5bd8d0eec635b137b.jpg
Режим 75%
http://i1.imageban.ru/out/2013/10/30/36fd3ac32552390dd521ca8486b8cb74.jpg
Режим 25%
В реале выглядит ярче но увы фотик отстойный,
Фото режима 50% вышло очень размытое, выгружать нету особого смысла, а перефоткать не получится.
Вот парочка видео:
http://www.youtube.com/watch?v=AgNt7LKDlq8
http://www.youtube.com/watch?v=x7sHIU-Nllc
Название их говорит само за себя.
Пока уменьшаю схемку дабы её засунуть в фонарик:
http://i2.imageban.ru/out/2013/10/30/eaa297a0a63b385cef43d9601b7d9cef.jpg
На всё, кстати, потратил меньше 40 грн + 10 грн АКБ от старого ноута, банки оказались вполне исправными и имеют ещё как минимум половину емкости, тоесть как минимум больше 1000 мА/ч на штуку.
Добавлю свои 5 капель
Идея драйвера хорошая, но мне хотелось чтобы автоматически поддерживался заданный ток при изменении питания. поэтому сделал по своему
На данный момент протестировал в протеусе. в железе еще не тестировал. пока только заданный ток, без режимов яркости
в левом верхнем углу стоит кнопка. при нажатии сопротивление нагрузки падает в 2 раза, соответтсвенно напряжение должно тоже упасть в 2 раза для сохранения заданного того. для этого стоит вольтметр
обращать внимание на кнопку, вольтметр слева и вольтметр внизу ну и конечно осциллограф (ширину шим, сигналы инвертированы)
А меряешь напряжение обычно или при помощи источника опорного напряжения? Для 8-й меги оно вроде 2.5 В.
Вот кстати всё что насобиралось со временем, код, прошивка, фюзы, ещё что-то...
http://hwman.ho.ua/files/Bicycle_lights/
А меряешь напряжение обычно или при помощи источника опорного напряжения? Для 8-й меги оно вроде 2.5 В.
и питание в качестве опорника, и внутренний. в конце использовал внутренний. мегу применл для теста, чтобы не было проблем с памяться на этапе програмирования
Добавил измерение напряжения питания:
Пока только в протеусе, пока стабилитрона нет, да и код ещё не писал, может вообще места не хватит.
Так тааак, пробую измерять напряжение от опорника 1.1 В, это исключит стабилитрон из схемы, будет достаточно простого резистивного делителя напряжения.
И ещё открыл для себя BODLEVEL фюзы, ну и собственно калькулятор фюзов, их применение мне позволит сделать защиту от глубокого разряда не увеличивая размер кода.
Кстати, давно хотел спросить, а что будет если измерять по опорнику и подать на порт больше 1.1 В ? если дать 5 В то будет кирдык?
а фиг его знает. может и кирдык, а может будет не то значение, например так 5В-1,1В*4=0,6В, его уже измеряет. трудно сказать надо проверять или искать инфу
Выставил фюзы чтобы тинька отключалась при напряжении в 2.7 В в файлике boards.txt, зашил и.... при напряжении 2.6 ещё работает, да и ниже тоже, что же не так?
а что у вас за фигня с фьюзами? у вас стоит 7A что значит 9,6мгц без делителя и частота соответственно 9,6мгц, а в параметрах платы стоит 1,2мгц как будто делитель включен. поменяйте на 9600000 или low смените на 6A
и тогда уже проверяйте. хотя не должно быть связано. я не проверял честно сказать. по разным данным программа при напряжении ниже Bodlevel перезапустится и будет так постоянно перезапускаться, по другим она как бы встает на паузу. так что точно должно произойти я не понял
Вот нашёл кое что об BODе.
Все файлы которые использую взяты отсюда, шю дуинкой..
это файлы на ядро, в них не нашел строки которые нужно прописать в boards.txt
вот на их сайте для 7A
о чем я и говорил
а если 1.2 Мгц как у вас написано должно быть
вот фьюзы для разных частот
Пробовал играться со фюзами и сложилось такое впечатление что при изменении фьюзов ничего не меняется, на разных скоростях камня ШИМ работает на частоте 4 кГц.
Ядро лежит C:\Users\Администратор\Documents\Arduino\hardware\attiny13
Вот содержымое файла boards.txt:
у вас последняя неправильная
если прописать
то всё очень медлено
что медленно?
делей 1000 будет где-то 5 сек.
Кстати, МК при выставлении соответствующих фьюзов напрочь отказывается отрубаться при напряжении 2.7 В. выжрал АКБ до 1.9 В. Как будто просто игнорирует их.
Разобрался с фюьзами, как выяснилось нужно было сначала записать загрузчик, кстати я перезалил файлы ядра тини13 при выборе 128 кГц тиньки "по уходили в себя"
Настроил BODLEVEL(9.6 MHz, BOD 2.7 V) теперь есть защита от глубокого разряда, так как перед тинькой, для защиты, стоит диод, то на нём падает падает пару десятых вольта.
Видео работы:
https://www.youtube.com/watch?v=RB1OCoUqFeo
Код: