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

NicksonWer

Members
  • Постов

    14
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные NicksonWer

  1. После переустановки винды, переустановил и Альтиум. 
    Но вот в разделе Создания нового компонента отсутствует лист чертежа.
    Так же появился странный эффект, если я захочу изменить масштаб, то картинка приближается на максимум и не хочет отдаляться. 

    Снимок1.JPG

    Снимок2.JPG

  2. Создал схему, вероятно, используя версию библиотеки, к компонентам которой не был прикручен footprint. 
    После библиотека была дополнена, были прикреплены все footprint и сохранена. Окончательная версия.
    После, когда пришла пора разводить плату по схеме, было обнаружено, что почти все компоненты не имеют footprint.
    Не разобравшись, было решено вручную перейти в каждый компонент на схеме и прицепить footprint. Было геморно, но сделано.

    После заново сгенерировал элементы на pcb. все footprint на pcb появились. УРА.

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

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

    photo_2021-01-13_10-25-57.jpg

    photo_2021-01-13_10-26-51.jpg

  3. 9 часов назад, Yurkin2015 сказал:

    Тут надо знать, что функция serialPort1_DataReceived() вызывается на каждый принятый байт. К примеру, посылаете от МК на компьютер строку "655". Строка поылается символ за символом, т.е. сначала принимается символ "6". Приняли только первый символ, как тут же вызывается serialPort1_DataReceived(), и в переменную dataIN записывается "6".

    Затем принимаемся следующий байт "5". Но Windows не система реального времени, в ней вызов функций может происходить с задержкой. Поэтому пока вызывается serialPort1_DataReceived() может успеть приняться следующий байт. В буфере КОМ-порта уже будет сидеть "55", и в переменную dataIN это и запишется, предыдущая "6" пропадёт.

    После этого всё успокоится, и настанет время выводить данные в label, и нарисуется только последний принятый обрывок строки, т.е."55".

    Надо поступить так, например. Перед посылкой в МК команды, надо очистить переменную

    
    dataIN = "";

    Затем при приёме в переменной dataIN накапливать полученные байты операцией +=

    
    dataIN += serialPort1.ReadExisting();

    Как только приняли 3 байта - можно выводить  накопленную строку в label

    
    if(dataIN.Length >= 3 ) this.Invoke(new EventHandler(ShowData));

     

     

    Если строка  if (dataIN.Length >= 3) this.Invoke(new EventHandler(ShowData)); ожидает пока не наберётся масссив на три элемента , то как сделать так, чтобы оператор if ждал пока не появится стоп-символ? Например, "%"

  4. 8 часов назад, Yurkin2015 сказал:

    Тут надо знать, что функция serialPort1_DataReceived() вызывается на каждый принятый байт. К примеру, посылаете от МК на компьютер строку "655". Строка поылается символ за символом, т.е. сначала принимается символ "6". Приняли только первый символ, как тут же вызывается serialPort1_DataReceived(), и в переменную dataIN записывается "6".

    Затем принимаемся следующий байт "5". Но Windows не система реального времени, в ней вызов функций может происходить с задержкой. Поэтому пока вызывается serialPort1_DataReceived() может успеть приняться следующий байт. В буфере КОМ-порта уже будет сидеть "55", и в переменную dataIN это и запишется, предыдущая "6" пропадёт.

    После этого всё успокоится, и настанет время выводить данные в label, и нарисуется только последний принятый обрывок строки, т.е."55".

    Надо поступить так, например. Перед посылкой в МК команды, надо очистить переменную

    
    dataIN = "";

    Затем при приёме в переменной dataIN накапливать полученные байты операцией +=

    
    dataIN += serialPort1.ReadExisting();

    Как только приняли 3 байта - можно выводить  накопленную строку в label

    
    if(dataIN.Length >= 3 ) this.Invoke(new EventHandler(ShowData));

     

     

    Сделал всё так как Вы описали.
    Всё заработало. 
    Большое Вам спасибо!

  5. 2 минуты назад, Yurkin2015 сказал:

    Ваша программа состоит из нескольких частей-потоков, которые работают параллельно, то есть якобы одновременно выполняются разные части программы. Один поток рисует лэйблы на экране, другой принимает данные из КОМ-порта. В C# нельзя просто так использовать один ресурс из разных потоков. Функция приёма байтов может активизироваться внезапно при поступлении байта в порт, из неё нельзя рисовать лэйбл, потому что , может, в этот же момент другой поток тоже что-то рисует на этой же лэйбле. Возникает конфликт "кто главнее". 

    Вместо прямого рисования при поступлении байта функция генерирует событие ShowData в системе, мол, обнови метку на экране. Это событие помещается в общую очередь событий. И когда у рисовального потока дойдут руки и он среагирует на это событие, тогда метка спокойно обновится на экране новой строкой.

    Спасибо за объяснение. Да, принцип другой нежели у микроконтроллеров, где один поток, да прерывания....

  6. 2 часа назад, Yurkin2015 сказал:

    Тут надо знать, что функция serialPort1_DataReceived() вызывается на каждый принятый байт. К примеру, посылаете от МК на компьютер строку "655". Строка поылается символ за символом, т.е. сначала принимается символ "6". Приняли только первый символ, как тут же вызывается serialPort1_DataReceived(), и в переменную dataIN записывается "6".

    Затем принимаемся следующий байт "5". Но Windows не система реального времени, в ней вызов функций может происходить с задержкой. Поэтому пока вызывается serialPort1_DataReceived() может успеть приняться следующий байт. В буфере КОМ-порта уже будет сидеть "55", и в переменную dataIN это и запишется, предыдущая "6" пропадёт.

    После этого всё успокоится, и настанет время выводить данные в label, и нарисуется только последний принятый обрывок строки, т.е."55".

    Надо поступить так, например. Перед посылкой в МК команды, надо очистить переменную

    
    dataIN = "";

    Затем при приёме в переменной dataIN накапливать полученные байты операцией +=

    
    dataIN += serialPort1.ReadExisting();

    Как только приняли 3 байта - можно выводить  накопленную строку в label

    
    if(dataIN.Length >= 3 ) this.Invoke(new EventHandler(ShowData));

     

     

    Замечательно!
    Спасибо. Вечером обязательно попробую реализовать и после тпишусь.
    А пока еще небольшой вопрос. 
    В коде, в функции serialPort1_DataReceived есть такая стока как:
     

    this.Invoke(new EventHandler(ShowData));

    Что она делает??? не могу понять

  7. Доброго времени!
    За несколько дней пришлось в спешке освоить C# и по примерам накидать приложение.
    По большому счёту всё работает, но есть небольшая проблема, которую нужно исправить.

    Описание проекта. 
    - микроконтроллер подключён к ПК через COM-порт;
    - программа раз в секунду шлёт МК символы поочерёдно "0","1"или "2";
    - МК в зависимости от пришедшего символа даёт соответствующий ответ: если "0", то возвращает "333", "1" - "322", "2" - "655";
    - Программа получив ответы, разлаживает их в соответствующие элементы: Если было отправлено "0", то вернувшийся ответ "333" положить в label14;          "1" - "322" = label15;          "2" - "655" = label10

    Вот такая тестовая незамысловатая логика для теста работоспособности.

    Проблема в том, что значения не всегда выводятся полным значением. Как можно видеть на скрине, первое значение вместо "333" вывелось только "33", "322" вывелось полностью, и "655" только "55".
    При следующей итерации может уже получиться другой вывод....

    Краткое описание кода программы:
    - код имеет подключенный Таймер, прерывание которого срабатывает раз в 1000 мс
    - после соединения по КОМ-порту включается таймер и раз в секунду отправляется значение "0" "1" либо "2".
    - в функции serialPort1_DataReceived происходить приём данных в переменную типа string dataIN
    - в функции ShowData происходит работа с содержимым dataIN. В зависимости от отправленного символа, ответ помещается в соответствующий элемент

    Скрытый текст
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO.Ports;
    
    namespace AstroCanon
    {
        public partial class Form1 : Form
        {
            string dataIN;
            private int counter_timer; // хранит передаваемое число плате для получения данных
            private int q;
            private int count;
            private int label_2, label_3;
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                string[] myPort;
    
                myPort = System.IO.Ports.SerialPort.GetPortNames();
                comboBox1.Items.AddRange(myPort);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                serialPort1.BaudRate = 115200;
                serialPort1.PortName = comboBox1.Text.ToString();
                if (serialPort1.IsOpen == false)
                    serialPort1.Open();
    
                button1.Enabled = false;
                timer1.Enabled = true;
    
                label1.Text = "ON";
                label1.ForeColor = Color.Green;            // изменить цет на зелёный 
    
                
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                serialPort1.Close();
                button1.Enabled = true;
    
                label1.Text = "OFF";
                label1.ForeColor = Color.DarkRed;
    
                timer1.Enabled = false;
            }
    
            private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                dataIN = serialPort1.ReadExisting();
                this.Invoke(new EventHandler(ShowData));
    
    
    
         
    
    
            }
    
            private void ShowData(object sender, EventArgs e)
            {
                richTextBox1.Text += dataIN;
    
                 if (count == 0)
                {
                    // int data0 = Convert.ToInt32(str);
                    label14.Text = dataIN;
                    return;
                }
                if (count == 1)
                {
                    //  int data1 = Convert.ToInt32(str);
                    label15.Text = dataIN;
                    return;
                }
                if (count == 2)
                {
                    //  int data2 = Convert.ToInt32(str);
                    label10.Text = dataIN;
                    return;
                } 
    
               
            }
                
            private void timer1_Tick(object sender, EventArgs e)
            {
    
                if (count <= 3) count++;                    // инкрементирует значение для дальнейшей передачи в устройство;
                if (count >= 3) count = 0;                 
    
                string str_с = Convert.ToString(count);
                serialPort1.Write(str_с);
    
               
    
                
    
               // label7.Text = data0;
    
    
                //  string str = Convert.ToString(counter_timer);
    
                //  serialPort1.Write(str);
    
                //  richTextBox1.Text += dataIN;
                //  int a = Convert.ToInt32(dataIN);
                //  return;
                //label2.Text = Convert.ToString(a);
    
                // label2.Text = Convert.ToString(counter_timer);
                // if (count == 3)   label3.Text = Convert.ToString(label_3);
    
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                count = 2;
                string str = Convert.ToString(count);
                serialPort1.Write(str);
    
    
    
                // string str = Convert.ToString(counter_timer);
                //serialPort1.Write((string)counter_timer);
                // serialPort1.Write("3");
                //label2.Text = Convert.ToString(dataIN);
    
    
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                count = 3;
                string str = Convert.ToString(count);
                serialPort1.Write(str);
            }
    
            private void button6_Click(object sender, EventArgs e)
            {
    
            }
    
            private void label16_Click(object sender, EventArgs e)
            {
    
            }
    
            private void label20_Click(object sender, EventArgs e)
            {
    
            }
    
            private void label2_Click(object sender, EventArgs e)
            {
    
            }
        }
    }

     

     

    Безымянный1.jpg

  8. 24 минуты назад, 100482 сказал:

    @NicksonWer Дело ваше и проблема ваша.

    Если надо решать проблему, смотрите как сделано промышленное измерительное оборудование.

    Не дураки же они, загоняя схемы в металлические корпуса и по максимуму используя экранированные провода и т.п..

    не  вижу смысла в ваших ответах. зачем вы здесь?

  9. Приветствую!
    Собрал датчик температуры влажности и давления на основе сенсора bme280

    b7320e67542b.jpg

    Заявлено, что датчик имеет высокую чувствительность при широком диапазоне:
    И когда подключаешь один датчик, то видишь его хорошую работу. Помещали за окно, помещали в холодильник, в морозильник..., всё было хорошо.

    Но когда собрал несколько устройств, то заметили, что они все врут относительно друг друга. Собрали 8 устройств, поместили их в одну и туже среду, но каждый датчик показывает свою правду, которая выходит за предел допуска.
    Такая разность в показания как по температуре так и по влажности.

    8e5382937402.jpg

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

    После было решено купить промышленные датчики, специально предназначенные для применения в промышленности, так как bme280 всё же предназначены для быта в лице смартфонов и умных часов. Новые сенсоры имеют такие же характеристики.
    Новый датчик HIH8121-021-001 HONEYWELL

    dfc83d9d07ff.jpg

    Но как оказалось и девайсы на этом сенсоре работают в разнобой.

    ....

    После я как-то наткнулся на видео-презентацию от не малоизвестной компании Овен с их девайсом ПВТ-10. Из презентации я узнал, что они в качестве сенсора используют практически такой же как bme280, SHT21. Но так же из презентации я узнал, что они используют какую-то термокомпенсацию. Может это то, что мне нужно?

    1ab8e8f8fa70.jpg

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

  10. 24.01.2020 в 12:00, Falconist сказал:

    Кому кто и что "должен"?

    тогда не понимаю, зачем вообще что-то писать? Ради галочки? 

    24.01.2020 в 12:19, 100482 сказал:

    Я бы назвал этот монтаж бородой.

    У вас @NicksonWer  чувствительная измерительная система, а сделана как ардуинка на проводочках.

    Измерительные сенсоры вообще бы 100 метровой бухтой провода ещё бы соединили.

    Даже щупы осциллографа, лежащие на схеме будут ловить помехи.

    Земляные полигоны на плате, могут прилично улучшить картинку.

    Дерево если ещё покрыть лаком, вообще будет смотреться круто, но только металл.

    Экранировку плат, отдельных узлов надо не забыть.

    Короче, информации, книжек полно и нужно основательно изучать.

    Или пригласить специалиста.

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

    24.01.2020 в 18:31, Co_balt сказал:

    Я бы сделал по классике - ОУ, АЦП, ИОН, оптическую развязка, малошумящий LDO на одной плате с питанием от аккумулятора. MCU со всей обвязкой на другой. Опять же подошел бы основательно к выбору ОУ. Есть специальные ОУ и схемы подключения в зависимости от типа фотодиода. Опять же непонятно как выполнен узел источник излучения - фотоприемник, возможно там боковые засветы или еще чего

    Интересно, какой аккумулятор должен быть,  чтобы питать плату (насосы) круглосуточно))))?
    ОУ выбран основательно.
    Засветок нет. Из примера же видно, что проблема не в засветке а наводках

     

  11. 21.01.2020 в 10:29, Dr. West сказал:

    Люди, блин, динамическую индикацию и обмен по шинам приостанавливают, когда делают преобразование в АЦП, ради снижения помех. А у вас в питании чувствительного измерителя ИИП от ноутбука. А потом удивляемся, чего так шумно.
     

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

    21.01.2020 в 10:35, DoG70 сказал:

    Ладно, добавлю "не умный" комментарий. Те веревки, которые висят у вас по всей доске могут собирать всё, что угодно, вплоть до магнитной бури на Марсе. Надо было еще длиннее сделать.

    Сделать нормальные платы с хорошей "землей", правильно соединить и где надо заэкранировать. Поставить фильтры по питанию. Доработать БП и проблема уйдет. Но в вашем случае, видимо, лучше подождать умных комментариев. 

    что есть нормальные?  
    Что значит правильно соединить? где нужно заэкранировать? 
    Какой блок питания добавить????? он и так питается от блока.
     
    P.s. В школьные года учителя двойки ставили за такие ответы. Ответ должен быть полный, если начал отвечать, а иначе смысла в нём нет.

  12. Доброго времени!

    Суть дальнейшего моего повествования связана с наводками на прототипе фотометрического оборудования. Вот фото данного прототипа:

    414f201676d5.jpg

    57fa6929f315.jpg

    Если опусти работу таких узлов как управление насосами накачки жидкости, насос откачки жидкости, управление воздушным компрессором, то суть устройства сводится к аналоговой части: ацп микроконтроллера и схемы усилителя фотодиода. Вот блок-схема и принципиальная схема усилителя фотодиода:

    5ac90e858338.png

    1817824c9a9a.png
    Далее 6 ножка ОУ подаётся на вход ацп микроконтроллера.

    Печатные платы сделаны таким образом, что схема ОУ и фотодиод расположены на одной плате, а микроконтроллера на другой – основной плате. Плата фотодиода разведена таким образом, что вход ОУ имеет земляную петлю, нижняя сторона является общей землёй:

    9a45f7b66000.png

    В целом, эта плата работает нормально. Я ее проверял питая от аккумулятора и сигнал на выходе хороший и чистый.

     

    Проблема сама вот в чём. Что когда всё собрано во едино, а точнее, прототип запитан от внешнего сетевого адаптера от ноутбука, то сигнал превращается в бороду:

    714bf2c866dd.jpg

    Судя даже по этому показометру, размах равен около 35-40 мв при частоте в 50 Гц.  И когда я просто подношу ладонь к плате фотодиода на расстояние в 20-50 мм, то размах увеличивается уже за 100 мв.

    Тут нужно пояснить вот какой факт. Сейчас я питаю схему ОУ и фотодиода от отдельного аккумулятора (его видно на фото ниже), Так я думал, что питая от общего источника аналоговую часть и цифровую, даёт такой результат.

    82a92aa4e7a7.jpg

    Но как показала практика, что питать от аккумулятора, что от общего источника, результат одинаковый.

     

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

    Но если выдернуть провод питания от этой конструкции, то результат на показометре следующий:

    85c2ec57e8a1.jpg

    Размах снизился до менее 10 мв и частота увеличилась примерно до 400 Гц. Вероятно тут уже собственные шумы показометра + незначительные наводки на схеме ОУ. Пока писал этот текст включил приборчик, чтобы посмотреть на его показания с отключённым щупом, вот результат:

    85c2ec57e8a1.jpg

    Вердикт.

    Проблему в том, что устройство питается от сети. Как побороть эту беду?

    P.s. Есть еще один интересный момент. Когда я пальцем дотрагиваюсь до полигона, но борода исчезает, как будто я действую как-то своей ёмкостью на схему.

    IMG_20200120_155309.jpg

    Документ Microsoft Word (2).pdf

  13. Привет!

    Мне необходимо изготовить терморегулятор для контроля температуры в 200 градусов. Но первоначальной задачей является научиться измерять температуру. Вот что я сейчас имею.

    Фото: усилитель для термопары, входной и выходной сигнал при проверке.

    Видео: суть и проблема. https://vk.com/video?z=video284356562_456239075%2Fff306c9de1b8e8cc3a%2Fpl_updates

    post-189237-0-40125800-1469130771.jpg

    post-189237-0-46002500-1469130792_thumb.jpg

    post-189237-0-03524800-1469130809_thumb.jpg

×
×
  • Создать...