![]() |
|
|
#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 вольт и светодиодная лента. - Люминисцентные лампы с электромагнитными ПРА со стартерами и с электронными ПРА. - Металогалогеновая лампа с балластом. - Нагревательный прибор (маломощный). |
|
|
|
![]() |
| Здесь присутствуют: 16 (пользователей: 0 , гостей: 16) | |
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|