Jump to content

    

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 код.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
А какой финальный размер железа для такого интерфейса? Ну в какой объем его можно уместить?

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

20150528210256.jpg

Share this post


Link to post
Share on other sites

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

Share this post


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

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

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

Edited by Димон Безпарольный

Share this post


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

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

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

 

Share this post


Link to post
Share on other sites
А индуктивность? Трансформатор с конденсатором много занимают?

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

 

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

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites

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

 

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

 

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

Edited by Димон Безпарольный

Share this post


Link to post
Share on other sites

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

 

 

Передатчик работает исправно. Проверен с модулями 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

Edited by Димон Безпарольный

Share this post


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

 

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

 

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

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

post-28964-1442435963_thumb.png

Share this post


Link to post
Share on other sites
Есть такое проверенное решение (см. приложение)

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Всяк кулик своё болото хвалит [/url]

Это Вы по поводу своей схемы так сказали ? )))

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this