Код для водонагревателя. С 19-й попытки.

Итак мой первый быдлокод, который, как ни странно, работает.
Всё про эту портянку я написал в комментариях к коду.
Так как на небольших разрешениях мониторов на сайте не очень удобно читать, выкладываю отдельно файл .c в zip-папке.
«Эта мой первый проэкт, так что не ругайте сильно...» — это не про меня. Наоборот, хочу тонны критики, по структуре, по оформлению — по всему. Хочу делать хорошо, так что жду наставлений отцовским тоном.

Схема в Proteus.

Резисторы и прочую обвязку не показываю. Светодиоды — это светодиоды в оптопарах, которые активируют соответсвующий каскад на включение конечных устройств — клапанов и ТЭНа. Датчики уровня показаны кнопками, чем они по факту и являются.

/*******************************************************

Project : Veniamin Caver's Brevery
Version : 1.0
Date    : 27.09.2015
Author  : Veniamin Caver
Company : VCB/Bastion
Comments: No comments!


Chip type               : ATmega8
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*******************************************************/
//Подключаем бибилиотеки на чип ATMega8A, на протокол 1wire, на датчик температуры ds18b20 и на LCD-дисплей 16х2,
//на задержки (зачем?) и стандартный ввод\вывод - для вывода переменных на дисплей
#include <mega8.h>
#include <1wire.h>
#include <ds1820.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>

                             // Глобальные переменные 
                             
unsigned char yob = 30;      // Количество пива за варку, по умолчанию 30 литров, можно не задавать, потом всё равно присвоится

char buffer [64];            // Общий буфер - используется: вывод переменных на LCD (нафига 64, можно ведь 16??)

char temp = 80;              // Темпеартура в баке для классического однопаузного затирания, с учётом теплопотерь в баках и трубах
                             // ставим 80 градусов, в заторнике при уравновешивании температуры должно получиться 70. Точно данную
                             // температуру подберу опытным путём, кроме того, было бы хорошо реализовать возможность регулирования
                             // данной температуры без перепрошивки, с клавиатуры, а ещё лучше с приложения на PC.
                             // Вообще огонь будет, если рассчитать значение исходя из температуры воздуха в помещении, чтобы 
                             // пивоварня сама делала поправку на температуру окружающей среды. Для этого нужно будет вынести дополнительный
                             // датчик в помещение и сделать ТТР.


interrupt [EXT_INT0] void ext_int0_isr(void)     // Прерывание "0" по срабатыванию датчика уровня на 60 литров
{
    PORTD.5=1;   // Отключаем клапан №1
}


interrupt [EXT_INT1] void ext_int1_isr(void)    // Прерывание "1" по срабатыванию датчика уровня на 30 литров
{
    PORTD.5=1;  // Отключаем клапан №1
}

void main(void)  //Главнейшая из главных

{
    // Локальные переменные главной функции

    // Инициализация портов согласно схемы
    // Порт B
    DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (0<<DDB0);
    PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (1<<PORTB4) | (1<<PORTB3) | (1<<PORTB2) | (1<<PORTB1) | (0<<PORTB0);

    // Порт С

    DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
    PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

    // Порт D 

    DDRD=(0<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
    PORTD=(0<<PORTD7) | (1<<PORTD6) | (1<<PORTD5) | (1<<PORTD4) | (1<<PORTD3) | (1<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

    // Инициализация таймера 0
    // Таймер 0 остановлен
    TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
    TCNT0=0x00;

    // Инициализация таймера 1
    // Все функции таймера отключены, таймер остановлен
    TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
    TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Инициализация таймера 2
    // Все функции таймера отключены, таймер остановлен
    ASSR=0<<AS2;
    TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
    TCNT2=0x00;
    OCR2=0x00;

    // Инициализация прерываний по переполнению таймеров\счётчиков
    // Прерывания запрещены
    TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

    // Инициализация внешних прерываний
    // Прерывания включены, срабатывание прерывания по изменению сигнала на ножке с 5 вольт на 0 вольт
    GICR|=(1<<INT1) | (1<<INT0);
    MCUCR=(1<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
    GIFR=(1<<INTF1) | (1<<INTF0);

    // Инициализация приёма/передачи данных по USART 
    // USART отключен
    UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

    // Инициализация аналогового компаратора
    // Компаратор выключен
    ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
    SFIOR=(0<<ACME);

    // Инициализация ADC
    // ADC выключен
    ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

    // Инициализация протокола SPI (Главный + ведомые МК)
    // SPI отключено
    SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

    // Инициализация протокола TWI(i2c) - двухпроводная шина (такт+данные)
    // TWI отключено
    TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

    // Инициализация протокола 1wire
    // Включено. Подключение на Порт B Pin 0
    w1_init();

    // Инициализация LCD-дисплея, 16 символов 2 строки
    // Распиновка согласно схемы
    lcd_init(16);              
       
       // Все эти инициализации я специально держу перед глазами, чтобы привыкать к ним, а потом при необходимости
       // поменять значения и использовать. Чуть позже, когда надоест на них смотреть вынесу в отдельный файл.


    #asm("sei") // Глобальное разрешение прерываний, вот он АССЕМБЛЕР! Я же говорил, что начну с него!


        while (PINB.4==1)  // Ожидаем нажаите кнопки СТАРТ, нажмём кнопку - вылетим из цикла.
        {
            if(PINB.3==0)  // Тумблер переключения количества варок. Установлено 2 варки по 30 литров  - всего 60 литров если кнопка нажата
            {
            lcd_gotoxy(0,0);
            lcd_putsf("1 or 2 brewing?");
            lcd_gotoxy(0,1);
            lcd_putsf("2 part, 60L OK?");    //Вывод информации на LCD, типа "Сколько варим партий - одну или две? Щас 2 партии на 60 литров .
            yob = 60;                        //Пишем в переменную 60 литров
            }
            else                             // Тумблер переключения количества варок. Устанволена 1 варка на 30 литров если кнопка не нажата
            {  
            lcd_gotoxy(0,0);
            lcd_putsf("1 or 2 brewing?");
            lcd_gotoxy(0,1);
            lcd_putsf("1 part, 30L OK?");      //Вывод информации на LCD, типа "Сколько варим партий - одну или две? Щас 1 партия на 30 литров .
            yob = 30;                       //Пишем в переменную 30 литров
            }
                                            //Дребезг не играет роли, 1-2 секунды и он успокоится, тогда условие перепроверится и всё ОК
        }
        //Вылетаем из цикла - попадаем в следующий цикл
        
        while (PINB.2==1)   // Ожидаем подготовку солода - насыпали солод - нажали кнопку готовности. Тут логика хромает, нужно переделать,
        {                   // потому что этот цикл должен выполняться в любом случае, даже если нажали на кнопку. А нажатие на кнопку
                            // нужно просто зафиксировать и сохранить в переменную - дальше проверять перед наполнением. И в зависимости 
                            // от того нажата ли кнопка выдавать или не выдавать 0 на PB1  - в конце программы.
            lcd_clear();
            lcd_gotoxy(0,0);
            lcd_putsf("Valve is open");
            lcd_gotoxy(0,1);
            sprintf(buffer, "%3d L needed",yob);  
            lcd_puts(buffer);       //Указываем на то, что клапан открыт, так же показываем сколько будет пива выводя переменную из буфера
        
             if (yob == 30) 
             {                      // Выполняем код, если варим 1 партию на 30 литров
                while (PIND.3==1)   // Пока датчик уровня разомкнут. Этот датчик нижний - он отбивает 30 литров в ёмкости. 
                {
                    PORTD.5=0;      // Открываем клапан, набираем воду
                };
                  
                PORTD.5=1;          // Датчик замкнулся, вылетели из цикла, закрыли клапан. Кроме того закрываем клапан в прерывании, для надёжности.
                lcd_clear();
                lcd_gotoxy(0,0);
                lcd_putsf("Valve is closed"); 
                lcd_gotoxy(0,1);
                lcd_putsf("TEN power ON");      //Пишем, что клапан закрыт и работает ТЭН
                PORTD.4=0;                      // и включаем ТЭН
             }                                  // это было условие, если варим 30 литров
             
             else  
             {                                  // а если варим 60, то погнали другой цикл
                while (PIND.2==1)               // Пока датчик уровня разомкнут. Только это другой датчик - он выше - отбивает 60 литров. 
                {
                    PORTD.5=0;                  // То же самое - открываем клапан, набираем воду
                };  
                    
                PORTD.5=1;      //Вылетели из цикла, когда датчик замкнулся, тут второе прерывание - тоже для надёжности, хотя может я слишком мнительный.
                lcd_clear();
                lcd_gotoxy(0,0);
                lcd_putsf("Valve is closed"); 
                lcd_gotoxy(0,1);
                lcd_putsf("TEN power ON");//Аналогично
                PORTD.4=0; //Аналогично 
             }; 
                 
                    
        } //Конец недоработанного цикла.
        
        
        //А здесь будет опрос температурного датчика, и отключение ТЭНа по достижению определённой температуры. Затем пауза, которая позволит
        //выйти на плато(постоянная температура), корректировка по необходимости, открытие второго клапана на наполнение заторника на 30 литров
        //и мониторинг температуры оставшихся 30 литров воды, если варим 60 литров. 
        
        
        
        while (1) //Условная передача цикла на работу следующего блока. Здесь просто подаём 0 на PB1 и следующий МК подхватывает эстафету. 
      {  
        
        
        PORTB.1=0;
        lcd_gotoxy(0,0);
        lcd_putsf("Block 2 is work");
        lcd_gotoxy(0,1);
        sprintf(buffer, "%3d etalon temp",temp);  
        lcd_puts(buffer);
      }
}
         // По мне, так слишком топорно. Всё это я возьму за основу, и перепишу на функциях, так, чтобы один длительный процесс
         // контролировала соответствующая функция, а сейчас у меня по факту этим занимаются циклы while. Рукожоп(
         // И ещё после срабатывания датчика и включения тэна цикл начинает гонять по кругу - из-за этого весело глючит LCD
         // клапан при этом не дрочится, потому что датчик замкнут, просто прога бегает по циклу и выводит на LCD предыдущую строку.
         // Ну и кнопка готовности солода выкидывает вон из цикла, но ТЭН при этом остаётся включённым. Так что его можно отключить 
         // дальше по программе. Но всё равно рукожп(


При компиляции ошибок не было, думаю эта информация важна и должна быть здесь:

Build: 19
11039 line(s) compiled
No errors
No warnings

Bit variables size: 0 byte(s)

Data Stack area: 0x60 to 0x15F
Data Stack size: 256 byte(s)
Estimated Data Stack usage: 41 byte(s)

RAM Global variables area: 0x160 to 0x1AC
RAM Global variables size: 77 byte(s)

Hardware Stack area: 0x1AD to 0x45F
Hardware Stack size: 691 byte(s)

Heap size: 0 byte(s)

EEPROM usage: 0 byte(s), 0,0% of EEPROM
Program size: 1119 words (2238 bytes), 27,3% of FLASH
103 words (206 bytes), 8,4% reduced by Code Compression

Как я уже писал в предыдущем посте, хочу переписать всё на функциях, ибо так будет на мой взгляд правильнее и изящнее. Сейчас подкреплю матчасть по функциям, почитаю Ваши комментарии и сделаю законченную версию программы для блока водонагревателя.

Так же хочу рассказать про общую задумку касательно реализации. На первом этапе будет 3 блока, на каждый из которых я выделю по отдельному МК и объединю их в сеть по SPI. Сделать это я хочу по двум причинам. Во-первых — это интересно. Во-вторых — я ещё не знаю, насколько круто я смогу модифицировать каждый блок, но планов и задумок очень много. Поэтому иметь на блок отдельный контроллер это задел на будущее. Будет и запас по коду и запас по ногам. Сейчас ног вроде как не осталось почти на первом блоке — но это только так кажется. В конечной реализации по SPI будет четвёртый контроллер, который собственно будет рулить блоками, и на него перевесится LCD, а следовательно на первом блоке освободится 7 ног. Ну и ещё можно всю группировку затактовать от одного сигнала, тогда ещё и с кварца нога освободится. На крайняк, если уж совсем будет всё печально — можно будет взять МК поногастее.
И сразу хотел бы спросить — при использовании SPI — какое расстояние между контроллерами может быть максимальное, поможет ли использование экранированного кабеля для увеличения дальности разноса и для защиты от помех? Пока что размер конструкции вписывается в 1.5 х 1.5 метра.

Комментарии (150)

RSS свернуть / развернуть
при использовании SPI

а почему не повесить их на шину RS485? вроде тут адских скоростей передачи данных не надо. а так — тот же самый принцип «мастер-ведомые», только железо само по себе будет заточено на защиту от помех.

это, конечно, потребует дополнительного UART'a, но ведь взамен меги8 можно взять ту же мегу164, стоимость, например, в Чип-НН 84р. против 115р. (не так уж и много). бонусом ко второму уарту пойдет бОльшее количество лап и мозгов кирпича. ну и возможность элементарного переноса программы на более «мощные» камни из подсемейства МегаХ4
+2
rs485 я бы не стал рекомендовать по причине заточенности под наличие четкого мастера. но учитывая конструктивную особенность в виде меги — выбора не так много.
0
хотя в принципе и SPI грешит завязанностью на мастере. я предпочитаю на шине иметь одноранговые девайсы.
0
заточенности под наличие четкого мастера

так а тут вроде именно этот случай, нет? есть «основной» кирпич, который рулит кучей мелких исполнителей.
0
мне не нравится то, что требуется постоянно опрашивать девайсы, если требуется не только управление, но и контроль. особенно это раздражает когда врем реакции на аварию должно измеряться в долях секунды.
0
когда врем реакции на аварию должно измеряться в долях секунды

дык я ж не спорю:) я про то, что если изначально рассматривать SPI vs RS485 именно для данного случая, то лично мне RS485 кажется намного проще и надежней
0
Доли секунды никого не спасут, ни людей, ни оборудование. На аварию реагируют уже видя травмированных или выход оборудования за технологические параметры. Доли секунды тут не помогут.
-1
Зависит от скорости реакции исполнительных механизмов. На многие защиты специально ставят выдержки, чтобы случайные сработки сигналов не приводили к остановке техпроцесса. В общем случае, алгоритмы защиты должны определяться проектом (функциональной схемой автоматизации) и/или НТД в отрасли.
0
Я уже говорил о том, что автоматика управления и защиты должны быть разделены. У них разные цели и задачи. Этого требует (не рекомендует, требует) и нормативная документация.
0
с одной стороны верно. при разработке автоматики для лифтов сталкивался с многократным дублированием защиты. но есть ситуации когда датчик стоит в одной точке (допустим участок продуктопровода), а исполнительный механизм с автоматикой в другой (компрессорный пункт). аналоговая линия или силовая линия с прерыванием около датчика нереальны.
0
Это нормально, и даже в относительно больших системах (тысячи дискретных сигналов и сотни аналоговых) время реакции при этом вполне находится в допустимых пределах (норма — 0,5 секунды). Постоянный опрос, кроме того, требуется для контроля исправности оборудования и линий связи.
0
да, еще — на картинке вообще ничего не разберешь:) лучше приложи ее еще и отдельным файлом
0
Здесь исходники, включая файлы протеуса и hex.
0
Спасибо, почитаю про RS485 более подробно. По SPI кое-что читал, общее понимание есть, по RS485 что-то в общем слышал, не стал рассматривать потому что работает через UART, следовательно количество подключений ограничено.
Тут основной момент какой — сейчас у меня 3 блока. Если я всё задуманное реализую — то получится 3 мк ведомых + 1 главный. Такая система позволит мне варить максимум 120 литров пива за рабочий день. Но система предполагается модульная — то есть далее добавил 3 блока аналогичных, добавил 1.5 х 1.5 х 1 метр рабочего пространства — 240 литров. Но тогда главный МК уже должен будет опрашивать 6 блоков. По SPI это реализуемо — грубо говоря можно добавлять блоки, пока не закончатся ноги у главного контроллера. В то же время, если у главного контроллера выделить дополнительно UART и подключить через него «Самый Главный» контроллер(с двумя UART на борту) — то можно будет на примере mega8 в качестве основных МК реализовать схему:
15 блоков >< |SPI| >< (Главный блок) >< |UART| >< («Самый главный блок») >< |UART|>< PC
Это уже 5 модулей х 120 литров, 600 литров в день это задел (по крайней мере для меня) на 2-3 года вперёд.
Ну а дальше можно потихоньку отводить взгляд в сторону 32-битных МК и уже на место «Самого главного» можно поставить что-то вроде ATUC256L4U с 4 UART'ами, и к нему подцепить ещё 2 «Главных» — каждый из которых работает с 15 блоками. Это 1800 литров — уже промышленный объём — к этому нужно стремиться, но это на отдалённую перспективу.
Передаваться между МК будет только «сухая» информация — температура, время, какие-то флаги — основная работа выполняться будет «на местах».
Если и дальше не будет хватать — то тогда уже можно будет рассматривать Ethernet и уходить от AVR — но на тот момент должна быть уже рабочая система, которая сможет приносить достаточно денег для того, чтобы переходить на следующий уровень. Пока 1800 литров едва выглядывают из-за горизонта, а вот 120 литров уже можно неплохо рассмотреть)

Я, конечно, не спорю — всё что я задумал весьма масштабно, и, возможно, возникнут трудности — но заморачиваться над проектом, который нельзя развивать во что-то действительно крутое, я не вижу смысла. Будет очередная коробка с проводами и тэнами, торчащими из контейнера-холодильника, который стоит на стиральной машинке в ванной комнате одной из хрущёвок. Кому это может быть интересно?
0
RS-485 это именно то, что требуется в данной ситуации. Всего 3 провода на любое количество абонентов, рабочие расстояния — сотни метров, высокая помехоустойчивость. SPI имеет другую нишу.
+2
работает через UART, следовательно количество подключений ограничено.

так rs485 в том числе для того и придуман, чтобы цеплять на него кучу ведомых устройств. у каждого ведомого есть свой номер (причем, можно его жестко зашить в устройство, это позволит сэкономить ноги МК).

15 блоков >< |SPI| >< (Главный блок) >< |UART| >< («Самый главный блок») >< |UART|>< PC

ну а с рс485 можно это количество сделать равным минимум 32:)

за рс485 есть еще один существенный аргумент — модули будет гораздо проще отлаживать с компа (т.е. именно систему взаимодействия), ибо не найти преобразователь UBS-RS485 достаточно сложно. а вот с SPI всё нет так просто (естественно, всё решаемо, просто посложнее будет).

заморачиваться над проектом, который нельзя развивать во что-то действительно крутое, я не вижу смысла.

ну, логично:) именно модульный подход будет наиболее продуктивным. и шина рс485 в этом может весьма сильно помочь. хотя бы тем, что не надо на каждое ведомое устройство выделять отдельную линию включения ведомого.
0
Спасибо всем! Покурю по rs485 — отпишусь.
0
сразу на тему ModBus читай.
0
ATUC256L4U
Забудь. по STM32 документации гораздо больше и для неспеца будет сильно проще.
0
PORTD.5=1; // Отключаем клапан №1
Такие вещи лучше в определения вынести. Вида
#define Valve1 PORTD.5
...
Valve1 = 1;

Остальное на текущей итерации врядли есть смысл комментировать.
Также поддержу насчет RS485.
0
  • avatar
  • Vga
  • 01 октября 2015, 20:20
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);

Будет вычислено на этапе компиляции?
0
наверняка
0
будет конечно на этапе компиляции, так как везде константы. Я бы предложил другой вариант написания, если это AVR studio, то проще было бы так:
DDRC = 0b00000000;
Вполне себе наглядно
0
И сразу хотел бы спросить — при использовании SPI — какое расстояние между контроллерами может быть максимальное, поможет ли использование экранированного кабеля для увеличения дальности разноса и для защиты от помех? Пока что размер конструкции вписывается в 1.5 х 1.5 метра.
По SPI. Делал бегущие строки длиной до 30 метров, понимаю задачу, как она есть.
1.5 метра это уже достаточно для того, чтобы наловить помех, поэтому моя рекомендация следующая:
1 — уменьшить скорость передачи до нескольких килогерц или максимум десятков килогерц.
2 — принудительно загрубить скорость передачи линии RC цепочками на приемной стороне. У меня стояло где-то 1кОм и 27пФ.
3 — на приемной стороне в разрыв цепи поставить 74HC14 — триггер шмидта по два блока последовательно.
4 — Все будет работать. Если не будет — идем по принципу: Уменьшаем скорость — ставим кондеры в RC побольше.
0
В качестве соединителя использовал гибкий шлейф, с жилами земли через одну. Хватало.
Вариант номер 2: Использовать диф пары на каждый сигнал. Скорость при этом должна быть больше. Недостаток — подороже микросхемки на приемнике и передатчике. Мои коллеги подскажут, наверное, чипы. Не помню сейчас уже
0
и еще: При таком удалении контроллеров, важно понимать гальваническую связь между схемами, корпусом, и силовой частью. Если использовать экран, нужно отдавать отчет, что если на двух блоках будет разный потенциал — то по экрану кабеля потечет ток, возможно даже совсем не хилый. Новички обычно об этом не задумываются, так что на опережение вопрос.
0
драйвера 485ые подойдут типа adm485. только расход будет поболее чем при прямом использовании (по 3-4 с каждой стороны)
0
это жестко конечно, есть другие, более подходящие.
0
26LS31, 26LS32
0
четырехканальые, однонаправленные. значит требуется два корпуса в каждый конец. стоят как небольшой дельтаплан
0
в платане am26ls31 стоит 16 рублей, в Терре — 25. думаю, дельтаплан стоит дороже))
0
аха. похоже я где то очепятался при поиске )
0
проблема «более подходящих» в меньшей доступности и цене.
0
ну как вариант можно ADM488. Там хоть две пары. Принимающая и передающая
0
ну дак по сути те же йайтса (ну ладно для 422 линии). суть 485 драйверов в том, что у многих промышленников они в тумбочке валяются в больших количествах.
0
с этим доводом не поспоришь)
0
А почему собственно SPI, а не UART? Ведь все предпосылки для использования именно его. Во первых, ножек поменьше (2 или 3 в зависимости от того, какую линию передачи будете делать, 485 или 422), жесткая синхронизация по кварцам. По-моему, самое оно. Если 485 — то возможно объединить все контроллеры в одну шину. У SPI:
4 вывода: CLK, MOSI, MISO, SS. Нет возможности объединить в шину аппаратно.
0
Еще замечания по программе: Правильнее сначала регистры PORTx настраивать, а потом DDRx
0
По датчику на 60 литров. Насколько понимаю, это максимальный объем, Стоит систему сделать так, чтобы отключение подачи воды/смеси происходило мимо контроллера, потому как всякое бывает. А контроллер лишь извещать о произошедшем.
+1
Да думал над этим, и ещё много над чем подумать можно. Но пока особо заморачиваться не хочу — так как в баке есть аварийный сброс, который, кстати, сначала сбрасывает в дополнительную ёмкость на 120 литров — там хранится вода для мойки, а если и там будет полно — то аварийный сброс в канализацию. Это вообще на тот случай если с мембраной на клапане будут проблемы — так то клапан нормально-закрытый — ток пропал, клапан закрылся. Это ещё один плюс в рейтинге НЗ-клапан или бистабильный — так как бистабильный открыл и если пропало электричество — то хрен ты его закроешь. 60 литров не максимальный объём. Максимальный — 120, но пока мне больше 60 литров не понадобится, хочу реализовать рабочую систему на 60 литров, далее будет не сложно перейти на 120.
Вообще бак в данном случае — это просто аккумулятор горячей воды. Позже я объясню, почему я принял именно такое решение(хотя более популярно сейчас нагревать и затирать в одной ёмкости — экономия по материалу и по месту серьёзная)
0
По нагревателю: Не рассматривали ПИД регулятор?
-1
SPI предназначен для коммуникации устройств в рамках ПП. Крайне не рекомендовал бы использовать эту шину на дальные расстояния.
0
У Сони пады как-то и на трех метрах кабеля ухитряются работать. Хотя я тоже не одобряю это решение. Подозреваю, что именно из-за этого у плоек столь тормозные карты памяти (они на том же SPI висят).
0
С этим не соглашусь, потому как SPI хорош по-своему. Он лишен всяких там стартов, стопов, четностей и точного битрейта, то бишь голая дата да еще и с клоком, что позволяет использовать его для последовательной накачки каких-нить буферов, устройств отображения типа бегущих строк, экранов, и прочей лабуды. Так что списывать его не стоит. Он именно годится для таких низкоуровневых задач. А если речь идет о передаче информации между МК, то USART, CAN и подобные интерфейсы однозначно
0
SPI предназначен для коммуникации устройств в рамках ПП

да не, метр-полтора прОвода на 10-15кГц вполне себе держит. и для жестко сконфигурированных проектов обычно выглядит более чем достойно.

другое дело, что в данном случае прожэкт изначально задумывается как э… масштабируемый, что ли. или расширяемый, хер его знает как правильно:) ну и для таких вводных SPI уж никак фаворитом не является. хотя, понятно, тут уж воля автора
0
Вообще-то обычный 10base-T по витой паре 5-й категории работает до километра. И эзернет в пром автоматике все прочнее вытесняет все остальные шины распределенного ввода-вывода.
0
[чешет репу] камрад, ты это к чему написАл?:) я полностью согласен со всем, что есть в твоем камменте, но причем тут SPI?:)
0
это к тому что не надо запариваться насчет 10-15 кГц, возможно работать и на гораздо более высоких скоростях и расстояниях — просто грамотно согласовывать линию
0
Ethernet — сильно другая вещь по физическому интерфейсу, чем SPI. И потому куда более помехоустойчивая (собственно, под помехоустойчивость на длинных отрезках кабеля она там и заточена).
Конечно, можно поставить дифференциальные приемопередатчики на каждую линию SPI, соединять витой парой и получить некое подобие, но это уже будет не совсем SPI.
0
она там и заточена
«она» — «физический интерфейс» ака «физика»
0
SPI интерфейс не стандартизированный, оттого и встречаются разные причудливые реализации:)
0
10-15кГц — негусто. А на более высоких частотах начинаются проблемы с наводками с клока на дату. Некоторые на мегагерце-другом уже на 10 сантиметров неудачно проложенного/распинованного шлейфа жаловались.
0
напомню что у ТС рядом будет парой+++ киловатт сеть щелкать фазой… ;)
0
На сайте, пролетала, кстати, одна идейка, незаслуженно обделенная вниманием. А именно — использование эзернетовской «физики» на нестандартных частотах/протоколах, т.е. просто как надежный физический уровень. Т.е. используется манчестер или mlt3, с горой готовых плюшек.
0
недоверчиво посмотрел на джойстики nintendo wii работающие по Inter-Integrated Circuit. да и DDC на базе i2c сделан и вполне себе прижился.
0
джойстики nintendo wii работающие по Inter-Integrated Circuit
Там и метра длины нет. Лучше уж вспомнить джойстики сони, где SPI и 3 метра провода (экранированного, правда, и с фильтрами).
Да и рядом со всем этим нету источников мощных помех, хотя SPI и сам себе неплохо помехи наводит.
0
Судя по коду, прерывания EXTI0 и EXTI1 вообще не нужны. У вас же в цикле проверяется фактическое состояние датчика. Удалите прерывания и все что с этим связано. И без того будет работать. Далее. Повторяющийся код. Сложно будет при отладке и исправлениях.
0
Лучше и дешевле — не изобретать велик, а сделать свой вклад в один из проектов по реализации ПЛК на основе ОС Linux. Например, этот: www.dcisite.be/index.html (лично я с ним никак не связан, но из прочитанного на сайте — это, как минимум, хорошее начало и база для построения своей системы). Собственная шина мне не нравится по причине того, что к ней нельзя подключить какой-либо сторонний модуль, придется реализовывать свой с нуля. Вполне можно впилить modbus rtu — этот протокол достаточно прост, но в то же время — полностью функционален и достаточен для использования в автоматизации. Полное отсутствие встроенных функций безопасности обычно решается физической изоляцией АСУшных сетей управления.
0
На первом этапе будет 3 блока, на каждый из которых я выделю по отдельному МК и объединю их в сеть по SPI.
Пока что размер конструкции вписывается в 1.5 х 1.5 метра.
Казнить на месте. Подумай о том, что у тебя рядом будет щелкать фазой или периодом 2-8кВт 220В. Дам намек — даже сеть (витая пара с определенным шагом, естессно дифференциальные сигналы, естессно гальванически развязано на обоих концах) не прокладывают рядом даже с простыми кабелями 220В. Ну или готовься поверх СПИ городить еще свой протокол с подтверждениями, повторными отправками и прочими CRC…
0
Хотел сегодня почитать комментарии, разобраться и что-то решить по проекту, но вот только сейчас добрался до компьютера. Спасибо всем огромное за комментарии — завтра с утра буду вдумчиво читать и вкуривать по теме.
Вчера камрад Lifelover меня озадачил по конечному автомату, за что ему огромное спасибо! Сегодня я полдня читал всё, что смог найти по этому вопросу. Потом со своим товарищем, который вообще немного в другой сфере витает, но близко очень, но очень, блин, высоко в своей сфере витает, обсуждали его опыт программирования мозгов для котла на отработке/солярке. Тут вообще интересно получилось — я ему про конечный автомат — он мне про блок-схему — я ему одно — он мне другое. Потом извели полпачки бумаги — и я понял что мы в принципе говорим про одно и то же. Но прикол в том, что чувак с ООП сел за ардуино, месяц пытался что-то там сделать и была гора глюков и всякой херни — типа того, что датчики по 2-3 секунды тупили, а потом допёрло, нарисовал блок-схему и за час написал софтину, которая как бы уже полгода не сбоит — только релюхи китайские горят) Так что завтра я обязательно отпишусь с новостями! Ещё раз всем спасибо и спокойной ночи!
P.S. treasure — пока писал — твой комментарий перед глазами висел — запал. Может стоит разнести управление и исполнители подальше. Скажем блоки с ТЭНом убрать в сторону, откуда идёт 220, а к остальным блокам проложить хорошо теплоизолированный трубопровод, как бы сделать развязку на безопасное расстояние, смириться с небольшими теплопотерями и расходами на трубопровод и утепление во имя стабильности управления? А переключать хотя бы 12 вольтовой линией DC, которая повсеместно используется — клапаны, насос, двигатели…
0
Лучше транспорт другой выбрать. Чего в этот СПИ вцепился?
0
Я пока по транспорту только засматриваюсь — и исходя из своих знаний выбрал SPI, но возможно, мои знания оставляют желать лучшего) Так что конкретного решения я пока не принимал. Вы мне тут за 2 дня информации подкинули на неделю вперёд — это просто если сесть и читать/пробовать. За что, кстати, Вам всем — отдельное спасибо! Боюсь по RS-485 — я пока не осилю, UART я пока не вижу как можно применить исходя из того, что у МК 2 линии UART — на приём-передачу, а у меня три МК отдают данные четвёртому. Судя по всему SPI тоже не лучший выбор — поэтому придётся таки осилить RS-485. Но пока я отложу этот вопрос — сейчас в приоритете другое.
0
RS-485 фактически тот же самый уарт и есть, только полудуплекс и на выходе еще одна микросхема-драйвер.
0
UART я пока не вижу как можно применить исходя из того, что у МК 2 линии UART — на приём-передачу, а у меня три МК отдают данные четвёртому
Не требуется прокладывать к каждому исполнителю свою линию данных. Достаточно применить шину — все устройства висят на одной линии, а порядок обмена данными регулируется протоколом — кто, когда и кому вещает.
Собственно, посмотри в сторону Modbus RTU. Это как раз ориентированная на твои задачи шина, использующая в качестве физического уровня RS485 (RS485 — практически тот же UART, но более помехоустойчивый).
0
В промышленности, RS-485 по топологии «шина»,- скорее исключение, чем правило, «цена» отказа линии связи очень высока. Поэтому применяют по схеме «точка-точка». И уж мультимастер на одной шине — это еще большая редкость, используется только в виде «костыля».
0
Возможно. В промышленности не работал. Но тем не менее, Modbus — шина и поддерживает достаточно много девайсов в одной сети. И, по крайней мере, это лучше, чем SPI (как я понял, все девайсы ТС планировал вешать на один SPI, разделяя только чипселекты). А про мультимастер речи вроде и не шло.
0
а если вспомнить Cable Select на PATA шлейфах и развить мысль…
0
Я не совсем понял куда ты клонишь.
0
Разная бывает промышленность. Тянуть несколько десятков кабелей на сотни метров вместо одного, попутно просовывая их в разные щели, может показаться исполнителям некоторой разновидностью БДСМ
0
Я об этом думал. Да, разработчики оборудования закладывают именно такую возможность — управление удаленными УСО (шкафами с модулями ввода-вывода) через две пары кабелей — ethernet с кольцевой топологией. Т.е. по замыслу, ставим шкаф где-то рядом с оборудованием, которым управляем. Но условия применения — взрывопожароопасное производство, необходимость взрывозащиты оборудования в УСО из-за опасности появления взрывоопасной газовой смеси при утечке из технологии — заставляет все АСУшное железо выносить в выделенное помещение (или контейнер), и, действительно, тянуть километры кабелей, в нескольких лотках, и число их измеряется сотнями даже, не десятками.
0
Самое интересное, что эти упражнения идут вразрез с требованием сменяемости кабелей по ПУЭ.
0
точка-точка на 485 практически не применяют в связи с большим количеством переотражений или большой нагрузкой при попытке поборать терминаторами на каждом конце.
0
теоретически это возможно, причем не нагружая выходной каскад более, чем нужно. Весь секрет в том, чтобы резисторы ставить не в параллель на конце линии, а последовательно в начале
0
что значит последовательно в начале? не совсем понял то ли смысл, то ли суть.
0
ну так схему смотрите. Резисторы согласующие последовательно в начале линии
0
надо про это почитать…
0
весь смысл в том, чтобы по линии передавать не всю амплитуду сигнала, а ровно его половину. (При условии что приемник имеет бесконечное сопротивление по входу). Сигнал дойдя до конца линии, переотражается умножая свою величину в два раза. Таким образом дойдя до номинального значения. Далее переотраженная волна амплитудой в половину сигнала идет обратно и гасится не согласующем резисторе. (Внутреннее сопротивление источника должно быть 0)
0
Вот подробные осциллограммы для первой линии T1:
Зеленый: сигнал от источника
Синий — после резистора
Красный — в конце линии
0
Здесь можно прочитать об этом. Но тут вкратце
0
а вот что будет, если линия не согласована:
0
Во-первых, на всех приведенных схемах НЕ точка-точка, а «звезда». ЕМНИП, 485й рекомендуют тянуть шлейфом с отводами ~1-2 м (от коробки до клемм). А во-вторых, 5 Мбит в несогласованную непонятную линию подавать — что вы еще ожидали? Максимум, что видел в реальных системах — 115200, и то — между шкафами. Если надо быстрее, почему-то применяют ethernet, в т.ч. и оптику.
+1
Где вы видели, что я говорил о соединении точка-точка — не понятно. Речь то как раз шла о «звезде» изначально. Далее. В таком соединении нельзя подключать приемник в середине каждого «луча» «звезды», только в конце. Поэтому, один «луч» «звезды» можно рассматривать как соединение точка — точка.
0
и еще: Рекомендация по отводам на 485 только одна: Как можно меньше!
0
Используйте нормальные экранированные кабели и повторители для разделение сегментов и будет вам щастье на больших скоростях и длинах. У меня на Профибус по умолчанию стоит скорость 1,5 МБит (на коротких объектах 12 мбит) — промышленные условия… частотники… десятки введённых мною объектов… эксплуататоры не жалуются.
Сименс представляет шину Профибус на RS-485 так
0
про повторители и экраны мне известно. Я говорю о теоретической стороне вопроса.
0
а почему собственно 390 Ом? Или линия с волновым сопротивлением 260 Ом? Расчет: Rт = (R1+R3)*R2/(R1+R2+R3)
Предполагаю, автор не сильно разбирающийся в согласовании линии по ошибке подумал, что общее согласующее сопротивление будет 390/3 = 130 Ом, что в принципе близко к значению 120. Что ж, придется развенчать сей миф:
0
а вот так правильно:
0
При подключении резисторов одинакового номинала формула становится до безобразия простой: R = Rлинии * 1.5. Соответственно, чтобы получить нормальное сопротивление согласования — нужно Волновое сопротивление линии * 1.5. Вычисляем для линии 120 Ом: 120*1.5 = 180. Симулируем:
0
а почему собственно 390 Ом?
Это из рязряда технических ляпов в книжках — на самом деле у Сименса в разъёмах посередине делитель 390-220-390 ом

не забываем что средний резистор должен быть повышенной мощности — типоразмер 1206 — 0,25 Вт
По «теории»
Для чего то сформированы/напаяны проходные индуктивности в разъёмах…
http://s7detali.narod.ru/NET/PB.html
графики симуляторов… попробуй снять реальные графики с реальных железяк
0
считаем: (390 + 390)*220 / (390 + 390 + 220) = 171,6 Волновое сопротивление кабеля.
Что это ха кабель, интересно…
0
проиндуктивности могу предположить — борются с всплесками переотражений? Какая скорость передачи и длина линии? Вообще, можно соединение рассматривать как линию? (Иммется ввиду, чтобы длина соединения была больше 1/10 длинны волны или 1/50 скорости передачи данных)
0

Синий — исходный, красный — в линии, зеленый — на R2
0
Судя по всему, если в приборе есть терминатор, то соединение точка-точка. Здесь могу предположить такой ход мыслей разработчиков:
1. Увеличивают расчетный терминирующий резистор с целью увеличения амплитуды сигнала в счет переотражений, что может быть неплохо, если учесть потери в длинных линиях.
2. Пока помеха вернется к источнику, а потом снова переотразится до приемника — сильно ослабнет по дороге. Более того, помеха будет уже в более высоких частотах, а у них еще большее затухание в кабеле…
2. Катушка требуется для снятия всплесков
0
support.industry.siemens.com/cs/pd/439230?pdti=td&lc=ru-RU
for frequency range 3 MHz … 20 MHz 150 Ω 0,022...0,042 dB/m
at 38.4 kHz 185 Ω 0,004 dB/m
at 9.6 kHz 270 Ω 0,0025 dB/m
Длины нормируются скоростями передачи сигнала — при 12 МГц — 100 м, 9.6...187 КГц — 1000 м.
Терминаторы обязательно должны быть включены на концах сети — при этом количество промежуточных устройств в сегменте до 30 штук.
Для надёжной связи обязательно заземление экрана и кабель выравнивания потенциалов между устройствами.
Где невозможно убрать разность потенциалов переходят на гальваноразвязанные оптические кабели.
Про назначение индуктивностей не надо гадать — читай учебники

Правильно собранные сети работают десятилетиями без проблем в круглосуточном режиме,
а вот если делают дилетанты (не экранируют, не выравнивают, шаляй-валяй...)… гарантия вызова проблем
0
Вся эта писанина выглядит как, кто-то бегал долго вокруг с бубном и чего-то воял-перевоял, и вот наконец кто-то что-то своял, и решили, что вот, такие резисторы именно должны быть (вроде работает), вот такие индуктивности должны быть и как говорится, НЕ ТРОГАЙ! А между тем инструкции заплывают мифами, в виде ошибочки с номиналами резисторов. А все же «учебники не читал» и мне дико интересно, почему терминирующие резисторы настроены на линиюю 176.1 ома? Это есть кабель такой?
0
171,6 точнее.
0
171,6?
Ты какие формулы используешь? Ома для постоянного тока?
Ещё раз повторю технические характеристики кабеля
for frequency range 
3 MHz … 20 MHz 150 Ω 0,022...0,042 dB/m
at 38.4 kHz 185 Ω 0,004 dB/m
at 9.6 kHz 270 Ω 0,0025 dB/m
на фотке видно, что они дурят не только в книжках :)
[IMG]http://s003.radikal.ru/i204/1510/15/a119a5a0b57d.jpg[/IMG]
0
по поводу формул. Формулы совершенно справедливы для всех частот. Другое дело, что на разных частотах волновое сопротивление кабеля разное. И вот здесь нужно искать некий компромисс. Например, у нас скорость передачи 56кБит, но скорость нарастания волны в 10 раз выше (то есть 1/560кГц). Это сильно зависит от свойств передатчика. То тогда чтобы правильно скосить всплески, нужно подбирать терминатор, соответствующий волновому сопротивлению кабеля на частоту 560кГц. Вот и все дела.
0
и резистор не тот, и переключатель не так нарисован… Хорошо, что я не читал этого…
0
Чем Специалист от дилетанта и отличается — Специалист сразу видит несоответствие представленного реальности :)
Так и в данной дискуссии ты выдумал и используешь нереальную теорию, оторванную от фактической реальности.
Возьми настоящие железяки (каких у меня много) и настоящий кабель (какого у меня много и утверждаю, что импортозамещаемый аналог не аналог) и настоящий 2-х/4-х канальный осцилограф (4-х канальным можно видеть разницу на концах бухты сети)…
или найди в интернете результаты других нетеоретиков…
Вракипедия врёт — очень вредный вракиресурс домыслов и вымыслов:(
как это делали реалисты-нетеоретики с резисторами разных номиналов и кабелей разного вида.
0
в свое время работал по смежной профессии, занимался профессиональным освещением. а там, если вы знаете, имеется DMX-512 на витой паре со всеми вытекающими. Так что, теория теорией, а практика мне тоже известна от первого лица. Так вот, мы использовали кабель с волновым сопротивлением 120 Ом. Поэтому и все вопросы. Хорошо, если есть кабели, которые согласуются по сопротивлению 171.6 — то вопросов больше нет. Википедия здесь не причем.
0
хорошо, по вашей ссылке нашел график:
Выводы здесь следующие:
1. Данное соединение не является линией передачи, поскольку длина соединения сильно меньше длины волны.
2. Терминирующего резистора явно не хватает, а если он и стоит, то не соответствует номиналу, из-за чего имеются всплески. А вот симулятор:

Сильно похоже
0
ты реальные щупы в руках держал?
какие выбросы?
0
Прежде чем такие графики кидать, нужно описать что и на какой скорости работает, какие кабели какой длины и прочее. А то, знаете ли, я щас тоже на симуляторе такое наведу, что не разберешься вовек.
0
подозреваю, что здесь сопротивление терминатора слишком маленькое, что привело к уменьшению амплитуды сигнала в первый момент времени, потом переотражению в обратной полярности. Хотя нигде не описано, какой резистор нормальный.
0
в смысле какой уровень напряжения считать нормальным
0
Давай от теории переходит к конкретной практике — ло теья уже один постулат дошёл
Прежде чем такие графики кидать, нужно описать что и на какой скорости работает
у тебя RS485 в железе есть? Можешь сделать стенд и проверить свои теории на практике на разных скоростях/длинах/резисторах ?
Рис.10 Прибор подключен длинным отводом (3 м) к сегменту сети RS-485

Более подробно об этом можете прочитать в статье Maxim's Application Note 373 январь 2001 года

Для анализа качества согласования линии связи применяют тестовые функции. Обычно такая функция встроена в конкретный прибор или программу. Во время тестирования передатчик посылает в сеть заданную последовательность символов, а приемник на другом конце линии анализирует правильность приема этой известной ему последовательности символов. Сеть тестируется определенное количество времени, после чего по количеству ошибок делается вывод о качестве связи
Рис.8 Несогласованная сеть RS-485 (без терминатора) и ее итоговая форма сигнала (слева) по сравнению с сигналом, полученным на правильно согласованной сети (справа)
0
это классика. Наверное только ленивый это не читал. А вообще рекомендация такая. Чтобы четко понимать, что же происходит в линии — не нужно в линию пулять блоки информации. Правильнее — делать одиночное возмущение и его ловить осциллом. Тогда не будет что-то вроде такого в линии, как на рисунке. А вот кстати, и симуляция того, что на линии. Похоже, кстати, на настоющую:
Напряжение снято между линиями, как и в статье.
0
Я бы Вам очень рекомендовал не использовать потенциально бесконечные циклы, типа
while (PIND.3==1)   // Пока датчик уровня разомкнут. Этот датчик нижний - он отбивает 30 литров в ёмкости. 
    {
         PORTD.5=0;      // Открываем клапан, набираем воду
    };
советую всегда в таких условиях считать время выполнения и обрабатывать таймаут. Грубо говоря, мы открыли кран и ожидаем, что емкость наполнится (сработает датчик уровня) за 10 мин. Если прошло 15 мин, а датчик не сработал – рассматривать это как аварию, и предусмотреть в программе обработку такой ситуации.
+4
  • avatar
  • e_mc2
  • 04 октября 2015, 23:01
Разбираем далее линии:
Существует распространенная ошибка при проектировании линий передачи RS-485. Многие товарисчи отрезок линии проводят по печатной плате (существенный отрезок). Например, волновое сопротивление кабеля у нас 120 ом, а волновое сопротивление линии на печатной плате — 50. А далее снова кабель к следующему устройству, а в конце терминирующий резистор. Вроде все красиво, но это только на первый взляд: Смотрим картинку и любуемся:
0
0
Ой, да ладно человека пугать раньше времени. На расстояниях до 100м можно вообще на все эти согласования забить
0
Никто никого не пугает. Знание теории волновых процессов это плюс, а не минус. Я в давние времена никак не мог избавиться от всплесков выше уровня логики в сигнале, потому что не понимал природу длинных линий и понимание термина волновое сопротивление. Зато теперь мне понятно, куда лезть, что делать.
0
сталкивался с помехами на 485 даже на 5м куске провода. еще интересный случай был на 300м куске, когда в бобине все работало, а на объекте начало отваливаться
0
А если плавный переход сделать?
0
плавный можно сделать, в какой-то мере это приведет к размытию фронтов отраженного сигнала. Еще нужно понимать, что амплитуда сигнала будет меняться. Чем меньше волновое сопротивление, тем больший ток в кабеле при одинаковом напряжении. А если у нас одинаковый ток везде (нет отражений), то соответственно, чем меньше волновое сопротивление, тем меньше напряжение. Закон там нелинейный. Вот пример:
0
Как тогда сделать нормальный переход?
0
нормальный в каком смысле? Плавный переход — самый нормальный. Лучше не будет. Если хочется сохранить целостность сигнала — тогда на конце линии терминатор, а по приему — триггер шмидта. Ну или последовательно в начале линии терминатор, а в конце триггер шмидта по приему.
0
Блин… Какого Шмитта? Там дифференциальный приемник на входе. Мы ведь все ещё о 485 говорим?
0
дифференциальный приемник тоже имеет триггер шмидта. Разве нет?
0
Посмотрите документацию на конкретные варианты драйверов RS-485 и не выдумывайте «открытия». У драйверов на скорости 250 КБит (ADM483) и 20 000 КБит (ADM2486 20 Mbps) и SuperRS485 (SN65HVD23 до 160 м при 25 Мбит/с (с коррекцией АЧХ усилителя на входе приемника)) разные технические характеристики :)
0
вы хорошо блестнули чешуей, только вопрос остался без ответа. У них у всех поди триггерры шмидта имеются. Они даже механические бывают
0
Твои выдумки не отображены в документации http://www.ti.com/lit/ds/symlink/sn65176b.pdf
Микросхемы я знал ещё до околопедии — Шило на ночь возьми почитать
http://s019.radikal.ru/i643/1510/1c/457f74475710.jpg
0
0
50 мВ на амплитуде 12В?
Сравни с 0,5В триггера Шмитда 555ТЛ2
img src=«we.easyelectronics.ru/uploads/images/00/08/83/2015/10/27/c6a2e2.jpg» alt="" />
Наличие гистерезиса не означает наличие Триггера ;)
0
Правильно говорите, гистерезис есть и у магнитного сердечника трансформатора, и это сложно назвать триггером шмитта, потому как там нет никаких переключений. Однако здесь (в этом документе) имеется ввиду именно нечувствительность к переключению в определенном диапазоне амплитуды, что само по себе является триггером шмитта.
0
все остальные моменты, типа ТЛ2 или что иное — это лишь частности.
0
Плавный переход — самый нормальный.

Вот это я и имел в виду.
Закон там нелинейный
Где можно подробней почитать про нелинейность плавного перехода?
0
вообще, для этого можно воспользоваться Signal Integrity в Altium Designer. а вообще рекомендации следующие:
Чем толще проводники, чем дальше они друг от друга, чем тоньше диэлектрик между парой и полигоном, тем меньше волновое сопротивление. Есть статья интересная на тему, в принципе хорошо описано.
0
здесь в статье есть формулы расчета амплитуды
0
Все-равно не понимаю где там нелинейность искать. Разве импеданс микрополосковой линии зависит от амплитуды волны?
0
Все наоборот. Амплитуда сигнала зависит от волнового сопротивления линии. Ну здесь же все просто:
Что такое распространение сигнала — это ток в линии. Представим себе, дали на выходе напряжение — потек ток, значение которого соответствует волновому сопротивлению линии. Закон ома ёлы-палы. т.е. если воновое сопротивление линии 100 Ом, то при напряжении в 5 вольт мы получим 5/100 = 50мА. Далее, если нам удастся сделать переход к волновому сопротивлению линии без переотражений, то это будет означать, что ток в линии остался прежним, но вот амплитуда напряжения изменится. Формулу выше в статье можно подглядеть. k = (2* Z2)/(Z1+Z2) (Вот эту нелинейность я имел ввиду); Т.е. если у нас уменьшится волновое сопротивление линии — нужно быть готовым к тому, что уменьшится и амплитуда сигнала и наоборот!
0
Почему это не работает на коротких линиях или низких частотах? Ответ очевиден — многократные переотражения туда-сюда выравнивают уровни напряжений быстрее и раньше, чем медлительная система способна отреагировать. В свое время сталкивался с тем, почему когда ставишь микруху серии AC — с другой стороны линии были короткие выбросы? Вот тогда бы мне эти знания…
0
вариант согласования линий разных волновых сопротивлений:
0
но это кривой способ, во первых, только односторонний, во вторых, сильно падает амплитуда сигнала
0
но вот для согласования кабеля 75 ом и 50 ом для принимающей стороны — вполне реально. В разрыв между ними нужно вставить сопротивление 25 ом (разность между волновыми сопротивлениями кабелей). Амплитуда тоже упадет, но не сильно, зато переотражений не будет
0
Ну тогда я себе это так представляю: дорожка на плате->плавный переход->линия передачи->плавный переход->дорожка на плате. То есть симметрично. Если при переходе от платы к линии передачи амплитуда уменьшится, то с обратной стороны при переходе от линии передачи к плате она увеличится обратно. Или я не прав?
0
А что мешает проложить по плате линию с требуемым волновым сопротивлением?
0
Она же все равно должна быть согласована с микросхемой?
0
На расстояниях сильно меньше длины волны это уже несущественно, насколько я помню. Плавный переход к ножкам AFAIK не вызывает особых проблем даже у интерфейсов, работающих на нескольких гигабитах.
0
у таких скоростных интерфейсов обычно соблюдается волновое сопротивление на всем протяжении линии, на платах, на кабелях, а так же разъемах.
0
Но и там есть переходы от линии передачи к пинам разъема, где волновое сопротивление не выдерживается:

0
P.S. Я, собственно, именно об этих переходах и говорил.
0
кстати, это совершенно не факт. Тонкая пара + полигон с другой приблизительно равно толстым дорожкам без полигона. Но действительно короткие изменения в линии не ведут серьезные переотражения. Они конечно же есть, но это сотые доли наносекунд. Но пока что у нас нет таких скоростей.
0
Я не о контактной паре, а о переходе к ней с печатной дифпары. И я говорю именно о «действительно коротких участках» — когда они намного короче длины волны, существенного влияния на сигнал они не оказывают.
0
согласуют не микросхему, а линию передачи
0
иногда нужно над полигоном протянуть по плате для помехозащищенности, А это сразу сильно влияет на емкость линии, что усложняет сделать линию, например 120 Ом. Так что, разные могут быть условия.
0
уменьшится, если линия имеет меньшее волновое сопротивление.
0
Может вы имели в виду частотную зависимость?
0
частотная зависимость тоже имеет место, только здесь я вам ничего не подскажу.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.