30.03.2014, 18:54 | #351 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
delayMicroseconds() в прерывании будет работать
Так как эта функция не использует таймер |
30.03.2014, 20:39 | #352 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
Надо переделать Вашу программу для Дуе без библиотек. Я так понял, что алгоритм Вашей программы примерно такой (для одного канала):
1. сначала обзываем входной (детектор 0) и выходной пин (на триак). 2. Ставим уровень сигнала на триак = 0; 3. Нужно запустить какой-то таймер.. Видимо, из стандартных библиотек. 4. Функция прерывания: там одна в другой (первая по переднему фронту, после ее завершения вызывается вторая по заднему); 5. В основном теле обработка из сериал будет. Вопрос: у вас есть функция halfcycle() (там счетчик), не вижу где она вызывается. По алгоритму примерно всё верно? |
30.03.2014, 21:08 | #353 | |||
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
Цитата:
Цитата:
Цитата:
PS. Настолько привык к CyberLib , что уже с трудом вспомнил как обращаться к цифровым пинам стандартными командами Arduino, еще раз спасибо Admin Последний раз редактировалось Bulatovor; 30.03.2014 в 21:22. |
|||
30.03.2014, 21:23 | #354 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
Хм, Bulatovor, вы заинтриговали меня) может быть мне тоже проще исправить данную библиотеку под Дуе? Это сложно?
|
30.03.2014, 21:51 | #355 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
Что принципиально нужно исправить, чтобы пользоваться данной библиотекой с Due? Это реальная задача?
|
30.03.2014, 22:19 | #356 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
В основном адресацию. Библиотека уже большая - для начала , чтоб работать с программой димера, достаточно исправить прямое обращение к пинам, Timer1 и Uart
|
30.03.2014, 22:23 | #357 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
Т.е. просто заменить эти команды на стандартные?
|
30.03.2014, 23:28 | #358 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
Заменить библиотечные функции на стандартные -это если переписать программу диммера. Если переписывать библиотеку -то первое что нужно это мурзилка по контроллеру -порты, частоты, регистры
|
30.03.2014, 23:54 | #359 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
Удалось исправить собственную программу, чему я несказанно рад. Если кому понадобится, вот код с пояснениями:
Код:
String Voltage = "";//Строка общения с Serial; int Ac_Load = 3;//Пин нагрузки; int Dimming = 999;//Уровень яркости (мб любой) 0 - min, 999 - max; boolean Marker = false;//Маркер того, прошла ли функция прерывания ZC (ZeroCross); unsigned long currentM = micros();//Счётчик микросекунд (текущее значение); unsigned long previousM = 0;//Предыдущее значение счетчика микросекунд; void setup() { Serial.begin(9600);//Инициализация Serial; pinMode(Ac_Load, OUTPUT);// Устанавливаем AC Load пин как вывод; attachInterrupt(2, ZC, RISING);//Функция внешнего прерывания ZC (ZeroCross) на пин 2; } void ZC(){ Marker = true;//Маркер того, что фунция прошла; previousM = currentM;//Приравнивает предыдущее значение счетчика к текущему (начинаем отсчет); } void loop() { currentM = micros(); //Время оключения: В сети 50Гц, одна волна: 1/50=20мс; Одна полуволна 10мс; (10мс-10мкс)/999=10мкс; int Dimtime = (10*(999-Dimming)); //Если маркер больше нуля и разница между текущим и предыдущим значением больше времени отключения if ((Marker == true) && ((currentM - previousM) > Dimtime)) {digitalWrite(Ac_Load, HIGH);//Открываем симистор; if ((currentM - previousM) > (Dimtime+10))//Через 10мкс закрываем симистор; {digitalWrite(Ac_Load, LOW);//Закрываем симистор; Marker = 0;//Возвращаем маркер в исходное состояние; } } while (Serial.available() > 0)//Цикл приема данных с Serial {char c = Serial.read();//Записываем посимвольно данные из Serial$ if (c == ' ')//Если в конце пробел, то заканчиваем принятие строки; {Serial.println(Voltage);//Выводим в Serial всю строку; Dimming = Voltage.toInt();//Переводим строку в уровень яркости (integer); Voltage = "";//Обнуляем строку; } else {Voltage += c;//Записываем очередной символ в строку; } } } |
17.04.2014, 14:31 | #360 |
Junior Member
Регистрация: 17.04.2014
Сообщений: 1
Вес репутации: 0 |
Re: Многоканальный Dimmer, работающий в фоновом режиме
Добрый день!
Сейчас очень интересует Ваша разработка, но есть пара вопросов... Сразу извиняюсь, возможно где-то в теме есть ответы, но 36 страниц... Интересует насколько универсален ваш диммер. Есть 4 вида нагрузок: - Блок питания на 12 вольт и светодиодная лента. - Люминисцентные лампы с электромагнитными ПРА со стартерами и с электронными ПРА. - Металогалогеновая лампа с балластом. - Нагревательный прибор (маломощный). |
Здесь присутствуют: 64 (пользователей: 0 , гостей: 64) | |
|
|