Jump to content

kiv.apple

Members
  • Content Count

    125
  • Joined

  • Last visited

Everything posted by kiv.apple

  1. Часть схемы ( пост #258 ). Есть большая вероятность, что неизвестная часть схемы с транзисторами - это для интерфейса J1850 и является идентичным или очень похожим на это (нижняя часть схемы):
  2. Ну я вижу, что именно в момент этого импульса срабатывает компаратор LM393, хотя он должен был сработать при другом значении напряжения.
  3. Угу, синфазны. И ему не хватает скорости, чтобы скомпенсировать это воздействие, потому что фронт импульса слишком короткий, верно?
  4. Я выше выкладывал фрагмент платы с ОУ. Вот полная плата (земля подсвечена): А вот датчик тока (вот для него и используется диф. усилитель): Кстати, мне тут другие люди подсказывают, что проблема может быть в слишком крутых фронтах импульсов. Посмотрел осциллографом - сигнал нарастает от 0 до 12В за 86 нс, а падает с 12 до 0В за 100 нс. А LM358 всего лишь на 1 МГц (единичное усиление). Может ли быть такое, что буфер просто не успевает адекватно реагировать на такое быстрое изменение тока нагрузки?
  5. Так ведь это же сигнальная линия, а не земля или VCC. В книге вроде написано про помехи по шине питания, а там всё чисто (да и в схеме, как и советуют, множество керамических конденсаторов, разве что земляной проводник тонковат). Или я опять неверно понимаю что-то? Если да, то мне нужно переделать плату, сделав земляной полигон как можно толще и поставить больше керамики? mail_robot RC-фильтр там стоит совсем не зря - на вход поступает ШИМ с микроконтроллера и таким образом превращается в аналоговый сигнал. Простейший ЦАП по сути дела. При этом пульсации напряжения на конденсаторе минимальны, если смотреть осциллографом. К тому же если отключить нагрузку от буфера (но оставить дифференциальный усилитель и силовую часть схемы, просто кинуть среднюю точку дифференциального усилителя на обычную землю), то иголочки исчезают.
  6. Тыкался осциллографом в ножки питания ОУ - там всё число и гладко. Зато вот осциллограмма выхода буфера: Голубой график - 12-вольтовые импульсы, жёлтый график - напряжение на выходе буфера (масштаб графиков разный, см. обозначения в левом верхнем углу).
  7. Ну... по ней можно определить, длину дорожек от конденсаторов на питании до микросхемы. От земли керамического конденсатора на питании C2 до земли ОУ - менее сантиметра. А вот плюсовой контакт питания достаточно длинный. Такое понятие как "земляная Мекка" мне не известно и с ходу нормально не гуглится. Можно узнать поподробнее?
  8. Ну земля то у всех схемы общая... Хотя, конечно, я просто могу что-то неверно понимать. Вот текущая разводка платы. Вход питания с левой стороны, дифференциальный усилитель находится на другой плате.
  9. Если отключить вход дифференциального усилителя от источника сигналов, то иголочки пропадают. Хотя вся силовая часть схемы продолжает работать как раньше.
  10. Дифференциальный усилитель на LM358, как ни странно, работает абсолютно адекватно (меня вполне устраивает его скорость реакции на изменение разности сигналов). Проблемы именно с буфером, который не может удержать нужное напряжение. Как я понимаю, мне нужно заменить только его на более скоростной? Можете подсказать насколько более скоростной нужен, на какие характеристики в даташите смотреть?
  11. У меня есть следующая схема: Как можно заметить, это дифференциальный усилитель, при этом средняя точка для него идёт с буфера на другом ОУ, который усиливает результат интегрирования ШИМ (ШИМ не меняется в ходе работы схемы). Так вот, пока входы дифференциального усилителя никуда не подключены, всё хорошо. На C1 стабильное напряжение с небольшими пульсациями. На выходе OP1 такое же, но с микроскопической ВЧ-помехой. Однако если на входы дифференциального усилителя подать реальный сигнал, то начинаются проблемы. Сигнал представляет собой короткие импульсы (несколько микросекунд) амплитудой порядка 12 вольт (около 12В вольт подаётся на оба входа дифференциального усилителя, мерится разность между ними). При этом каких-либо претензий к работе дифференциального усилителя нет. Проблемы начинаются с буфером OP1. При появлении коротких импульсов 12В, подключенных через резисторы 47кОм + 10кОм, начинаются искажения выходного сигнала (отклонения до 0.5-1В на время импульса, затем тут же нормализуется), которые, в итоге влияют и на выход дифференциального усилителя (ещё бы, средняя точка плавает). Насколько я понимаю, поскольку входное сопротивление OP2 очень велико, то можно рассматривать просто, что на выход OP1 подаётся 12В через сопротивление 57 кОм. В качестве обоих операционных усилителей используется LM358. Почему происходят такие искажения выходного сигнала буфера? Как их избежать? Proteus подобные проблемы не симулирует, они были выяснены уже после сборки схемы в реальности и тыканья в неё осциллографом.
  12. А если мне она меня не устраивает по каким-то причинам (вполне техническим)? Кстати, проблемы уже все решил. Надо отправлять EP0 OUT в NAK при отправке последнего блока сообщения. Теперь буду реализовывать USB CDC.
  13. Проблема была в том, что прерывание WKUP приходит всегда вне зависимости от состояния USB - просто по активности на линии. А обработка тонны прерываний WKUP всё стопорила. Решение - запретить WKUP в начале и разрешать только после SUSP. А после прихода WKUP опять запретить его. Также надо отметить, что адрес устанавливать надо после того, как ZLP в ответ на этот SETUP-запрос успешно ушёл (CTR для EP0 IN), не раньше. На это тоже напоролся. Сейчас уже успешно отдаю дескриптор устройства, но дескриптор конфигурации у меня уже не запрашивают. Вероятно, я как-то не правильно завершаю оптравку дескриптора конфигурации, сейчас с этим разбираюсь. Я работаю с USB на низком уровне не просто так. Я разрабатываю свою библиотеку для контроллеров (причём потенциально не только STM32, но и других, а также Linux-компьютеров) - https://github.com/K...ollerFramework.
  14. Пытаюсь разобраться с USB у STM32F103 на низком уровне (т.е. без сторонних библиотек) и столкнулся с проблемой. Мои действия: 1) У меня внешний кварц на 8 МГц. Запускаю PLL на 72 МГц (коэффициент умножения 9, делитель для USB 3). Разумеется, этот процесс состоит из нескольких этапов, однако в результате в регистре RCC->CFGR оказывается значение 0x001DC40A (что помимо прочего обозначает, что PLL успешно выбран как системный источник частоты). Работа USART и SysTick адекватна (частота точно верная). 2) Включаю тактирование USB. Убираю бит PWDN из USB->CNTR. Жду 1 микросекунду (по даташиту нужно для стабилизации источника опорного напряжения), пишу нули в CNTR, BTABLE и ISTR. Разрешаю прерывания USB_FS_WKUP и CAN1_RX0. Пишу в CNTR значение USB_CNTR_RESETM | USB_CNTR_SUSPM | USB_CNTR_WKUPM | USB_CNTR_CTRM. 3) На этом инициализация окончена. Далее приходит прерывание от USB. Причина, определённая из ISTR - RESET. Да, именно это и должно случиться, всё логично. Обнуляю соответствующий флаг прерывания. 4) Настраиваю нулевую конечную точку. В итоге в USB->EP0R оказывается значение 0x3220. По адресу USB_PMA_BASE + 0 оказывается значение 64 (TXADDR для EP0 == 64), по адресу USB_PMA_BASE + 8 оказывается значение 128 (RXADDR для EP0 == 128), по адресу USB_PMA_BASE + 12 оказывается значение 0x8400 (размер буфера приёма для EP0 - 64 байта). 5) Разрешаю работу USB - пишу в USB->DADDR значение 0x80. 6) Выхожу из прерывания. 7) Ожидаю, что мне придёт первый SETUP-пакет, о чём мне скажет прерывание с флагом CTR в регистре ISTR. А оно не приходит. Зато приходит куча прерываний по причине WKUP (я сбрасываю этот флаг, а оно снова приходит). Иногда приходит RESET (у хоста срабатывает таймаут назначения адреса устройству и он устраивает новый сброс), но после него опять куча WKUP. В конце-концов хост забивает на устройство и события прекращаются. Помимо WKUP ещё приходит ESOF. Моя теория: USB-модуль не запускается должным образом и не способен разобрать, что приходит по шине кроме RESET. Передача данных видится им как событие WKUP (которое по сути вызывается любой активностью на линии). Возможно, я забыл что-то инициализировать или же я что-то неправильно настроил и машину состояний USB клинит. В чём может быть проблема? Аппаратная часть исправна - прошивки с использованием готовых библиотек на этой плате работают нормально.
  15. Поставь второй трансформатор после первого и преобразуй 180 в 110. Иных вариантов нет, если нельзя модифицировать исходный трансформатор.
  16. Нужно мерить значения напряжения с точностью 0.5-1 мкВ в диапазоне 0-30 мВ с частотой 1 кГц. Подойдёт ли такая даташитная схема (вместо измерительных мостов будет иной источник сигнала, но тоже дифференциальный)? В качестве опорного напряжения будет 0.5В (по даташиту такое значение допустимо), коэффициент усиления равен 10 (резисторы подобраны по формуле). Подойдёт ли этот АЦП и этот ОУ для данной задачи? При таких параметрах усиления и опорного напряжения хватит 16-битной точности, а в даташите указано, что 16 бит без шума обеспечивается на любых параметрах частоты выборки. Какие следует учесть особенности при разводке печатной платы?
  17. Подсказали в другом месте как можно сделать защиту и по току, и по напряжению, задействовав лишь 1 усилитель ошибки, так что смог отказаться от компаратора. Так что схема стала проще (D3 - стабилитрон на 36 вольт). Можете теперь на неё глянуть и проверить? Регулировать яркость светодиода собираюсь изменяя отношение R5 и R3, тем самым ограничивая максимальный ток.
  18. TL494 и TL598 это практически одно и то же. Они отличаются только драйверами транзисторов. У второй он специально спроектирован для полевиков, а у первой больше подходит для биполярных транзисторов, поэтому я буду использовать вторую. Компараторы мне таки нужны, потому что у микросхемы лишь 2 усилителя ошибки, а мне нужно следить за 3 параметрами (входное и выходное напряжение, выходной ток, от мониторинга входного тока отказался из-за трудности поиска резистора на слишком маленький номинал, а от КЗ защитит и ограничитель выходного тока). Однако для защиты по напряжению хватит как раз ступенчатого срабатывания и не нужно подстройки ШИМ. Компараторы выдадут землю при срабатывании защиты, а при нормальной работе - напряжение питания. Осталось научиться гасить TL494/TL598 при срабатывании данной защиты. И правильно ли я сделал обратную связь по току?
  19. Составил такую схему, однако не уверен, что правильно сделал контроль входного и выходного напряжения (не понятно как гасить TL598).
  20. Во вложении структурная схема LM393 из официального даташита (хотя в общем-то достаточно информации о том, что у него выход типа "open drain" или "открытый сток"). Это значит, что состояние "логический ноль" эквивалентно Hi-Z (ножка никуда не подключена), а "логическая единица" - ножка закорочена на GND. Хотя может быть и наоборот ("0" - GND, "1" - Hi-Z, скажите мне кто-нибудь, пожалуйста, если это так), но в таком случае мне нужно просто поменять местами инвертирующий и неинвертирующий входы. Отсюда следует, что объединять выходы компараторов совершенно нормально (я сначала сам хотел воткнуть ещё логическую микросхему, но прочитав, что у компараторов в отличии от ОУ выход open drain - понял, что в этом нет смысла кроме усложнения схемы). И, пожалуйста, ответьте, почему именно на ваш взгляд схема работать не будет. Я не на контрольной, а хочу узнать в чём именно не прав (но нет, неправ я точно не в соединении выходов компараторов), чтобы скорректировать свои знания электроники и не допускать таких ошибок в будущем.
  21. Хм... разве не получится, что просто ток светодиода будет немного колебаться, а в среднем выходить нужное значение (тот же ШИМ, только не на отдельные импульсы, а она всю генерацию)? Если поставить срабатывание немного меньше максимального тока светодиода (скажем, 2.8А вместо 3), то он никогда не будет перегружен.
  22. Приобрёл мощный стоваттный светодиод. Параметры: 34В, 3 ампера. Собираюсь запитать его от литий-полимерного аккумулятора 14.8В (аккумулятор авиамодельный, может штатно выдавать до 100 ампер, так что подходит, хотя его хватит всего минут на 40, но меня это устраивает, к тому же регулирование яркости никто не отменял). Разумеется, нужен драйвер. Сначала думал собрать на LT3756, но офигел от разводки печатной платы, подумал-подумал, и решил сделать на дискретных компонентах. Идея таковая: основой конструкции является 555-ый таймер, который через драйвер управляет полевым транзистором, который в свою очередь соединён с дросселем, образуя самый обыкновенный бустер. Также в схеме имеется 4 компаратора, каждый из которых, если сработает, кидает RESET таймера на землю и прекращает генерацию. Два компаратора контролируют падение напряжения на резисторах - датчиках тока. Датчик выходного тока по сути служит для ограничения тока светодиода и меняя порог срабатывания можно будет регулировать яркость. Датчик входного тока служит скорее для защиты от непредвиденных ситуаций и при нормальной работе срабатывать не должен (если дроссель будет правильно рассчитан, от КЗ опять же защитит и датчик выходного тока). Вторые два компаратора контролируют входное и выходное напряжение. Первое нужно для защиты аккумулятора (ведь литий-полимерные аккумуляторы не любят, когда их разряжают ниже определённого уровня), а второе для защиты от обрыва проводов до светодиода, чтобы преобразователь не начал выдавать всё большее напряжение, пока не пробьёт транзистор бустера. Ниже приведена принципиальная схема. В качестве драйвера транзистора используется IR4426 (её второй канал не задействован, его выход болтается в воздухе, а вход прижат к земле), в качестве компараторов - две LM393 (у неё выход open drain, поэтому вполне нормально объединить их все и подтянуть резистором к питанию - если хоть одна сработает, на выходе будет ноль). Всё кроме драйвера транзисторов питается от 78L05 (это нужно, чтобы, например, делители напряжения выдавали одинаковое значение вне зависимости от напряжения аккумулятора). Будет ли работать эта схема, если я правильно рассчитаю номиналы всех деталей?
  23. У многих AVR есть возможность подключения часового кварца для асинхронного тактирования Timer1. Думаю в своём проекте воспользоваться этой возможности для ведения часов реального времени без дополнительных микросхем. То есть на питание МК идёт через диоды ток и от батарейки CR2032, и от основного источника питания 5В. Также основной источник питания подключен к одному из входов МК. МК следит за этим входом, когда там становится логический ноль (мы перешли на питание от батарейки) - уходит в спящий режим, просыпается по переполнению timer1, либо по прерыванию изменения уровня на ножке контроля основного питания. Соответственно, будет просыпаться раз в секунду и инкрементировать переменную времени, а потом вновь засыпать. Когда появится основное питание сработает прерывание и он проснётся совсем и будет работать в штатном режиме. По даташиту на мой МК у него потребление в ждущем режиме с включенным Timer1 - 0.6 мкА, однако ток будет возрастать раз в секунду на время пробуждения. Имеет ли такая идея право на жизнь? Не будет ли сажать батарейку слишком быстро?
  24. Каждую секунду я читаю, чтобы убедиться в адекватности работы часов, я лишь учусь с ними работать нормально. Потом, конечно, будет другой алгоритм. Тогда почему они нормально идут, если не пытаться менять время (только из-за этого я не могу настроить их на верное время)? Значит с кварцем всё ок.
  25. Купил на Ebay из Китая модуль часов реального времени на базе DS1307 - http://www.ebay.com/itm/130962277743. Теперь вот пытаюсь работать с ними, но получается какой-то бред. Вот код моей библиотеки: #define DS1307_ADDR 0xD0 uint8_t ds1307_read(uint8_t reg) { i2c_start(DS1307_ADDR); i2c_write(reg); i2c_start(DS1307_ADDR + 1); uint8_t result = i2c_read(1); i2c_stop(); return result; } void ds1307_write(uint8_t reg, uint8_t value) { i2c_start(DS1307_ADDR); i2c_write(reg); i2c_write(value); i2c_stop(); } uint8_t bcd2bin(uint8_t value) { return (value / 16) * 10 + (value % 16); } uint8_t bin2bcd(uint8_t value) { return (value / 10) * 16 + (value % 10); } void ds1307_get_datetime(uint8_t *hour, uint8_t *minute, uint8_t *second, uint8_t *year, uint8_t *month, uint8_t *day) { *second = bcd2bin(ds1307_read(0)); *minute = bcd2bin(ds1307_read(1)); *hour = bcd2bin(ds1307_read(2)); *day = bcd2bin(ds1307_read(4)); *month = bcd2bin(ds1307_read(5)); *year = bcd2bin(ds1307_read(6)); } void ds1307_set_datetime(uint8_t hour, uint8_t minute, uint8_t second, uint8_t year, uint8_t month, uint8_t day, uint8_t dow) { ds1307_write(0, bin2bcd(second)); ds1307_write(1, bin2bcd(minute)); ds1307_write(2, bin2bcd(hour)); ds1307_write(3, bin2bcd(dow)); ds1307_write(4, bin2bcd(day)); ds1307_write(5, bin2bcd(month)); ds1307_write(6, bin2bcd(year)); } Функции I2C точно работают нормально (я их уже использовал для общения с 3-мя разными датчиками без глюков). А тут получается ерунда какая-то. После старта МК я вызываю ds1307_set_datetime со временем зашитым в исходник. Затем каждую секунду читаю данные с помощью ds1307_get_datetime и смотрю на них. И... часы стоят на месте на том времени, которое я выставил. Затем время сдвигается на 10 секунд. И так далее - время обновляется раз в 10 секунд. Но это ещё ладно, ко времени иногда может не прибавится, а отняться 10 секунд. И вообще ведёт себя странно. Если убрать с начала программы установку времени и переткнуть питание схемы, то часы начинают ходить нормально... но по совершенно другому времени, не тому которое я ставил. Причём оно то отображается нормально. И несмотря на все мои попытки перезаписи, если убрать перезапись при старте это время нормально считается дальше. То есть часы считают какое-то своё время и нормально его выдают. А если я перезаписываю, то вывод времени начинает глючить, однако то время по-прежнему считается нормально (просто не выводится). Где я ошибся?
×
×
  • Create New...