RGB -ленты - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: demanik 
Форум Picbasic.ru » Программирование МК » Proton PicBasic » RGB -ленты
RGB -ленты
tolyan249 Дата: Вс, 04.11.2012, 12:28  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Вопрос такой как написать программу для RGB-ленты на PIC12F629,если нет аппаратных шим, как програмно организовать програмный шим. какая частота должна быть,и ширина имульса как должна меняться ,может у кого какие наработки есть .

Спасибо .

Добавлено (04.11.2012, 12:28)
---------------------------------------------
Теория управления RGB светодиодами с помощью ШИМ.

Теперь кратко разберемся в теории как управляется RGB светодиод и что такое в принципе RGB. RGB-светодиод, как мы выяснили, это три близко расположенных светодиода под одной линзой: красный – Red, зелёный – Green и синий – Blue, отсюда и название. Как известно, сочетанием этих трёх цветов можно получить любой другой цвет. Обычно эти три светодиода имеют один общий вывод. В нашем случае плюсовой, т.е. общий анод. Яркость свечения светодиода зависит от протекающего через светодиод тока.

Для регулировки протекающего тока используется ШИМ. Что такое ШИМ? Широтно-импульсная модуляция (ШИМ) – есть импульсный сигнал постоянной частоты и переменной скважности, то есть отношения длительности импульса к периоду его следования. С помощью задания скважности (длительности импульсов) можно менять яркость светодиода.

Говоря по простому – ШИМ это соотношение времени включенного и выключенного состояния светодиода. Переключение происходит на высокой частоте и незаметно для зрительного восприятия.
Теперь поговорим о смене цвета. Микроконтроллер каждому из основных цветов – красный, зеленый и синий может установить 256 уровней яркости (от полностью выключенного до полностью включенного), а это в свою очередь позволяет сделать 256*256*256=16777216 комбинаций оттенков.


если знаешь,помоги.
Сообщение отредактировал tolyan249 - Вс, 04.11.2012, 12:30
ЯНДЕКС Дата: 04.11.2012
DAY Дата: Вс, 04.11.2012, 13:24  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Начал соображать
Сообщений: 21
Репутация: 0   ±
Замечания:   ±
На сайте с 09.03.2011

Статус: Offline

ИМХО частота для светодиодов, чем выше, тем лучше, надо только учитывать потолок частоты выбранных ключей.
Там ещё есть проблема с нелинейной зависимостью яркости от скважности.
Если всё это опустить то:



-это плавное изменение цвета
поскольку, при применении одновременно 3-х каналов программного шима максимальное значение скважности будет не более 1/3, у меня в один момент используется только 1 канал. остальные два висят либо в еденице, либо в нуле.


Найденное на халяву, исчезает мгновенно, лишь сто раз заработанное всегда будет твоим.
tolyan249 Дата: Вс, 04.11.2012, 15:38  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

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

Добавлено (04.11.2012, 15:35)
---------------------------------------------
ed1 EQU 0
Led2 EQU 1
Led3 EQU 2
;***** Variables ************
CBLOCK 0x20
cnt ;счётчик
cLed1 ; Уровень яркрсти Led1
cLed2 ; Уровень яркрсти Led2
cLed3 ; Уровень яркрсти Led3
ENDC
;Инициализация и т. д.
; (всякое разное)
;Загрузка начального свечения.
MOVLW 0x40
MOVWF cLed1
MOVLW 0x80
MOVWF cLed2
MOVLW 0xC0
MOVWF cLed3
;Основной цикл
mainloop
movf cLed1,0 ;читаем уровень яркости Led1
subwf cnt,0 ;вычитаем из счётчика
btfss status,0 ;если флаг переноса установлен - жжом
b led1off ;Иначе гасим Led1
BCF GPIO,Led1 ;Зажигаем Led1
b led1skip
led1off
BSF GPIO,Led1 ;Гасим Led1
led1skip
movf cLed2,0 ;читаем уровень яркости Led2
subwf cnt,0 ;вычитаем из счётчика
btfss status,0 ;если флаг переноса установлен - жжом
b led2off ;Иначе гасим Led2
BCF GPIO,Led2 ;Зажигаем Led2
b led2skip
led2off
BSF GPIO,Led2 ;Гасим Led2
led2skip
movf cLed3,0 ;читаем уровень яркости Led3
subwf cnt,0 ;вычитаем из счётчика
btfss status,0 ;если флаг переноса установлен - жжом
b led3off ;Иначе гасим Led3
BCF GPIO,Led3 ;Зажигаем Led3
b led3skip
led3off
BSF GPIO,Led3 ;Гасим Led3
led3skip
incf cnt
b mainloop ;зациклились :-

Добавлено (04.11.2012, 15:38)
---------------------------------------------
у китаянцев это сделано так , в контролерах RGB лент - период 12 милисек , разбит на 16 шагов , до полного заполнения ...и нормально это выглядит от 0 до 100% яркости любого цвета и белого в тч.


если знаешь,помоги.
DAlexV Дата: Вс, 04.11.2012, 15:39  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Разобрался
Сообщений: 691
Репутация: 17   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Quote (tolyan249)
Говоря по простому – ШИМ это соотношение времени включенного и выключенного состояния светодиода. Переключение происходит на высокой частоте и незаметно для зрительного восприятия.

Все верно для реализации програмного ШИМа требуется 1 таймер, настроенный на равные промежутки. Расчет простой. Частота(невидимая для глаза, больше 25 гц) * количество уровней яркости. Предположим частота кварца 20мгц, кол-во уровней 256. Установим переполнение таймера каждые 50 мкс(20 000 гц). Считаем 20000/256=78,125 гц. Вполне достаточно. А далее как в параллельной ветке про Регулятор яркости на pic. Только без привязки к фазе.


Будьте оригинальны - не повторяйте чужих ошибок !!!!
Пишу только на Рыбе (SwordFish). Другую пищу не предлагать, на шерсть влияет :)
tolyan249 Дата: Вт, 06.11.2012, 08:30  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 166
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Вот еще код тоже на асемблере

;************************************************* ******************************
;MAIN PWM PROGRAM(1)
;************************************************* ******************************
TOP CALL T0_TOP
MOVWF T0
MOVWF K0
CALL T1_TOP
MOVWF T1
MOVWF K1

MOVF X, W
MOVWF COEF

CLRF PCLATH
INCF TABLE

CHECK_TBL MOVF TABLE, W
SUBLW 0X2C
BTFSC STATUS, Z
CLRF TABLE

;&&&&&&&&&&& KEYS &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&
; CHECK KEY MODE

MODE BTFSC GPIO, D'3';
GOTO VEL_DOWN

DEBOUNCE_8 BTFSS GPIO, D'3'
GOTO DEBOUNCE_8
CLRF PCLATH
MOVF SMOOTH, W
SUBWF PCL, F
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; CHECK VELOCITY
VEL_DOWN BTFSC GPIO, D'4'
GOTO VEL_UP
DBNC1 BTFSS GPIO, D'4'
GOTO DBNC1
GOTO MINUS

VEL_UP BTFSC GPIO, D'5'
GOTO SAVETIME
DBNC2 BTFSS GPIO, D'5'
GOTO DBNC2
GOTO PLUS

PLUS MOVLW 0X14
ADDWF X

GOTO SAVETIME

MINUS MOVLW 0X14
SUBWF X
GOTO SAVETIME

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; PWM
SAVETIME DECF COEF

CLRF GPIO ; TURN OFF PORTS

CHECK_0 MOVF T0, W
SUBLW 0X00 ;CHECK BY 0
BTFSC STATUS, Z
GOTO CHECK_1

CYCLE0 DECFSZ T0, F ;CYCLE 0 INTERVAL
GOTO CYCLE0

CHECK_1 MOVF T1, W
SUBLW 0X00 ;CHECK BY 0
BTFSC STATUS, Z
GOTO CHECKING

MOVF GPIO_1, W
MOVWF GPIO

CYCLE1 DECFSZ T1, F ; CYCLE 1 INTERVAL
GOTO CYCLE1

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; VELOCITY
CHECKING MOVF COEF, W
SUBLW 0X00
BTFSC STATUS, Z
GOTO TOP

REWRITE MOVF K0, W
MOVWF T0
MOVF K1, W
MOVWF T1
GOTO SAVETIME

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
; A TABLE OF PWM
ORG 0X100
T0_TOP
MOVF TABLE, W
NOP
BSF PCLATH, D'0'
ADDWF PCL, F
DT 0X00 ;1
DT 0X0C ;2
DT 0X18 ;3
DT 0X24 ;4
DT 0X30 ;5
DT 0X3C ;6
DT 0X48 ;7
DT 0X54 ;8
DT 0X60 ;9
DT 0X6C ;10
DT 0X78 ;11
DT 0X84 ;12
DT 0X90 ;13
DT 0X9C ;14
DT 0XA8 ;15
DT 0XB4 ;16
DT 0XC0 ;17
DT 0XCC ;18
DT 0XD8 ;19
DT 0XFC ;20
DT 0XFC ;21
DT 0XFF ;22

DT 0XFC ;22
DT 0XF0 ;21
DT 0XE4 ;20
DT 0XD8 ;19
DT 0XCC ;18
DT 0XC0 ;17
DT 0XB4 ;16
DT 0XA8 ;15
DT 0X9C ;14
DT 0X90 ;13
DT 0X84 ;12
DT 0X78 ;11
DT 0X6C ;10
DT 0X60 ;9
DT 0X54 ;8
DT 0X48 ;7
DT 0X3C ;6
DT 0X30 ;5
DT 0X24 ;4
DT 0X18 ;3
DT 0X0C ;2
DT 0X00 ;1

ORG 0X200
T1_TOP
MOVF TABLE, W
BCF PCLATH, D'0'
BSF PCLATH, D'1'
ADDWF PCL, F
DT 0XFC ;22
DT 0XF0 ;21
DT 0XE4 ;20
DT 0XD8 ;19
DT 0XCC ;18
DT 0XC0 ;17
DT 0XB4 ;16
DT 0XA8 ;15
DT 0X9C ;14
DT 0X90 ;13
DT 0X84 ;12
DT 0X78 ;11
DT 0X6C ;10
DT 0X60 ;9
DT 0X54 ;8
DT 0X48 ;7
DT 0X3C ;6
DT 0X30 ;5
DT 0X24 ;4
DT 0X18 ;3
DT 0X0C ;2
DT 0X00 ;1

DT 0X00 ;1
DT 0X0C ;2
DT 0X18 ;3
DT 0X24 ;4
DT 0X30 ;5
DT 0X3C ;6
DT 0X48 ;7
DT 0X54 ;8
DT 0X60 ;9
DT 0X6C ;10
DT 0X78 ;11
DT 0X84 ;12
DT 0X90 ;13
DT 0X9C ;14
DT 0XA8 ;15
DT 0XB4 ;16
DT 0XC0 ;17
DT 0XCC ;18
DT 0XD8 ;19
DT 0XFC ;20
DT 0XFC ;21
DT 0XFF ;22

Выполняет функции:
8. Плавное включение и выключение красных светодиодов с регулированием скорости плавности
9. Плавное включение и выключение зеленых светодиодов с регулированием скорости плавности
10. Плавное включение и выключение синих светодиодов с регулированием скорости плавности
11. Плавное включение и выключение красных и зеленых светодиодов с регулированием скорости плавности
12. Плавное включение и выключение красных и синих светодиодов с регулированием скорости плавности
13. Плавное включение и выключение зеленых и синих светодиодов с регулированием скорости плавности
14. Плавное включение и выключение всех светодиодов с регулированием скорости плавности
15. Продолжение следует...

Добавлено (06.11.2012, 08:30)
---------------------------------------------
Вот еще нашел на просторах интернета.

Dim R_Delay as Word
Dim G_Delay as Word
Dim B_Delay as Word

Dim Temp as Word

Dim R_Loops as Word
Dim G_Loops as Word
Dim B_Loops as Word

Dim R_Max As Word
Dim G_Max As Word
Dim B_Max As Word

Dim TimeScale as Word
Dim Max_Time as Word

Dim Last as Word
Dim Percent as Word

DIM RND1 as Word
Dim RND2 as Word

Dim DTemp as Dword

Symbol B = PORTA.1
Symbol G = PORTA.2
Symbol R = PORTA.3

DEVICE = 16F877A
XTAL = 4
;--------------------------------------------------------

;--------------------------------------------------------

CONFIG XT_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CPD_OFF, CP_OFF , DEBUG_OFF

ALL_DIGITAL = TRUE

SEED $0345

TRISB = %11111111

TRISA = %00000000
PORTA = $FF

R_Max = 250 ' Adjust so that the proper color spectrum is shown
G_Max = 102 '
B_Max = 100 '

TimeScale = 3500 ' Controls the rate in which the colors change
' (Note: Max Brightness control will modify time!)

R_Loops = TimeScale / R_Max ' The timescale provides the number of loops
G_Loops = TimeScale / G_Max ' for each display of a new color and to
B_Loops = TimeScale / B_Max ' ensure best performance, each individual color
' loop is modified to fit into the timescale selected
R_Delay = R_Max ' Set values to known amounts
G_Delay = G_Max
B_Delay = B_Max

If R_Max > G_Max and R_Max > B_Max Then Max_Time = R_Max ' Also ensures maximum
If G_Max > R_Max and G_Max > B_Max Then Max_Time = G_Max ' refresh rate depending
If B_Max > R_Max and B_Max > G_Max Then Max_Time = B_Max ' on user settings

Main:

RND1 = Random ' Produce a random number

Select RND1 ' Depending on the value produced
Case 0 To 10000 ' will control the color flow
Goto Red_Up
Case 9999 To 20000
Goto Red_Down
Case 19999 To 30000
Goto Green_Up
Case 29999 To 40000
Goto Green_Down
Case 39999 To 50000
Goto Blue_Up
Case 49999 To 60000
Goto Blue_Down
EndSelect

Goto Main ' If the value was >60000 then get a new one

Red_Up: ' Increase the amount of red

If R_Delay = R_Max Then Goto Main

For R_Delay = 0 To R_Max

For Temp = 0 To R_Loops
R = 1
Delayus R_Delay
R = 0
Delayus Max_Time - R_Delay
G = 1
Delayus G_Delay
G = 0
Delayus Max_Time - G_Delay
B = 1
Delayus B_Delay
B = 0
Delayus Max_Time - B_Delay
Next

Next

R_Delay = R_Max

Goto Main

Red_Down: ' Decrease the amount of red
If R_Delay = 0 Then Goto Main

For R_Delay = R_Max To 0 Step -1

For Temp = 0 To R_Loops
R = 1
Delayus R_Delay
R = 0
Delayus Max_Time - R_Delay
G = 1
Delayus G_Delay
G = 0
Delayus Max_Time - G_Delay
B = 1
Delayus B_Delay
B = 0
Delayus Max_Time - B_Delay
Next

Next

R_Delay = 0

Goto Main


Green_Up: ' Increase the amount of green

If G_Delay = G_Max Then Goto Main

For G_Delay = 0 To G_Max

For Temp = 0 To G_Loops
R = 1
Delayus R_Delay
R = 0
Delayus Max_Time - R_Delay
G = 1
Delayus G_Delay
G = 0
Delayus Max_Time - G_Delay
B = 1
Delayus B_Delay
B = 0
Delayus Max_Time - B_Delay
Next

Next

G_Delay = G_Max

Goto Main


Green_Down: ' Decrease the amount of green

If G_Delay = 0 Then Goto Main

For G_Delay = G_Max To 0 Step -1

For Temp = 0 To G_Loops
R = 1
Delayus R_Delay
R = 0
Delayus Max_Time - R_Delay
G = 1
Delayus G_Delay
G = 0
Delayus Max_Time - G_Delay
B = 1
Delayus B_Delay
B = 0
Delayus Max_Time - B_Delay
Next

Next

G_Delay = 0

Goto Main


Blue_Up: ' Increase the amount of blue

If B_Delay = B_Max Then Goto Main

For B_Delay = 0 To B_Max

For Temp = 0 To B_Loops
R = 1
Delayus R_Delay
R = 0
Delayus Max_Time - R_Delay
G = 1
Delayus G_Delay
G = 0
Delayus Max_Time - G_Delay
B = 1
Delayus B_Delay
B = 0
Delayus Max_Time - B_Delay
Next

Next

B_Delay = B_Max

Goto Main


Blue_Down: ' Decrease the amount of blue

If B_Delay = 0 Then Goto Main

For B_Delay = B_Max To 0 Step -1

For Temp = 0 To B_Loops
R = 1
Delayus R_Delay
R = 0
Delayus Max_Time - R_Delay
G = 1
Delayus G_Delay
G = 0
Delayus Max_Time - G_Delay
B = 1
Delayus B_Delay
B = 0
Delayus Max_Time - B_Delay
Next

Next

B_Delay = 0

Goto Main

Прикрепления: 8591644.jpg(57Kb)


если знаешь,помоги.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » RGB -ленты
Страница 1 из 11
Поиск: