Перейти к содержанию

    

X10. Наконец - то получилось.

А оказалось что DRS516 стал по каким - то причинам глухим. Купил новый, подключил - заработало!

 

Схема передающей части.

ntzoyni3p.jpg

Трансформатор от какой - то вч-шняги. Это некритично. Индуктивность 1мГн.

 

Zero_Cross. ntzrezx2r.jpg

 

Работает на 2 внешних прерывания AT91sam7s 256. Дело в том, что процессор должен реагировать на оба фронта сигнала, а настроить можно только один. В итоге удалось вытянуть Zero_Cross из DRS - 516 и сравнить осциллографом.

nu04khvg6.jpg

Вот что получилось:

ntzuev2j9.jpg

 

В разработках я опирался на AN236 от Микрочип. Софт делал строго по протоколу. Помог осциллограф DSO-5200A. У него буфер 1M, что позволило записать всю передаваемую от DRS - 516 посылку и ее проанализировать. Если отойти от протокола, прграмму можно сильно упростить.

 

Софт. Настраиваем внешние прерывания:

//Внешнее прерывание
   *AIC_SMR30   =   (1 << 5) |(1 << 6)| 7;      //Задний фронт(5), передний фронт (5,6)
   *AIC_SVR30   =   (unsigned long) EXT0_int;   //7-й уровень пиоритета (IRQ0) Стр.165.   PA20, P3.4
   *AIC_SMR31   =   (1 << 5) | 6;            //Задний фронт(5), передний фронт (5,6)
   *AIC_SVR31   =   (unsigned long) EXT1_int;   //7-й уровень пиоритета (IRQ1) Стр.165. PA30, P2.6
   *AIC_IECR   =   0xC0000000;               //Разрешить внешнее прерывание

 

И пишем их код:

__irq void EXT0_int(void) {         //Внешнее прерывание. Начало и остановка измерений АЦП
   ZeroCross = 1;               //
__irq void EXT1_int(void) {ZeroCross = 1; *AIC_EOICR = 1;}

 

Сам обработчик X10:

extern int ZeroCross;

//Функции X10
void Pulse1ms(void);                    //Передача импульса в сеть
void Pulse1ms1(void);                    //Генератор импульса 120КГц 1мс
void Pause1ms(void);                    //Генератор паузы 1мс
void WaitZC    (void);                        //Ожидание события - перехода синосоиды 50Гц через 0.
void SendStart(void);                    //Передача старт - условия: три единичные посылки 1мс и пауза 1мс
void Trnsfer (unsigned char DATA, int Bits); //Педача данных длиной Bits в сеть

void SendX10Command (int House, int Unit, int Command){//Педача команды в сеть 
        SendStart();          //Передаем посылку 1110
        Trnsfer(House,4);    //House. 0110 = A
        Trnsfer(Unit,5);      //Unit Addresses = 00110 = 1
        SendStart();          //Передаем посылку 1110
        Trnsfer(House,4);    //House. 0110 = A
        Trnsfer(Unit,5);      //Unit Addresses = 00110 = 1
        WaitZC();            //Пропускаем 6 переходов 
        WaitZC();            //через 0.
        WaitZC();            //
        WaitZC();            //
        WaitZC();            //
        WaitZC();            //
        SendStart();          //Первый раз
        Trnsfer(House,4);      //House. 0110 = A
        Trnsfer(Command,5);    //On = 10100
        SendStart();        //Второй раз.
        Trnsfer(House,4);      //House. 0110 = A
        Trnsfer(Command,5);    //On = 10100
                        }
//Для DRS-16 достаточно такого алгоритма:
/*        SendStart();        //
        Trnsfer(6,4);          //House
        Trnsfer(0x1c,5);      //Unit / Function. Function = On
*/
//--------------------------------------------------------------------------------------------------------------------
void Trnsfer (unsigned char DATA, int Bits){//Педача данных длиной Bits    в сеть
    unsigned char i;                    //
    unsigned char mask;                 //
    for(i=0; i<Bits; i++) {             //
        mask = (1 << i);                 //Выделение передаваемого бита
        WaitZC();                        //Ожидание перехода через 0 перед передачей бит - интервала
        if((DATA&mask) == 0)               //Передача 0:
            {Pause1ms();                //
            WaitZC();                    //Ожидание перехода через 0 между полубитным интервалом
            Pulse1ms();}                  //
        else                            //Передача 1:
            {Pulse1ms();                //1
            WaitZC();                    //Ожидание перехода через 0 между полубитным интервалом
            Pause1ms();}                  //
        }                                 //for(i=0; i<Bits; i++)
        }                                //void Trnsfer (unsigned char DATA, int Bits)
//--------------------------------------------------------------------------------------------------------------------
void WaitZC(void) {                        //Ожидание события - перехода синосоиды 50Гц через 0.
    ZeroCross = 0;                        //
    while(!ZeroCross) {}                //
    }                                    //
//--------------------------------------------------------------------------------------------------------------------
void SendStart(void){                    //Передача старт - условия: три единичные посылки 1мс и пауза 1мс
    WaitZC();                            //Ожидание перехода через 0
       Pulse1ms();                            //
    WaitZC();                            //Ожидание перехода через 0
       Pulse1ms();                            //
    WaitZC();                            //Ожидание перехода через 0
       Pulse1ms();                            //
    WaitZC();                            //Ожидание перехода через 0
    Pause1ms();                            //Передача паузы необязательна
    }
//--------------------------------------------------------------------------------------------------------------------
void Pulse1ms (void){                      //Передача импульса. Импульс передается 3 раза
     Pulse1ms1();                        //со слвигом 120градусов для трех разных фаз. Фаза A
     Pause1ms();                        //
     Pause1ms();                        //
     Pulse1ms1();                        //Фаза B
     Pause1ms();                        //
     Pause1ms();                        //
     Pulse1ms1();}                        //Фаза C
//Хотя для DRS516 фазы B и С не нужны. И так работает. Достаточен вызов только Pulse1ms1()!
//--------------------------------------------------------------------------------------------------------------------
//Передача единичной посылки длительностью 1мс с помощью ШИМ. Частота заполнения 120КГц.
//Длительность посылки задается с помощью таймера TC1.
//Таймер запрограммирован на останов по совпадению с RC. Загружаем RC нужной величиной
//и ждем бита совпадения таймера TC1_CV с RC(бит CPCS, поз4, стр 414). При совпадении
//таймер автоматически останавливается.
void Pulse1ms1 (void){                    //Генератор импульсов 120КГц 1мс
    *TC1_RC = 28000;                    //28000
    *PWM_ENA = 1;                        //Разрешить работу канала PWM1 (CHID0), P0.3, 120КГц. 
    *TC1_CCR = 0x5;                        //Запустить таймер 1 + SWTRG=1
    while (!(*TC1_SR&(1<<4))) {}        //Ждать 1мс до совпадения регистра таймера TC1_CV с RC
    *PWM_DIS = 1;                        //120КГц. Запретить работу канала PWM1 (CHID0), P0.3
    *TC1_CCR = 0x6;}                    //Остановить таймер
//--------------------------------------------------------------------------------------------------------------------
void Pause1ms (void){                    //Генератор паузы 1мс
    *TC1_RC = 25000;                    //25000
    *TC1_CCR = 0x5;                        //Запустить таймер 1 + SWTRG=1
    while (!(*TC1_SR&(1<<4))) {}        //Ждать 1мс до совпадения регистра таймера TC1_CV с RC
    *TC1_CCR = 0x6;}                    //Остановить таймер
//DRS516 срабатывает при значениях TC1_RC от 1000 до 800 000

 

И его вызов:

 

    if (Knob) {                            //
        int House = 0xc;                //House = K
        int Unit = 5;                    //
        int Command;                    //OFF = 0x1c, ON = 0x14, All Units Off = 0x10, All Units On = 0x18
        if (Knob<3) {Command = 0x14;}
        else {Command = 0x1c;}
        SendX10Command(House, Unit, Command);
        Knob = 0;                        //
        }

 

DRS-516 удалось запрограммировать на новый House и Unit код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какой финальный размер железа для такого интерфейса? Ну в какой объем его можно уместить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А какой финальный размер железа для такого интерфейса? Ну в какой объем его можно уместить?

Не понял вопрос. Речь о габаритах железа? Я делаю менеджер нагрузок на дачу. Пока изделие умеет измерять переменное напряжение сети методом суммы квадратов, ток в сети через токовый трансформатор и отправлять команды X10, управляя освещением и контролируя потребляемый ток. Если ток больше 20А, часть низкоприоритетных мощных нагрузок отключаются. И подключаются при снижении потребляемого тока. Изделие еще не готово - собранно на макетке. Габариты 70х115мм без питающего и импульсного трансформатора.

20150528210256.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я имел ввиду футпринт части, отвечающей за X10 - ну сколько квадратных сантиметров занимает сам приемопередатчик на плате.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Я имел ввиду футпринт части, отвечающей за X10 - ну сколько квадратных сантиметров занимает сам приемопередатчик на плате.

Квадратный сантиметр под транзистором B772. За исключением трансформатора и конденсатора. Это передающая часть.

Приемную я не делал и вряд ли буду. Просто не нужна. Но схему DRS516 со временем выложу. Там неплохой приемник и не очень сложный.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Квадратный сантиметр под транзистором B772. За исключением трансформатора и конденсатора. Это передающая часть.

Приемную я не делал и вряд ли буду. Просто не нужна. Но схему DRS516 со временем выложу. Там неплохой приемник и не очень сложный.

А индуктивность? Трансформатор с конденсатором много занимают?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А индуктивность? Трансформатор с конденсатором много занимают?

Трансформатор 26х25мм ЕТD кажется Epcos N87 материал, а емкость 0.1х315В - какую подберете.

 

Сейчас проверил дальность. Если вводить сигнал рядом с системным блоком - рапространение плохое. Ловит только рядом. Если вводить сигнал в розетку, в которой не торчит ни одного импульсного блока питания, распространение по всей двухкомнатной квартире - ловит в любой розетке, в т.ч. и рядом с системным блоком. Хотя нет. На этой же линии телевизор. Но не мешает. Вероятно сказываются Y - конденсаторы, шунтирующие сигнал. На очереди дача. Там линии подлиннее.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вертится идея изолировать изделие от сети. Не могу найти какой - нибудь толковый ZeroCross на оптроне. Может у кого - то есть идеи?

 

Повесил на выход ZeroCross оптрон 4N35. Расхождениие по фронтам не более 7мкс. Не смертельно. Окно согласно документации 200мкс.

 

Ну и работает нормально. Не найду решения - запитаю схему ZeroCross от отдельного источника и пущу через оптрон.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Изменился узел передатчика.

 

 

Передатчик работает исправно. Проверен с модулями LM15, AM12, MRS516. В AM12 адрес выставляется переключателями, обучение LM12, MRS516 прошло успешно.

Для MRS51 два раза передаем посылку после нажатия на кнопку в течении 30с.

Для LM15 в течении 30с после включения надо три раза передать посылку с кодом включения.

 

Модули работают исправно. Приятно удивил трансформатор тока. Необычно линеен в диапазоне от 30ма до 20А. Показания тока сравнивались со счетчиком Меркурий 230, у которого есть режим индикации тока. Разность в показаниях составила не более 1.5%!

 

Добавил трехцветный светодиод. В режиме до 100ма он горит синим, 100ма-1А - зеленым, более 1А - красным.

 

Резисторы R8, R9 - для биполярных транзисторов. R9 = 0, R8 нет.

post-61247-1435219981_thumb.jpg

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вертится идея изолировать изделие от сети. Не могу найти какой - нибудь толковый ZeroCross на оптроне. Может у кого - то есть идеи?

 

Повесил на выход ZeroCross оптрон 4N35. Расхождениие по фронтам не более 7мкс. Не смертельно. Окно согласно документации 200мкс.

 

Ну и работает нормально. Не найду решения - запитаю схему ZeroCross от отдельного источника и пущу через оптрон.

Есть такое проверенное решение (см. приложение)

post-28964-1442435963_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Есть такое проверенное решение (см. приложение)

Хорошее решение. Надо будет попробовать. Пока у меня NE555 исправно работает через обмотку трансформатора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на составной TLP127 ограничительный резистор меньше греется

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация