![]() |
![]() |
#351 |
Administrator
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9824 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
delayMicroseconds() в прерывании будет работать
Так как эта функция не использует таймер |
![]() |
![]() |
![]() |
#352 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 ![]() |
![]()
Надо переделать Вашу программу для Дуе без библиотек. Я так понял, что алгоритм Вашей программы примерно такой (для одного канала):
1. сначала обзываем входной (детектор 0) и выходной пин (на триак). 2. Ставим уровень сигнала на триак = 0; 3. Нужно запустить какой-то таймер.. Видимо, из стандартных библиотек. 4. Функция прерывания: там одна в другой (первая по переднему фронту, после ее завершения вызывается вторая по заднему); 5. В основном теле обработка из сериал будет. Вопрос: у вас есть функция halfcycle() (там счетчик), не вижу где она вызывается. По алгоритму примерно всё верно? |
![]() |
![]() |
![]() |
#353 | |||
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Цитата:
Цитата:
PS. Настолько привык к CyberLib , что уже с трудом вспомнил как обращаться к цифровым пинам стандартными командами Arduino, еще раз спасибо Admin Последний раз редактировалось Bulatovor; 30.03.2014 в 21:22. |
|||
![]() |
![]() |
![]() |
#354 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 ![]() |
![]()
Хм, Bulatovor, вы заинтриговали меня) может быть мне тоже проще исправить данную библиотеку под Дуе? Это сложно?
|
![]() |
![]() |
![]() |
#355 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 ![]() |
![]()
Что принципиально нужно исправить, чтобы пользоваться данной библиотекой с Due? Это реальная задача?
|
![]() |
![]() |
![]() |
#356 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
В основном адресацию. Библиотека уже большая - для начала , чтоб работать с программой димера, достаточно исправить прямое обращение к пинам, Timer1 и Uart
|
![]() |
![]() |
![]() |
#357 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 ![]() |
![]()
Т.е. просто заменить эти команды на стандартные?
|
![]() |
![]() |
![]() |
#358 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Заменить библиотечные функции на стандартные -это если переписать программу диммера. Если переписывать библиотеку -то первое что нужно это мурзилка по контроллеру -порты, частоты, регистры
|
![]() |
![]() |
![]() |
#359 |
Junior Member
Регистрация: 30.03.2014
Сообщений: 12
Вес репутации: 0 ![]() |
![]()
Удалось исправить собственную программу, чему я несказанно рад. Если кому понадобится, вот код с пояснениями:
Код:
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;//Записываем очередной символ в строку; } } } ![]() |
![]() |
![]() |
![]() |
#360 |
Junior Member
Регистрация: 17.04.2014
Сообщений: 1
Вес репутации: 0 ![]() |
![]()
Добрый день!
Сейчас очень интересует Ваша разработка, но есть пара вопросов... Сразу извиняюсь, возможно где-то в теме есть ответы, но 36 страниц... Интересует насколько универсален ваш диммер. Есть 4 вида нагрузок: - Блок питания на 12 вольт и светодиодная лента. - Люминисцентные лампы с электромагнитными ПРА со стартерами и с электронными ПРА. - Металогалогеновая лампа с балластом. - Нагревательный прибор (маломощный). |
![]() |
![]() |
![]() |
Здесь присутствуют: 20 (пользователей: 0 , гостей: 20) | |
|
|