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

Kostyanskiy

Members
  • Постов

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

  • Посещение

Весь контент Kostyanskiy

  1. Известно, за что они отвечают? У меня инвертор недозаряжает аккумулятор (110Ач) так есть предположения, что это входной делитель так попробывать с ним поиграться
  2. Дело в том, что я по не внимательности, в ходе диагностики втыкнул разъем трансформатора не в тот разъем на плате (обозначил красным) - вылетел предохранительный резистор (обозначил желтым). Заменил резистор все напряжения на плате вернулись в норму, но, наблюдаю такое поведение: Включается в режиме стабилизатора, и дико переключает реле + пищит, и если немного подождать, на дисплее засвечивается надпись overload, хотя на выходе никакой нагрузки нету. И стаб на 12 В ведет себя странно, занижая напряжение до 10 В Знаю, я умею привносить новшества в конструкцию
  3. У меня откудато вылезла еще одна проблема, при включении в режиме стабилизатора без транзисторов, дико переключается одно из реле и контроллер пишет overload, на выход ничего не подключено, это как?
  4. Все КЗ(23Ома) ушло в мозги, но тогда у меня вопрос, как он работает, показывает на дисплее параметры и работает в режиме стабилизатора? И там интерестный контроллер HT32F65230. По всем питаниям 23 ома
  5. @drubtsow А это нормально, что между стоком верхнего плеча и истоком нижнего плеча с не установлеными транзисторами (на клемах акуммулятора), присутствует падение напряжение 0.2В и постепенно оно растет в бесконечность, при обратном подключении щупов все повторяется но со знаком минус ? Изменено, на этом кондере КЗ
  6. Здравствуйте, уважаемые форумчане. У меня проблема с бесперебойником с чистым синусом sinusPRO 500E. Предыстория: после покупки некоторое время работал исправно, тянул на себя нагрузку ввиде котла центрального отопления, но в один момент, при включении без нагрузки, с него "вышла душа" - пошел дым. Разобрав его, я увидел взорванный затворный резистор. Первым делом я заменил его и прозвонил транзисторы, увидел, что они пробиты одним полумостом, как будто по ним прошел сквозной ток. Остальные были живы (те что в другом полумосте). В каждом плече было по 3 транзистора HY3205, аналог IRF3205. Включение прибора без транзисторов в сеть переводит его в режим сетевого стабилизатора. На транзисторах генерации ШИМа в этот момент нету. Драйвера транзисторов живы. После замены транзисторов (по штуке в плечо) , ситуация повторилась - пошел дым. Подскажите пожалуйста, где может зарыта собака и с чего продолжить дальнейшую диагностику? Если у кого-то есть схема этого бесперебойника, будет интересно взглянуть, спасибо.
  7. Первый элемент - дроссель (7R2). Второй элемент - диод (1815BJE). Третий элемент - конденсатор.
  8. За этим, я сюда и пришел Понял, спасибо за наводку, буду изучать
  9. Здравствуйте, подскажите пожалуйста литературу по логарифмическим усилителям (ЛУ) на операционниках и их применению. Я вияснил, что основное применение ЛУ является сжатие динамического диапазона сигналов с широким динамическим диапазоном. И с основной теорией, думаю, разобрался отсюда и отсюда, но конечное применение не особо, и мне не понятно зачем в аналоговых регуляторах тока и напряжения стоят такие схемы. Пример: Рисунок 1. Схема имеет смещение на неиинверт. входе, как это учесть в расчетах ЛУ и какую функцию выполняет диод если в схеме стоит конденсатор. (не похоже на класическую схему ЛУ). Рисунок 2. Диод D6 и стабилитрон D5 какие функции выполняют в цепях обратной связи? Со стабилитроном могу предположить, что это ограничение верхнего диапазона вых. напряжения ОУ с гистерезисом.
  10. Этот код правился и дорабатывался безчисленное количество раз, и так как проект старый, помнить где какие ошибки я не могу, и я не сразу обратил внимание на ваше @Огонёк замечание. Я не помню всего что делал довольно давно, и не могу сказать зачем делал указатель на указатель. P.S: Наверное тогда я принимал только один байт, и у меня буфер sReceivedChar не был масивом
  11. А оно что так, что так не работает... Я сейчас тестирую программу на ПК из 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 порта все работает отлично, как мне сингронизироваться?
  13. @Yurkin2015 А вот это уже реально не понятно, откуда \r в начале строки, и почему 9-ка пропала в конце? 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 Немного не понял для чего это, мы типа стираем 0x0D из sReceivedChar? Это к сожалению тоже не работает
  15. @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; } } }
  16. Здравствуйте, у меня похожая проблема, не срабатывает прерывание по приему, помогите разобраться пожалуйста 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: было выяснено, что прерывания работает как бесканечный цикл, чего не должно быть, но оно есть.
  17. Снял галочку и данные данные пошли непрерывным потоком, переподключил устройство, выдало все как на кратинке выше. Все пришло в тупик...
  18. Здравствуйте, мне надо как-то синхронизировать работу МК с компьютером, идея такая: Отсилаю кодовое слово по 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; } ---В програме отсилка кодового слова была только один раз, а данные пришли дважды, что не так?---
  19. Не у одного вас такая проблема, такие аномалии, думаю не один я уже встречал в своих проектах с дисплеями особенно под AVR, но причини каждого случая свои. Проверьте осликом или лог. анализатором, наличие тактирующего сигнала и MOSI шины SPI, при инициализации дисплея. А может у вас где-то идёт просадка по питанию дисплея или МК, и при подключении программатора, просадка компенсируется током самого программатора. Киньте ослика на питание и посмотрите, что у вас нету провала напряжения в начальный момент запуска МК, поставьте конденсатор на питание (подбор эмпирически), настройте МК на задержку выполнение основной программы в несколько миллисекунд, чтобы при инициализации дисплея не потерять некоторые пакеты инициализации с плохим питанием (задержка нужна, чтобы переждать пик просадки питания и дождаться его стабилизации)
  20. Доброго времени суток, у меня стоит задача подключить широкополосною лямду к Atmega8/328 и выводить данные стихеометрической смеси на дисплей, только вот не понимаю как считывать показания с датчика, как управлять ионным насосом, который там имеется, и какие формулы и алгоритмы применять. В сети есть примеры, например вот, но адекватной схемы на ОУ туда не завезли, не понятно что куда подключать и как это работает.
  21. Здравствуйте, решил я сделать себе генератор простеньких сигналов на меге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);//Отправка на ЦАП } } Попытался разобраться сам, но безуспешно, думая что понял, я решил попробовать сделать что-то похожее, но с треугольным сигналом по формуле , вот что получилось, но мой код не работает: 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); } } Либо, я совершенно не то делаю, либо что-то идет не так...
×
×
  • Создать...