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

Kostyanskiy

Members
  • Постов

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

  • Посещение

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

  1. В 16.12.2022 в 01:43, drubtsow сказал:

    R128 — 10 kOm

    R127 — 1 mOm

    Известно, за что они отвечают?

    У меня инвертор недозаряжает аккумулятор (110Ач) так есть предположения, что это входной делитель так попробывать с ним поиграться 

  2. Дело в том, что я по не внимательности, в ходе диагностики втыкнул разъем трансформатора не в тот разъем на плате (обозначил красным) - вылетел предохранительный резистор (обозначил желтым). Заменил резистор все напряжения на плате вернулись в норму, но, наблюдаю такое поведение:

    Включается в режиме стабилизатора, и дико переключает реле + пищит, и если немного подождать, на дисплее засвечивается надпись overload, хотя на выходе никакой нагрузки нету.

    И стаб на 12 В ведет себя странно, занижая напряжение до 10 В

    10 часов назад, _abk_ сказал:

    Ух ты! У вашего стабилизатора есть такой режим? Круто!

    Знаю, я умею привносить новшества в конструкцию:D

    IMG_20221201_145954.jpg

    IMG_20221201_151727.jpg

  3. У меня откудато вылезла еще одна проблема, при включении в режиме стабилизатора без транзисторов,  дико переключается одно из реле и контроллер пишет overload, на выход ничего не подключено, это как?

  4. Все КЗ(23Ома) ушло в мозги, но тогда у меня вопрос, как он работает, показывает на дисплее параметры и работает в режиме стабилизатора? И там интерестный контроллер HT32F65230. По всем питаниям 23 ома

    image.png.bad1fa2bfeb8b2505b7339fa46923422.png

  5. 2 часа назад, drubtsow сказал:

    Ненормально, замени LM317 и проверь её обвязку 

    Спасибо, как заменю, отпишу

    Цитата

    Я такое наблюдал если в режиме измерения сопротивления подключится к ëмкому конденсатору. может он там гдето? 

    Я тоже так подумал, надо попробовать емкостя повипаивать и замерить 

  6. @drubtsow А это нормально, что между стоком верхнего плеча и истоком нижнего плеча с не установлеными транзисторами (на клемах акуммулятора), присутствует падение напряжение 0.2В и постепенно оно растет в бесконечность, при обратном подключении щупов все повторяется но со знаком минус ?

    Изменено, на этом кондере КЗ

    image.png.4f317430c4119e0ada190eeb51636a94.png

  7. Здравствуйте, уважаемые форумчане. У меня проблема с бесперебойником с чистым синусом sinusPRO 500E. 

    Предыстория: после покупки некоторое время работал исправно, тянул на себя нагрузку ввиде котла центрального отопления, но в один момент, при включении без нагрузки, с него "вышла душа" - пошел дым. 

     

    Разобрав его, я увидел взорванный затворный резистор. Первым делом я заменил его и прозвонил транзисторы, увидел, что они пробиты одним полумостом, как будто по ним прошел сквозной ток. Остальные были живы (те что в другом полумосте). В каждом плече было по 3 транзистора HY3205, аналог IRF3205. Включение прибора без транзисторов в сеть переводит его в режим сетевого стабилизатора. На транзисторах генерации ШИМа в этот момент нету.

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

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

  8. 6 минут назад, Lexter сказал:

    Теорию изучайте по учебникам

    За этим, я сюда и пришел

    4 минуты назад, Lexter сказал:

    Титце и Шенка "Полупроводниковая схемотехника"

    Понял, спасибо за наводку, буду изучать

  9. Здравствуйте, подскажите пожалуйста литературу по логарифмическим усилителям (ЛУ) на операционниках и их применению. Я вияснил, что основное применение ЛУ является сжатие динамического диапазона сигналов с широким динамическим диапазоном. И с основной теорией, думаю, разобрался отсюда и отсюда, но конечное применение не особо, и мне не понятно зачем в аналоговых регуляторах тока и напряжения стоят такие схемы. Пример: 

    image.png.c2cb8bf651a13a792584a1641c594f7f.png

    Рисунок 1. Схема имеет смещение на неиинверт. входе, как это учесть в расчетах ЛУ и какую функцию выполняет диод если в схеме стоит конденсатор. (не похоже на класическую схему ЛУ).

    image.png.bc9a886c249f744a2718a4b7ad4265f3.png

    Рисунок 2. Диод D6 и стабилитрон D5 какие функции выполняют в цепях обратной связи? Со стабилитроном могу предположить, что это ограничение верхнего диапазона вых. напряжения ОУ с гистерезисом.

  10. 14 часов назад, Огонёк сказал:

    Что там, что тут - непонятная шаманская бормотуха, верно?

    13 часов назад, Alex сказал:

    Жесть. Как можно писать код и не понимать, что ты пишешь ? На что можно надеяться ?

    Этот код правился и дорабатывался безчисленное количество раз, и так как проект старый, помнить где какие ошибки я не могу, и я не сразу обратил внимание на ваше @Огонёк замечание. Я не помню всего что делал довольно давно, и не могу сказать зачем делал указатель на указатель.

     

    P.S: Наверное тогда я принимал только один байт, и у меня буфер sReceivedChar не был масивом

  11. В 21.07.2022 в 22:17, Огонёк сказал:

    Получился указатель на указатель.

    А оно что так, что так не работает...

     

    Я сейчас тестирую программу на ПК из USB-COM адаптером на CH-340, и пока ничего не выходит, нашел одну статейку, как перевести COM порт в асинхронный режим "overlapped", сделал все как в статте, на WINAPI, и чего-то не фурычит.

    Вот статья https://studfile.net/preview/1506844/

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

    DWORD WINAPI ReadThread(LPVOID)
    {
    	overlapped.hEvent = CreateEvent(NULL, true, true, NULL); //создать сигнальный объект-событие для асинхронных операций
    	SetCommMask(COM_PORT, EV_RXCHAR); //установить маску на срабатывание по событию приёма байта в порт
    	while (1) //пока поток не будет прерван, выполняем цикл
    	{
    		WaitCommEvent(COM_PORT, &mask, &overlapped); //ожидать события приёма байта (это и есть перекрываемая операция)
    		signal = WaitForSingleObject(overlapped.hEvent, INFINITE); //приостановить поток до прихода байта
    		if (signal == WAIT_OBJECT_0) //если событие прихода байта произошло
    		{
    			if (GetOverlappedResult(COM_PORT, &overlapped, &temp, true)) //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
    				if ((mask & EV_RXCHAR) != 0) //если произошло именно событие прихода байта
    				{
    					ClearCommError(COM_PORT, &temp, &comstat); //нужно заполнить структуру COMSTAT
    					btr = comstat.cbInQue; //и получить из неё количество принятых байтов
    					if (btr) //если действительно есть байты для чтения
    					{
    						ReadFile(COM_PORT, DataReceived, BUFF_SIZE, &iSize, &overlapped); //прочитать байты из порта в буфер программы					
    					}
    				}
    		}
    	}
    	CloseHandle(overlapped.hEvent); //перед выходом из потока закрыть объект-событие
    }	
    	
    void COM_PORT_READ(char* data)
    {
    	memcpy(data, DataReceived, BUFF_SIZE);
    }

    В отладке, у меня все стопорится на этой точке ReadFile(COM_PORT, DataReceived, BUFF_SIZE, &iSize, &overlapped); и btr принимает вообще рандомные значения 

  12. @codenamehawk Я уже решил проблему, да, я так и поступил, спасибо, отслеживаю по 0x0D или "/r" в конце, этого хватает 

    ISR(USART_RX_vect) //Прерывания после приема
    {   
        if ((UCSR0A & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN)) == 0)
        {
           char UDR = UDR0;
           
           if (UDR != 0x0D)
           {
               sReceivedChar[rx_count] = UDR;
               if (rx_count < sizeof(sReceivedChar) - 1) ++rx_count;
           }
           else
           {
               sReceivedChar[rx_count] = 0;
               rx_count = 0;
               FlagRecievData = 1;
           }
        }
    }

    Теперь немного другая проблема - связь с ПК.

    Проблема с приемо-передачей по UART.
    Работаяю я в Visual Studio CLI/C++


    После открытия порта включаю девайс подключенный к этому порту через USB-COM адаптер на CH-340. При запуске програми на ПК, она шлет в порт просьбу отослать вот этот код: например - "OK" и если получает его, то можно работать дальше.

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

    while (!(strcmp(dataReceive, "OK") == 0))
    {
           COM_PORT_WRITE("CH_STS\r");                 
           COM_PORT_READ(dataReceive);
    }

    ПК отсылает "CH_STS", устройство должно ответить "OK"

    Внутри этих функций вот:

    void COM_PORT_WRITE(char* dataTransmit)
    {
        memcpy(data, dataTransmit, sizeof(data));
        WriteFile(COM_PORT, data, dwSize, &dwBytesWritten, NULL);
    }
     
    void COM_PORT_READ(char *dataReceived)
    {
        ReadFile(COM_PORT, &sReceivedChar, sizeof(sReceivedChar), &iSize, 0);       
        if (iSize > 0)
        {
            memcpy(dataReceived, sReceivedChar, sizeof(sReceivedChar));
        }       
    }


    В терминале COM порта все работает отлично, как мне сингронизироваться?

    image.png.c403e226166b4e4980bcfcaaf7d3995c.png

  13. @Yurkin2015 А вот это уже реально не понятно, откуда \r в начале строки, и почему 9-ка пропала в конце?:huh: 

    image.png.6be9cdb6dc691735be6a6a7300faa1f4.png

    P.s Недозаписался символ в конце при проверке условия UDR0 != 0x0D, исправил так, 

    if (UDR0 != 0x0D)
           {
               sReceivedChar[rx_count++] = UDR0;
               if (rx_count > sizeof(sReceivedChar)) rx_count = 0;        
           }
           else
           {
               sReceivedChar[rx_count] = UDR0;
               sReceivedChar[rx_count + 1] = 0;
               rx_count = 0;
               FlagRecievData = 1;
           }          

    Но что делать с  \r в начале, и как он там появляется, не понятно.

  14. @Yurkin2015 благодарю, но я так и не понял с чем это связано, это по меньшей мере не логично, ведь прерывание это не цикл, где  можно почитать? В даташите я не помню чтобы это было описано. 

    И тут еще один такой момент есть, я читаю строку по ЮАРТ и походу не могу считать буфер в который я её записываю,  идея такая:

    При получении строки считывать регистр на приянятые данные, если там есть знак переноса строки, то у нас уже конец строки и в основном цикле парсим данные и понимаем какое условие выполнять, так проблема в том, что условие strcmp или strstr не читают данные с буфера приема, что порекомендуете сделать?

    Вот код прерывания

    ISR(USART_RX_vect) //Прерывания после приема
    {   
        if ((UCSR0A & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN)) == 0)
        {
           while (UDR0 != 0x0D) 
           {
              sReceivedChar[rx_count++] = UDR0;       
              PORTB ^= (1<<5);
              if((UDR0 == 0x0D) && (FlagRecievData == 0)) FlagRecievData = 1;
           }            
        }
    }

    Вот код парсира, если убрать эту строку (strcmp(sReceivedChar, "1") == 0), то соответственно все заработает по приходу рандомного символа в порт

    int main(void)
    {   
        UART_Init(103); //9600
        DDRB |= (1<<5);
    
        while (1) 
        {
            if((strcmp(sReceivedChar, "1") == 0) && (FlagRecievData == 1))
            {
               UART_Transmit("OK");
               UART_Transmit((const char*)sReceivedChar);
               FlagRecievData = 0;
            }
        }
    }

     

  15. Здравствуйте, у меня похожая проблема, не срабатывает прерывание по приему, помогите разобраться пожалуйста

    void UART_Init(unsigned int speed)//Инициализация модуля USART 8bit, 2 stop bit
    {
        cli();
        UBRR0H = (speed & 0x0F00) >> 8;
        UBRR0L = (speed & 0x00FF);
        UCSR0B |= ((1 << TXEN0) | (1 << RXEN0) /*| (1 << TXCIE0)*/ | (1 << RXCIE0));
        /* Set frame format: 8data,  2stop bit  */
        UCSR0C = (1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);
        sei();
    }
    
    ISR(USART_RX_vect) //Прерывания после приема
    {     
       PORTB ^= (1<<5);    
    }
    int main(void)
    {   
        UART_Init(103); //9600
        DDRB |= (1<<5);
    }

    P.s: было выяснено, что прерывания работает как бесканечный цикл, чего не должно быть, но оно есть.

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

    Замкните RX TX и отправьте данные в терминале, посмотреть что терминал отправляет. Попробуйте снять галку +CR так вместе с данными отправляются еще служебные символы.

    Снял галочку и данные данные пошли непрерывным потоком, переподключил устройство, выдало все как на кратинке выше. Все пришло в тупик...

     

  17. Здравствуйте, мне надо как-то синхронизировать работу МК с компьютером, идея такая:

    Отсилаю кодовое слово по UART на МК, и МК уже посилает в ответ данные на соответствующее кодовое слово

    Проблема в том, что у меня код работает не стабильно и при отсилке ключевого слова, я не всегда получаю данные в ответ.

    Я пробивал и через Terminal v1.9, но ситуация такая же...

    Вот код МК:

    while (!(PIND & (1<<SET_APM_UART_MODE))) //нажата кнопка, пин на минусе
        {
            if (strcmp((const char*)sReceivedChar, "CH_STS") == 0) // Парсинг кодового слова
            {
                UART_Transmit("OK"); //Ответ
            }
        }

    И принимающая часть:

    ISR(USART_RX_vect)
    {   
             sReceivedChar[rx_count++] = UDR0;
             if (rx_count > sizeof(sReceivedChar)) rx_count = 0;
    }

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

    image.png.8304800e2b6343b6a2f642f4611696fe.png

     

     

  18. Не у одного вас такая проблема, такие аномалии, думаю не один я уже встречал в своих проектах с дисплеями особенно под AVR, но причини каждого случая свои. Проверьте осликом или лог. анализатором, наличие  тактирующего сигнала и MOSI шины SPI, при инициализации дисплея.

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

  19. Доброго времени суток, у меня стоит задача подключить широкополосною лямду к Atmega8/328 и выводить данные стихеометрической смеси на дисплей, только вот не понимаю как считывать показания с датчика, как управлять ионным насосом, который там имеется, и какие формулы и алгоритмы применять. В сети есть примеры, например вот, но адекватной схемы на ОУ туда не завезли, не понятно что куда подключать и как это работает. 

  20. Здравствуйте, решил я сделать себе генератор простеньких сигналов на меге8 (попрактиковаться), начал изучать тему прямого цифрового синтеза, и уперся в преобразование Фурье (в матане я не шарю, пока, но я в процессе) и решил разобраться на готовом примере. Нашел я на просторах другого форума вот такой кусочек кода синтеза синуса: (если не сложно, можете объяснить пожалуйста, или дать направление, подсказку...)

    int main(void)
     {
        float dwTone = 9000;     //частота основного тона,Гц
        float dwFrequency = 800000; //частота дискретизации
        float Amplitude = 120;//амплитуда
    	 
    	 float x1=0, x2=0, y=0, k=0;
    	  char n = 127;
    	  	
    		k = 2*cos(2*M_PI*dwTone/dwFrequency);
            x1 = 0;  //начальные значения
    	  	x2 = -Amplitude*sin(2*M_PI*dwTone/dwFrequency);
    	 
    	 while (1)
    	 {
    	    y = k*x1-x2;
    	    x2 = x1;
    	    //x1 = y;
    	    if(y>n) x1=n;
    	    else x1=y;
    	    if(y<(-n)) x1=-n;
    	    else x1=y;
    	    
    	    Send(y+n);//Отправка на ЦАП
    	 }
     }

    Попытался разобраться сам, но безуспешно, думая что понял, я решил попробовать сделать что-то похожее, но с треугольным сигналом по формуле image.png.1655a0f6291085998bfd3f1cb0292554.png, вот что получилось, но мой код не работает:

    int main(void)
    {
        float dwTone = 9000;     //частота основного тона,Гц
    	float dwFrequency = 800000; //частота дискретизации
    	float Amplitude = 120;//амплитуда
    	
    	float x1=0, x2=0, y=0, c=0;
    	char n = 128, k = 0;
    	
    	x1 = pow((-1),(k-1)/2)*sin(2*M_PI*k*dwTone/dwFrequency)/(k*k);
    	x2 = 0;
    	c = 8*Amplitude/(M_PI*M_PI);
    	
    	while(1)
    	{
    	y = c*x1+x2;
    	x2 = x1;
    	
    	if(y>n) x1=n; else x1=y;
    	if(y<(-n)) x1=-n; else x1=y;
    	k++;
    	
    	Send(y);
    	
    	}
    }

    Либо, я совершенно не то делаю, либо что-то идет не так...

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