Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Разное » Линейное изменения яркости через ШИМ


Линейное изменения яркости через ШИМ

Сообщений 1 страница 25 из 25

1

Приветствую, други!
Вопрос у меня интересный, и думаю, многие над таким уже задумывались.

Известно, что яркость светодиода, при линейном изменении значений ШИМ - яркость светодиода.
Задался созданием моргульки некой, необходимо сделать 8-10 градация яркости, линейно изменяемых.
Конкретно мне нужна формула для расчета.

Допустим, имеем ШИМ, 256 градаций. Имеем светодиод, подключаемый к порту, нужно сделать Х градаций яркости, линейных.

0 - не горит
y1 - яркость 20%
y2 - яркость 40%
y3 - яркость 60%
y4 - яркость 80%
255 - яркость 100%

где Y1-y4 - значения ШИМ

как расчитать те самые значения, для линейного (в 6 ступеней) изменения яркости.

прошу перенести в ветку "вопросы-ответы"
Перенесу, когда тему закончите... а то потом её трудн будет найти ) [Модератор]

Отредактировано UN8JAB (2014-01-06 08:11:13)

0

2

Пока никого нет, держите - 3 сообщение сверху  и  7 сообщение сверху

Целая статья по этому поводу - здесь

Появятся в сети Аксакалы, получите более детальный ответ!

Загоняете формулу в Excel и берёте нужное Вам количество градаций.

Должно получиться что-то типа такого, только это таблица для sin и cos:
http://s7.uploads.ru/t/joqgW.jpg

Отредактировано sasha_1973 (2014-01-06 09:06:55)

0

3

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

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

0

4

UN8JAB написал(а):

0 - не горит
y1 - яркость 20%
y2 - яркость 40%
y3 - яркость 60%
y4 - яркость 80%
255 - яркость 100%

А чем вы собираетесь мерить яркость конкретной модели светодиода?
Или будите брать её из датащита и тогда введя кучу данных с кривых вы будите получать яркость? - этот метод как-то не реален)

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

зы: шим у нас линейный (в какой-то степени), а вот хар-ки светодиода - нет.

зы2: я вообще делал простой функционал, который скажем на выходе менялась общая яркость свечения, но относительно заданной яркости, при этом входное значения имело одну и туже составляющую. Т.е. на входе идет (например) всегда 0 до 255, а на выходе максимальный предел может быть 40 и затраченное время на изменение яркости получается всегда одно и тоже. Но как понимаю - это не ваша задача.

Отредактировано RDW (2014-01-06 12:17:10)

0

5

RDW написал(а):

шим у нас линейный (в какой-то степени), а вот хар-ки светодиода - нет.

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

4
16
36
64
100
144
196
256

по приведенным выше рекомендациям провел расчет для 8-ми степеней градации.

спаяю схему, проверю.

0

6

а исходник можно глянуть?

0

7

http://lightportal.at.ua/publ/dimmery/s … er/7-1-0-4

0

8

выкладываю код

тута

' MCU config
$regfile = "attiny85.dat"                                                       
$crystal = 8000000                                                           
' Port config
Config Portb.0 = Output                                                         
Config Portb.1 = Output                                                   
Config Portb.2 = Output                                                 
Config Portb.3 = Output                                                     
'Config Pinb.4 = Input                                                       
'Set Portb.4                                                                   
' Var Declare
Dim I As Byte                                                           
Dim J As Byte                                                             
Dim P1 As Byte                                                       
P1 = 0
Dim P2 As Byte                                                                 
Dim P3 As Byte                                                                 
Dim P4 As Byte                                                                 
Dim Pwm1 As Byte                                                         
Dim Pwm2 As Byte                                                           
Dim Pwm3 As Byte                                               
Dim Pwm4 As Byte                                                     
Dim Modes As Byte                                           
' Sub Declare
Declare Sub Pwms                                                       
Declare Sub Mod1                                         
Declare Sub Mod2                                                         
Do
For J = 0 To 15
Pwm1 = Lookup(j , Pwm1_led)
Pwm2 = 0
Gosub Pwms
Next J
Portb.1 = 1
Waitms 5
Portb.1 = 0
Portb.2 = 1
Waitms 5
Portb.2 = 0
Portb.3 = 1
Waitms 5
Portb.3 = 0
'Waitms 20
Loop
'----- data -----
Pwm1_led:
Data 0 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 238 , 243 , 251
'----- sub -----
Sub Pwms
If Pwm1 > 0 Then Portb.0 = 1
If Pwm2 > 0 Then Portb.1 = 1
If Pwm2 > 0 Then Portb.2 = 1
If Pwm2 > 0 Then Portb.3 = 1
For I = 0 To 255
If I > Pwm1 Then Portb.0 = 0
If I > Pwm2 Then Portb.1 = 0
If I > Pwm2 Then Portb.2 = 0
If I > Pwm2 Then Portb.3 = 0
Next I

End Sub

в ДАТА запихал значения градаций яркости, на которых пока остановился.
до значения 238 - представляет собой ряд чисел фибоначи.
Спасибо всем кто откликнулся :flag:

Схему светодиодного Диммера с лайтпортал'а видел, скачал, посмотрел.

ну.. я пока на своем остановился.

пояснения к исходникам - попытка сделать программный шим.

0

9

смысл, если есть аппаратный?

0

10

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

0

11

В общем закончил я свои мытарства с ШИМ'ом, вполне неплохо получилось.
Выбрал в итоге значения : 0 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , 144 , 233 , 238 , 243 , 255
Визуально выглядит довольно линейно, особенно если скорость переключения между двумя градациями не медленнее 100мс.
Как закончу устройство, постараюсь не забыть выложить все в "готовые устройства". Тему можно считать закрытой.

0

12

А я чот не доволен ШИМом, когда начинаешь его использовать на малых яркостях (близким к тлению) и с медленным переключением (в секунды). Выглядит это всё очень грубо.
Решил попробовать использовать алгоритм Брезенхэма, пока только понял как код сделать, а в реалии ещё не пробовал. Вещь весьма хороша тем, что она не ограничивается битностью (чем больше скорость, тем больше разрядность - тем плавнее переход). В общем надо пробовать.

0

13

RDW написал(а):

алгоритм Брезенхэма

а ссылку и/или наработки в студию  :flag:

UPDATE: сам нашел ТУТА

Отредактировано UN8JAB (2014-02-13 15:16:14)

0

14

Вообще поиском ищется (тем же гуглом), а если лень, то вот: http://trolsoft.ru/articles/bresenham-algo/

0

15

Так реализовано в профессиональных драйверах типа DM163, DM164.
Интересно попробовать на Баскоме, насколько ресурсоёмкий код получится.

0

16

там есть код упрощенной реализации, думаю будет не ресурсоёмко
я ща пока только код на VB накидал (для анализа), надо его про оптимизировать до простых переменных (типа байт, где можно)
по прикидкам, должно отлопать всего 1 таймер)

Отредактировано RDW (2014-02-13 17:56:58)

0

17

очень интересно будет посмотреть =) ждем, ждем... тему не закрываем =)

0

18

Попробовал на конец алгоритм Брезенхэма.
Что-то до меня вся картина осознания не доходила, пока в реальности не реализовал.
И так: Работает, но результат меня сразу скажу - разочаровал. Мало того, что Баском имеет другую точность вычисления против VB6 при тех же типах переменных (это всё капля в море, пока не критично), так в бинарном режиме управление светодиодом (на минимальной возможности яркости свечения) - невозможно, т.к. у светодиода нет инерционности (это не мотор или лампа накаливания). В этом как бы "Америку не открыл", но надежду питал. :) Чтобы иметь возможность получить плавность, надо ставить/подбирать ёмкости (для сглаживания) и даже при таком подходе, будет видна пульсация (т.е. минимальная граница яркости будет ограничена (довольно сильно)). Чтобы получить реально плавную регулировку, надо тупо ставить цифровой резистор (т.е. аналоговую, нормальную реализацию).

Ресурсоёмкость, как и думал - не затратно.

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

0

19

С конденсаторами ничего не выйдет, даже не пробуй. Светодиод нелинеен, поэтому получишь ход по напряжению всего в вольт от силы.(и вообще не стоит забывать, что светик- это светящийся стабилитрон, на них частенько и стабилизацию делают малых напряжений )
Шим и только ШИМ. Причем быстрый, килогерц в 60 (тогда глаза не вылазиют )) ).
Тебе гораздо проще будет взять что-то из серии 90PWM с 6ю каналами полноценного аппаратного ШИМа.
Или вообще не париться а воткнуть несколько тинек малоногих и отдавать им данные по яркости через любое удобное междумордие.

Отредактировано Skull (2014-02-17 01:14:15)

0

20

RDW написал(а):

И так: Работает, но результат меня сразу скажу - разочаровал.

Можете выложить код, хочу тоже попробовать?

0

21

Да, диод не линеен (в этом и проблема). Можно конечно поиграться ещё с "космическим" повышением частоты ШИМа, но кривую под диод придется закладывать (хлопотно, влом).

Вот код, у кого есть желание поиграться:

Код:
'$sim

$regfile = "attiny84.dat"
$crystal = 8000000
$hwstack = 56                                               '8
$swstack = 56                                               '16
$framesize = 56                                             '16

Led_r Alias Porta.5
Led_g Alias Porta.6
Led_b Alias Porta.7

' -= конфигурировние портов =-
Config Porta.5 = Output                                     ' Led Red
Config Porta.6 = Output                                     ' Led Green
Config Porta.7 = Output                                     ' Led Blue

' все светодиоды в 0
Reset Led_r
Reset Led_b
Reset Led_g

Const Tm1 = 65535
Config Timer1 = Timer , Prescale = 1024
On Timer1 Br_step_light
Timer1 = Tm1
Enable Timer1

Dim Br_err As Integer
Dim Br_bitsize As Byte
Dim Light As Byte
Dim Br_angle As Integer
Dim Br_step As Byte

Dim Fm As Byte                                              'режим свечения светодиода: min > max, max > min
Fm = 0

Light = 0                                                   ' установка яркости 0% до 100%
Br_bitsize = 254                                            ' 254 bits период повтора
Br_step = 0

Enable Interrupts

Do
   Waitms 1000                                              ' меням значение яркости 1 раз в секунду
   If Fm = 0 Then
      ' увеличение
      If Light < 5 Then                                     ' яркость до 5%
         Incr Light
      Else
         Fm = 1
      End If
   Else
      ' уменьшение
      If Light <> 0 Then
         Decr Light
      Else
         Fm = 0
      End If
   End If
Loop
End

' выполняется с частотой 7812,5 Hz / 254 bits = 30,76 fps
Br_step_light:
   Timer1 = Tm1
   If Br_step = 0 Then
      Br_angle = Light
      Br_angle = Br_angle * Br_bitsize
      Br_angle = Br_angle / 100
      Br_err = Br_bitsize / 2
   End If

   Br_err = Br_err - Br_angle
   If Br_err < 0 Then
      Br_err = Br_err + Br_bitsize
      Set Led_r
      Set Led_g
      Set Led_b
   Else
      Reset Led_r
      Reset Led_g
      Reset Led_b
   End If

   If Br_step > Br_bitsize Then
      Br_step = 0
   Else
      Incr Br_step
   End If
Return

0

22

RDW написал(а):

Вот код, у кого есть желание поиграться:

Спасибо, попробую по свободе.

0

23

Попробуйте  формулу :  Y=((X+15)^2)/256.
Только 8 бит мало для нее, минимум 9 битный режим Шим нужен. Тогда по идее яркость должна стать визуально линейной. (соответственно делить надо на количество значений разрядности)

Яркость , как и звук по идее люди воспринимают экспоненциально

Отредактировано Skull (2014-02-17 12:59:23)

0

24

RDW написал(а):

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

Рассвет это не только переход яркости, но и цветовой переход! И если смотреть при этом на солнце его яркость глазу кажется меньшей за счет поглощения атмосферой сине-зеленой части спектра.

0

25

Если есть у кого желание может такой штукой поиграться.

0


Вы здесь » Программирование ATMEL в BASCOM. » Разное » Линейное изменения яркости через ШИМ