Помогите наладить проэкт ШИМ регулировки яркости освещения с плавным включением и выключением. Не работает ни в Протеусе, ни в железе. Суть проэкта: При включении питания лампа плавно разгорается с 0% ШИМ до выставленной регулятором яркостив течении 2-3 сек. Яркость увеличевается не с линейной зависимостью, а с логарифмической. Медленное начало, и быстрое завершение, так как зависимость между потребяемой лампой энергией, и выдачей освещения так-же не линейна. Затем лампа горит с яркостью выставленной регулятором. В любой момент яркость можна изменить. После выключения питания, схема продолжает работать так как прежде пристегнула себя резервным питанием. Это необходимо для завершения процесса медленного выключения. После чего схема отключается от резервного питания, и обесточивается.
Dim N As Byte ' N переменная цикла Dim Nastr As Byte ' Nastr переменная настройки регулятрора яркости Dim NastrOld As Byte ' NastrOld переменная хранения промежуточных ' настроек регулятрора яркости Dim Shim As Byte ' Шим Dim Shim1 As Word ' Для хранения предварительных вычислений
For N = 0 To Nastr ' Начало цикла наращивания ШИМ с 0% до положения регулятора Shim1 = N * N / 255 ' Увеличиваем ШИМ с логарифмической зависимостью y = x^3+1 ' медленное начало увеличения яркости ' и параболическое ускорение увеличение яркости Shim1 = Shim1 * N / 255 +1 ' N*N*N/65024 +1 разбиваем на несколько частей Shim = Shim1 ' Присваеваем вычесленное значение HPWM 1,Shim,1000 ' Генирируем ШИМ If VYKL = 0 Then Nastr = Shim: GoTo Spad: ' Если выключатель выключен ' то идем на плавное затухание DelayMS 20 ' Пауза определяющая плавность ' процесса наростания яркости 2-3 сек
Next ' Повторяем по кругу
'--------------Основной режим освещения - Контроль регулятора-----------------
Repeat ' Начало цикла Nastr = ADIn REG ' Считываем положение регулятора Nastr = Nastr * 9 / 10 + 25 ' Масштабируем измерения регулировки в ' приделах 10%-100%
If NastrOld <> Nastr Then HPWM 1,Nastr,1000 ' Если регулировка изменилась ' то изменить и ШИМ NastrOld = Nastr ' Обновить прежнее значение настройки DelayMS 20 ' Пауза Until VYKL = 0 ' Выйти из цикла при выключении
Spad: For N = Nastr To 0 Step -1 ' Начало цикла HPWM 1,N,1000 ' Генирируем ШИМ If VYKL = 1 Then GoTo Start: ' Если выключатель включился ' то идти на плавное включение DelayMS 80 ' Пауза длительности затухания Next
Low PIT ' Выключаем подтяжку резервного питания
GoTo Start: ' Переход на готовность к включению End
Модель в Протэусе не получается выложить. Пишет недопустимый формат изображения.
Сообщение отредактировал
Bоnus - Ср, 14.09.2011, 19:03
Большое спасибо Иван за помощь! Программа заработала. Было-бы интерестно узнать в чем заключалась ошибка. Одноако появились еще две проблеммы. Первая : При Dutycycle равном 0 (PWM=0%)ситуация не такая идеальная как описанно здесь http://www.terrarus.ucoz.ru/proton_....wm.html На выходе ШИМа (CCP1) GPIO.2 нет чистого нуля. Осцилограф показал довольно частые всплески которые не дают погаснуть светодиоду. Кстати в вертуальном осцилографе Протеуса они тоже присутствуют. Как от них избавится? Пробовал После отработки Шима переключать GPIO.2 с выхода на вход TRISIO = %00001101. Не помогло. Low GPIO.2 тоже не помогло. Здесь http://www.terrarus.ucoz.ru/proton_....wm.html В примечание 1 написанно что значение Dutycycle равное максимальному предельному значению 255 лучше не использовать, а ограничиться максимальным значением равным 254, так как при значениее Dutycycle = 255 выходной сигнал импульсной последовательноти PWM иногда может быть нестабилен. Так может быть по этой же причине и при минимальном значении Dutycycle = 0 сигнал тоже не стабилен. Но как тогда быть? Ведь от него нельзя отказатся. Должен же быть способ перевода ШИМ в полный ноль.
Первое, что я заметил. - CCP1CON = %00001100 ' Настройки ШИМ. Если стоит эта строчка, то на выходе ШИМ постоянно идет ШИМ сигнал. Возможно это только в протеусе, а в железе все будет нормально.
Второе, собственно почему и не работал код.
Вот эта строчка Until VYKL = High
Здесь Вы хотите проверить не сидит ли на выводе высокий уровень. Нужно написать Until VYKL = 1, потому что High - это директива которая устанавливает в высокое логическое состояние порт или бит порта.
If the pulse width value is greater than the period the assigned PWM pin(s) will remain unchanged. если длительность импульса ШИМ больше периода ШИМ, вывод ССР не будет иметь низкий уровень, на выходе получаем стабильный 1
Мне показалось что эта фраза переводится несколько по иному: Если значение ширины импульса больше периода, то-есть значение ШИМ даже меньше 0, и образно говоря отрецательное, то ШИМ при этом не меняется, а остается прежним (предидущее значение)
Quote (vv)
то: при CCPR1L = %00000000 на выходе будет стабильный 0
Так как-же всетаки на выходе добится стабильного нуля?