Страница 1 из 2
Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 08:25:49
74LS00
Делаю регулятор яркости на tiny13.
Фоторезистор с сопротивлением 1-10к или 2-20к, в общем чтото такое. И к нему 10к делитель.
Методом тыка получил примерно это
Код: Выделить всё
u фр u сд шим
4.55в 3.026 205
3.71в 2.55в 95
1.8 2.023 30
1.74 1.9в 5
При слабой яркости до 356 ацп, шим будет 5 или вообще пофиг, до 10 можно, лижбы чуть светило.
От 368 ацп, повышать шим примерно от 30.
Ну и дальше получается горбыль, чтото не знаю подходящей формулы графика, а наверняка чтото просто есть.
При 930 ацп шим вообще обрубать и тушить выход, хотя к вопросу не относится.
Пока пытаюсь придумать хотябы линейный вариант на пробу, может прокатит, но тоже чтото не соображу как.
---
Код: Выделить всё
// MicroCore ATtiny13A https://github.com/MCUdude/MicroCore#how-to-install
// ATtiny13 9.6Mhz int.
int LDR = 0;
float LED = 0 ;
void setup() {
pinMode(0, OUTPUT);
}
void loop() {
LDR = analogRead(A1) ; //чтение фоторезистора
LED = ( LDR - 356 ) /2.8 ;
if (LED <= 1) { LED = 1 ; }
if (LED >= 450) {
digitalWrite(2, LOW) ;
}
else if ( LED < 100 ) {
analogWrite(0,LED );
}
LED = 0 ;
}
Пытаюсь заставить подсветку потухнуть при большой яркости и толку мало.
При запуске МК с большой яркостью, подсветки нет, но стоит закрыть фоторезистор как она включается и работает обычно
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 11:08:28
НАПАЛМ
Я думаю кусочно-линейной аппроксимация тут поможет, график разбить на части, для каждой части своя формула прямой и коэффициентами сдвига и угла наклона.
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 11:31:54
74LS00
Спойлер
Код: Выделить всё
// MicroCore ATtiny13A https://github.com/MCUdude/MicroCore#how-to-install
// ATtiny13 9.6Mhz int.
int LDR = 0;
byte LED = 0 ;
const byte LimitL = 160 ; // test max 190 // limit 160
void setup() {
pinMode(0, OUTPUT);
}
void loop() {
LDR = analogRead(A1) ; //чтение фоторезистора // A1/D2
LED = ( LDR - 356 ) /3 ; //2.8
if (LED <= 1) { LED = 1 ; }
if (LED < LimitL) {
analogWrite(0,LED );
}
else {
analogWrite(0,1 );
//digitalWrite(0, LOW) ;
LED = 0 ;
}
}
Это какойто капец, заставить ардуину работать не сильно то проще чем гору деталей.
Единственный способ загасить экран это подать слабый шим
analogWrite(0,1 )
Если просто подать низкий уровень
digitalWrite(0, LOW) , то это срабатывает ровно один раз при запуске контролера пока это значение на входе не изменится.
Если же подать шим с 0
analogWrite(0,0 ) , то экран гаснет, причём он гаснет уже совсем и полностью, и по верху и по низу, то есть с низким уровнем на входе он тоже не работает.
Никаких способов отладки я тут не вижу, потому как ардуино не может даже бинарный файл прошивки сделать. Другая библиотека жаловалось что ядро не могёт, а в этой просто крюкозябры, хотя разок почемуто получалось.
Как тут приколхозить иной отладчик тоже не знаю, потому как там и железку надо особую.
В общем как костыль работать сгодится, но чую надо запрегать для гашения отдельную ногу. Эти МК настолько сложные что пока ниодин скетч у меня не заработал как только я делаю шаг в сторону от копипасты кода/
Кстати а какое опорное у тиньки? Я так понял изменить его нельзя и оно похоже не 5в как пишут, и главное проверить это тоже нельзя, никакой вывод не приделать.
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 13:38:57
NStorm
74LS00, если не читать документацию и даташиты - конечно всё "магией" становится и слишком сложным.
Никаких способов отладки я тут не вижу, потому как ардуино не может даже бинарный файл прошивки сделать
Это ерунда полная написана.
analogWrite(0,0 ) , digitalWrite(0, LOW)
А это одно и тоже.
Опорным и тиньки 13а может быть как напряжение питания, так и внутренний ИОН на 1.1В. Но в MicroCore для ардуино, будет также как и в ардуинах обычных - только Vcc.
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 16:20:28
BOB51
IDE делает *.hex файлы (как с бутлоадером, так и без него - "экспорт бинарного файла" - хотя... у micro core только один вариант выскочил...

).
Однако 13-ю пускать под Си... С моего взгляду... ЗВЕРСТВО...
Пользуйтесь ардуинко-про-мини (один Х... цена почти одинакова) или нанкой (отладочная платка с обратной связью через монитор IDE).
А в качестве симулятора вот сие:
https://www.sites.google.com/site/unoardusim/
выставив конфигурацию на UNO V3.

Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 17:41:13
NStorm
BOB51, прекрасно на Си пишется для любой AVRки. Хотя Ардуино - это вообще-то С++ + ядро. А пользоваться исключительно готовыми платками всегда и везде - тупиковый вариант arduino-style.
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 20:09:16
BOB51
Это свойство адуринки:
или
платка = DIP микросборка "черный ящик"
или
платка с конкретным МК и обработкой в соответствующем компиляторе.
Плюс еще два варианта, когда не готовая платка, а смаоделка применяется.
Все варианты равноценно применимы - то уж кто в чем больше удобства чуствует.

А вот относительно кристаллов с емкостью ПЗУ в 512 команд.... Все ж таки преимущество или за ассемблером или за профессиональным программистом (но никак не для начинающего после адуринки).

Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 20:24:19
Eddy_Em
Кусочно-линейная интерполяция. И ее
использование на микроконтроллере (поиск нужного интервала бисекцией довольно-таки неплохо ускоряет вычисления, если узлов много).
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 20:30:39
BOB51
Там еще нелинейность яркости светодиода от значения ШИМ выползет...

Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 20:38:28
Eddy_Em
BOB51, с чего бы? Если нормально подобрать частоту и не пытаться сделать 10000 градаций яркости, никаких нелинейностей быть не должно! По крайней мере, проверял фотодиодом с RC-интегратором линейность яркости светодиода, если его ШИМить дешевой китайской платкой на нувотоне 003. В районе 1-2% был косяк, но там, скорей всего, проблемы с округлением (даже осциллограф показал, что ширина импульса в этом случае плавает).
Кстати, насчет ШИМ: нет ли у кого на примете управляемой по USB шимилки светодиодных лент (вкл/выкл и восьмибитный ШИМ)? Лень разводить плату ради такой примитивной задачи.
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 20:59:50
NStorm
[uquote="BOB51",url="/forum/viewtopic.php?p=3933514#p3933514"]А вот относительно кристаллов с емкостью ПЗУ в 512 команд.... Все ж таки преимущество или за ассемблером или за профессиональным программистом (но никак не для начинающего после адуринки).

[/uquote]
Это всё миф. Вы же "голый Си" хорошо не знаете, сами где-то недавно писали в другой теме емнип, так зачем утверждать? Компилятор avr-gcc нынче куда умнее большинства асм-программистов начинающих. И даже убогий код на Си порой очень неплохо оптимизирует. А уже если знать Си, то возможностей дофига. Ах да, и начинающие после ардуинки далеко не все знают асм в принципе. Они его дольше учить будут куда и вникать после ардуино.
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 21:11:42
BlackKilkennyCat
Надо знать и то и то, на сегодняшней день. Хотя бы нормально читать ассемблер, ибо оптимизатор иногда выдаёт невесть что, и проконтролировать его - полезно.
А одурино потому и ардуино, что это немного иной класс. Любителю ардуино ассемблер необязателен. Даже знать о его существовании. И это, в какой-то степени хорошо: даёт возможность обычным людям что-то сделать для себя.
Плохо становится, когда они с таким багажом начинают не для себя, а как инженер.
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 21:20:36
NStorm
BlackKilkennyCat, ассемблеров много знать надо, а Си - один )
Я бы сказал так - знать Си надо. А ассемблер хотя бы в общий чертах понимать. Весь набор инструкций можно и знать даже для одной архитектуры, но со "словарем" в выхлоп компилятора Си поглядеть полезно часто, да. Хотя имхо и не совсем обязательно нынче. Ну а так в общем согласен.
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 21:25:49
BlackKilkennyCat
NStorm,Не зря же я уточнил - нормально читать

кроме того, искать баги, когда в си всё кажется хорошо, остаётся только там...
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 21:47:17
74LS00
[uquote="NStorm",url="/forum/viewtopic.php?p=3933235#p3933235"]analogWrite(0,0 ) , digitalWrite(0, LOW)[/uquote]
Даже если не использовать analogWrite это не одно и тоже, это ардуино.
Опорным и тиньки 13а может быть как напряжение питания, так и внутренний ИОН на 1.1В. Но в MicroCore для ардуино, будет также как и в ардуинах обычных - только Vcc.
А как же analogReference() DEFAULT, INTERNAL, или там пофиг ?
[uquote="BOB51",url="/forum/viewtopic.php?p=3933330#p3933330"]IDE делает *.hex файлы (как с бутлоадером, так и без него - "экспорт бинарного файла"
Пользуйтесь ардуинко-про-мини (один Х... цена почти одинакова)[/uquote]Я её поставлю именно для одной функции, основной контролер ещё одну задачу не вытянет. Даже у тиньки начался стробоскоп когда я выставил задержку 100. Возможно конденсатор решил бы проблему, но ну её нафик лотерею.
"Экспорт бинарного файла" это вот так:
Скетч использует 254 байт (24%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 2 байт (3%) динамической памяти, оставляя 62 байт для локальных переменных. Максимум: 64 байт.
�� 㤠���� ���� 㪠����� 䠩�.
Ошибка компиляции.
ардуино не умеет делать бинарник для тиньки, видимо дело как раз в загрузчике, без него сделать нельзя и отключить его тоже.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3933550#p3933550"]
BOB51, с чего бы? Если нормально подобрать частоту и не пытаться сделать 10000 градаций яркости, никаких нелинейностей быть не должно![/uquote]Нелинейность такова что при малом освещении, малое увеличение ШИМ или напряжение, сильнее увеличивает яркость светодиода. А после когда надо больше яркости, светодиод очень дубово реагирует на ШИМ, но в какойто момент светит слишком много.
Я не смог найти нужных градаций, у меня тупо нет регулируемой подсветки дома, а с одной лампочки толком не настроить, поэтому яркости там 2, с лампочкой 200вт и коробкой на лампочке. Ну а малые яркости от настольной слабенькой светодиодной ленты.
Не знаю какой спектр у ФР, но думаю на улице он выдаст больше чем от яркой лампы.
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 22:01:10
Eddy_Em
[uquote="74LS00",url="/forum/viewtopic.php?p=3933601#p3933601"]Нелинейность такова что при малом освещении, малое увеличение ШИМ или напряжение, сильнее увеличивает яркость светодиода. А после когда надо больше яркости, светодиод очень дубово реагирует на ШИМ, но в какойто момент светит слишком много[/uquote]
Тоже нагуглил, что первые и последние ~5% по заполнению почему-то вызывают нелинейность изменения яркости свечения светодиода.
Найти бы объяснение этому непонятному явлению!
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 22:16:10
NStorm
[uquote="74LS00",url="/forum/viewtopic.php?p=3933601#p3933601"]Даже если не использовать analogWrite это не одно и тоже, это ардуино.[/uquote]
И что, что ардуино? С чего вы решили, что не одно и тоже?
https://www.arduino.cc/reference/en/lan ... alogwrite/:
value: the duty cycle: between 0 (always off) and 255 (always on). Allowed data types: int.
Перевести, что значит "always off"? )
Ну и в исходники можно заглянуть
https://github.com/MCUdude/MicroCore/bl ... ring_pwm.c :
Код: Выделить всё
void analogWrite(uint8_t pin, uint8_t val)
{
...
// Handle off condition
if(val == 0)
{
turnOffPWM(pin); // Turn off PWM
digitalWrite(pin, LOW); // Set pin low
}
А как же analogReference() DEFAULT, INTERNAL, или там пофиг ?
А вот тут я ошибся. На MicroCore можно выставить ИОН 1.1В:
Код: Выделить всё
void analogReference(uint8_t mode)
{
if (mode == DEFAULT)
ADMUX &= ~(1 << REFS0); // Vcc as reference
else
ADMUX |= (1 << REFS0); // Internal 1.1V as reference
}
Добавлено after 2 minutes 20 seconds:
ардуино не умеет делать бинарник для тиньки, видимо дело как раз в загрузчике, без него сделать нельзя и отключить его тоже.
Не может оно не уметь. Иначе бы не шилось ничего. Дело видимо в путях. Где-то небось кириллица. Профиль пользователя в винде небось кириллицей написал. Ну или пробелы. И т.п.
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 22:16:25
Eddy_Em
[uquote="NStorm",url="/forum/viewtopic.php?p=3933623#p3933623"]Ну и в исходники можно заглянуть
https://github.com/MCUdude/MicroCore/bl ... ring_pwm.c :
Код: Выделить всё
void analogWrite(uint8_t pin, uint8_t val)
{
...
// Handle off condition
if(val == 0)
{
turnOffPWM(pin); // Turn off PWM
digitalWrite(pin, LOW); // Set pin low
}
[/uquote]
Жуть-то какая! Абдуринство во всей красе!!! Интересно: сколько тактов занимает эта операция? И зачем вообще абдуринщики вызывают analogWrite с таким жестоким оверхедом вместо непосредственного изменения одного-единственного регистра? Аналогично с digitalWrite!
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 22:45:46
74LS00
turnOffPWM(pin);
вот тут похоже и весь секрет, команда отключает ШИМ и без неё digitalWrite(pin, LOW) не работает. Не отключив генератор, подавать чтото на выход безтолку. Наверно поэтому у меня и не заработало.
Но поплясав с этим тоже ничего получается. Или при малой яркости малый ШИМ и минимальная подсветка и также при максимальной. Или оно всё тухнет и в полной темноте подсветки тоже нет. Видимо конфликт генератора с ногой, не могут они быть в двух режимах.
Так что пока оставлю как есть.
Не может оно не уметь. Иначе бы не шилось ничего. Дело видимо в путях. Где-то небось кириллица. Профиль пользователя в винде небось кириллицей написал. Ну или пробелы. И т.п.
Код: Выделить всё
G:\Programs\ProgramsD\0-Devel\arduino-1.8.13p
врятли дело в путях, просто для тиньки он делать неумеет, для своих умеет. Ошибка скорее всего в MicroCore, и попала она туда ещё с Core13
Я чтото пока не нашёл куда она в ардуину установилась.
Кстати ардуино в портативном варианте
Re: Помогите придумать формулу по графику
Добавлено: Пн ноя 30, 2020 22:59:36
NStorm