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

Yurkin2015

Members
  • Постов

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

  • Посещение

  • Победитель дней

    1

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

  1. @TimassПосле ИБП надо поставить повышающий DC/DC, сделать на линии напряжение питания 24 В, например, а перед каждой камерой установить понижайку до 12 В.
  2. @J_Ohm Положительные синхроимпульсы С1 и С2 должны появляться как по фронту, так и по спаду сигнала D. Не надо ничего убирать.
  3. Нужно установить ШИМ генерацию в режим "PWM center-aligned mode". Это когда счётчик считает по треугольнику: сначала вверх, а при достижении максимума сам переключает счёт вниз. При нуле снова начинает счёт вверх. Фронты импульса ШИМ генерируются при каждом совпадении счёта c регистром CCR. Например, при счёте вверх сначала при совпадении с CCR будет фронт ШИМа, затем счётчик достигнет ARR, событие overflow, изменение направления вниз, при совпадении с CCR будет спад импульса ШИМа. Достигаем нуля - меняется направление вверх. И всё по-новой. Поэтому моменты переключения направления счёта при переполнении или достижении 0 попадают как раз в середину импульса ШИМ. Надо просто запользовать прерывание по переполнению, оно будет как раз там, где надо.
  4. Не, ну, раз такой ажиотаж возник по схемам, тоже внесу свою нетленку. Предлагаю "исключающее ИЛИ" запользовать. Не знаю, какие частоты ожидаются, задержки взяты для примера 100 мкс. На КМОПах легко реализуется, а вот для дубовой 155-серии надо все резисторы уменьшить в сотню раз, поставить все по 100 Ом, конденсаторы придётся увеличить. И диоды взять Шоттки.
  5. Переход база-эмиттер имеет нелинейную характеристику напряжение-ток. То есть увеличить напряжение на открытом переходе гораздо сложнее, чем уменьшить напряжение. К примеру, при увеличении напряжения на каждые 60мВ нужно увеличивать входной ток базы в 10 раз. Поэтому при подаче на базу красивого синуса через какое-либо сопротивление, на самой базе напряжение будет искажаться: положительные полуволны синуса будут сжаты, приплюснуты, а отрицательные полуволны пройдут без искажения с полной амплитудой. Соответственно, средняя величина такого напряжения будет меньше, чем просто без синуса.
  6. В слейве объявляете буфер для приходящих байтов и запускаете процедуру приёма по SPI. Программа застрянет в этой процедуре пока не получит все 256 байтов. uint8_t buf[256]; HAL_SPI_Receive(&hspi1, buf, 256, HAL_MAX_DELAY);
  7. Достаточно. А какое расстояние будет между STM32?
  8. Все три выхода станут неактивными. При отпускании активируется выход последней отпущенной кнопки, одновременно отпустить кнопки никак не получится, какая-то кнопка всегда будет последней. Зависит от желания клиента. Если надо, то можно зашунтировать какую-либо кнопку конденсатором в пару микрофарад.
  9. @Zombie47 Для того, чтобы typedef работал, нужно в самом конце после закрывающей скобки } поставить какое-то имя. Тогда всё, что между typedef и именем будет помещено в это имя. Таким образом создаётся новый тип переменной-объекта. Очевидно, что в первом случае нету имени в конце, поэтому typedef тут не работает, его можно просто выкинуть, и ничего не изменится. Просто описана структура с названием sPWM_t. Может быть много структур, все с разными именами. Всякий раз, когда хотите использовать это описание для создания объекта-структуры, надо так и писать, мол, новый объект с типом "структура sPWM_t". Во втором случае при описании структуры в конце есть какое-то имя sPWM_t. Это не имя структуры, тут структура безымянная, ну и хрен с ним. Просто всё, что между typedef и sPWM_t будет помещено во внутрь sPWM_t. Тут слово sPWM_t является тоже описанием, только покороче. Это новый тип переменной. Поэтому каждый раз при создании новых объектов, когда встретится имя sPWM_t, компилятор будет раскрывать это имя обратно в структуру, и слово struct уже не нужно писать. Получается этот typedef просто создает заменитель набора слов на одно слово, для удобства и сокращения писанины.
  10. Уберите while() из uart_receive(), тогда не будет задержки. Если букву получили, то её возвращаем, если не получили, то не ждём и возвращаем 0. unsigned char uart_receive(void) { if(UCSR0A & (1<<RXC0)) // Если получили return UDR0; // Возврат 8-bit данные return 0; // Не получили, возврат 0 } А в самой программе проверяем, если не ноль, то что-то делаем c = uart_receive(); if(c) { uart_transmit(с); } В результате программа будет быстро бегать по кругу и проверять flag и получение буквы без задержки.
  11. Что-то никак не въеду: каждый ключ привязан к одной из солнечных панелей аж на 30 В. Ну, так и пользуйте это напряжение для питания затвора ключа. И не надо никаких отдельных блоков питания с обмотками и генераторами.
  12. @Гость_Григорий_Т. Оно, конечно, облегчит жизнь диода D3, через который протекает суммарный ток предыдущих батарей при параллельном включении. Но тогда на некоторых ключах при определённых комбинациях будет приложено удвоенное напряжение батареи. Пожалуй, да, кидаем катоды прямо на нагрузку и берём более высоковольтные мосфеты. Такой ток будет только тогда, когда хреначит полный прямой солнечный свет: панель вырабатывает 240Вт мощности, при этом света на панель падает гораздо больше, типа киловатт, КПД ведь менее 100%, всё кругом нагревается нехило, шо там тех 4.5 Вт на диоде? Никто и не заметит такого мизера.
  13. Если раздобыть кучку хороших диодов, то можно значительно уменьшить число ключей. Вот, к примеру, при четырёх панелях для переключения "параллельно - последовательно" нужно всего три ключа, напряжение на ключах не превысит 32В, так что МОСФЕТы типа 10А 50В сгодятся.
  14. @Kostyanskiy Вот это sReceivedChar что за переменная? Какой у неё тип и размер?
  15. @Kostyanskiy Мы не стираем 0x0D, а записываем 0 в конец строки. Если функция srtcmp() будет сравнивать строки от начала до конца, как она узнает где конец в строке sReceivedChar? До какого места сравнивать? Признаком конца как раз и является 0. Кстати, для упрощения выкиньте strcmp() и для начала сравните только первый принятый символ: if((sReceivedChar[0] == '1')&&(FlagRecievData == 1)) { UART_Transmit("OK"); UART_Transmit((const char*)sReceivedChar); FlagRecievData = 0; }
  16. @Kostyanskiy Надо переделать обработчик прерывания: ISR(USART_RX_vect) //Прерывания после приема { if ((UCSR0A & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN)) == 0) { if (UDR0 != 0x0D) { sReceivedChar[rx_count] = UDR0; if (rx_count < sizeof(sReceivedChar)-1) rx_count++; PORTB ^= (1<<5); } else { sReceivedChar[rx_count] = 0; rx_count = 0; FlagRecievData = 1; } } }
  17. @Kostyanskiy Чтобы прерывание загасить, в обработчике прерывания надо прочитать принятый байт. Типа, вот так char data = UDR
  18. @artos5 Нет, не так. То, что обведено у вас на картинке, это задержка перед отправлением последнего байта KEY7. При получении всех байтов ключа процессор начинает их анализировать, поэтому после получения последнего байта сигнал busy = 1 самый длинный, его и изучаем. В статье так и написано: " расстояние между курсорами".
  19. Судя по статье, сигнал busy становится = 1 в момент начала SPI передачи байта и падает в 0 после окончания через некоторое время. Длительность этой единички как раз и надо измерить. В вашей программе почему-то проверяется длительность не единички, а нуля. То есть сразу после старта busy=1, мы проскакиваем while и сразу пишем время в массив. SPI1->DR=(uint8_t)data[i]; while (!(GPIOA->IDR & GPIO_IDR_IDR10)){}; //busy revers times[count]=TIM1->CNT; Надо добавить while пока busy = 1 SPI1->DR=(uint8_t)data[i]; // стартуем передачу по SPI while (!(GPIOA->IDR & GPIO_IDR_IDR10)){}; // ждём пока busy = 0, должен прыгнуть в 1 после старта передачи while ((GPIOA->IDR & GPIO_IDR_IDR10)){}; // ждём пока busy = 1 и не упадёт в 0 times[count]=TIM1->CNT; // получаем время от старта SPI до окончания busy
  20. На выходе модуля ISD1820 присутствует постоянное напряжение. Надо между модулями по линии сигнала поставить разделительный конденсатор. При этом соединить общий минус у модулей и блока питания, а сигнал взять только с одного выхода ISD1820.
  21. Дальность определяется условием прямой видимости, то есть идеально, когда приёмник и передатчик могут видеть друг друга без препятствий. Также есть кривизна Земли, и дальность зависит от высоты передающей и приёмной антенны. Например, если передачик держать в руке над головой, то такой же приёмник над головой будет принимать на расстоянии 10 км. При больших расстояниях приёмник просто скроется за горизонтом и станет невидим, связь пропадёт. LoRa модули имеют очень высокую чувствительность, при обычной мощности менее 100 мВт в космосе дальность связи таких модулей может составить тысячи километров. На Земле один модуль помещают на аэростат на высоте 18 км, а приёмник высоко в горах, типа 3-4 км над поверхностью. Тогда получают 700 км дальность связи при всего 25 мВт выходной мощности.
  22. Да, некоторые люди минус питания называют "корпус" или "земля". Минус от линии 5 В надо присоединить к минусу питания. Если копрус усилителя пластмассовый, то к нему ничего присоединять не надо, это просто так называется. То же самое и с землёй. Тут две разные земли надо соединить друг с другом и с минусом питания.
×
×
  • Создать...