Вопрос такой как написать программу для 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
ИМХО частота для светодиодов, чем выше, тем лучше, надо только учитывать потолок частоты выбранных ключей. Там ещё есть проблема с нелинейной зависимостью яркости от скважности. Если всё это опустить то:
Code
Mode1: FOR a=0 TO 255 STEP 1 PWM red,a,8 NEXT a HIGH red DELAYMS 3000
FOR c=255 TO 0 STEP -1 PWM blu,c,8 NEXT c LOW blu DELAYMS 3000
FOR b=0 TO 255 STEP 1 PWM gre,b,8 NEXT b HIGH gre DELAYMS 3000
FOR a=255 TO 0 STEP -1 PWM red,a,8 NEXT a LOW red DELAYMS 3000
FOR c=0 TO 255 STEP 1 PWM blu,c,8 NEXT c HIGH blu DELAYMS 3000
FOR b=255 TO 0 STEP -1 PWM gre,b,8 NEXT b LOW gre DELAYMS 3000 GOTO mode1
-это плавное изменение цвета поскольку, при применении одновременно 3-х каналов программного шима максимальное значение скважности будет не более 1/3, у меня в один момент используется только 1 канал. остальные два висят либо в еденице, либо в нуле. Найденное на халяву, исчезает мгновенно, лишь сто раз заработанное всегда будет твоим.
Спасибо будем разбираться, просто есть исходники на асемблере, но внем я не понимаю.
Добавлено (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% яркости любого цвета и белого в тч.
Говоря по простому – ШИМ это соотношение времени включенного и выключенного состояния светодиода. Переключение происходит на высокой частоте и незаметно для зрительного восприятия.
Все верно для реализации програмного ШИМа требуется 1 таймер, настроенный на равные промежутки. Расчет простой. Частота(невидимая для глаза, больше 25 гц) * количество уровней яркости. Предположим частота кварца 20мгц, кол-во уровней 256. Установим переполнение таймера каждые 50 мкс(20 000 гц). Считаем 20000/256=78,125 гц. Вполне достаточно. А далее как в параллельной ветке про Регулятор яркости на pic. Только без привязки к фазе. Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
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
Выполняет функции: 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
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