Скажу сразу - тема до конца не доделана, но то что выкладываю хоть и сырое, но вполне рабочее. Загорелся идеей таки прикрутить к сабжу энкодер - напрашивается поставить доп. контролер, чеб он имитировал нажатие кнопок "+", "-". У сабжа большая плата, ей бы дисплей 3,2" да энкодер. Нашел в сети одну реализацию: https://github.com/kuwatay/AVR/tree/mas ... for-dso138 но приспичило попытаться самому. Мутить как мутить - дополнил еще кнопкой ходить по режимам в обратную сторону (пять "нажатий" на SEL). И чтоб быстрый поворот энкодера отрабатывался как удержание кнопки для "прыжков".
Делается или покупается маленькая платка с attiny13 / attiny85 / atmega328. МК, стабилизатор и минимум обвязки (в корпусе приклеиваем рядом с энкодером). К платке: 2 провода от энкодера, 1 - от кнопки, 1 - их общий корпусной; с платы сабжа: корпусной, +V и от кнопок "+", "-", "SEL".
Пока прошивку написал только под atmega328p (Mini Pro, других у меня пока нет), во фьюзах изменил один бит - включил прескалер на 8. Писал в eclipse. В свойствах проекта: atmega328p, частота 2000000. Не все еще гладко, для эргономики надо с задержками поиграться, да и 60-ю сабжевую надо попробовать поковырять - время удержания кнопки уменьшить до секунды и "прыжок" увеличить с 10 до 20-25 точек. Спойлер/* энкодер для dso138 пока только на Mini Pro atmega328p 16MГц/8 в фьюзах включен бит деления на 8 имитация нажатия кнопок "+","-","sel" быстрый поворот энкодера - имитируется удержание кнопки на 2сек. доп. кнопка - 5 раз имитируется нажатие кн."sel" подключение к кнопкам прямое, без развязывающих транзистеров 0, 1, 2 линии порта C - энкодер и доп. кнопка 0, 1, 2 линии порта В - в параллель к кнопкам "+","-","sel" таймер 0 - исп. для определения насколько шустро крутанулся энкодер таймер watchdog (собака) - для секундного удержания кнопки, имеется счетчик "прыжков" - напр., 3 быстрых поворота - около трех "нажатий" с удержанием - прыжки */
sei(); // разрешение прерываний while(1) { Bott=0; Enc= 128; PinScan(); // уходим на опрос обнулив признаки
//--------Обработка - что принес опрос---------------------------
if ((Bott == 1) & (Cj == 0)) { //если кнопка нажата и прыжков нет Enc = 128; // обнуляем энкодер - игнорируем for (int i=0; i<5; i++){ // ногодрыг по линии кнопки sel, 5 раз DDRB |= (SEL); // нога режим - выход PORTB &= ~(SEL); // в линию "0" _delay_ms(50); DDRB &= ~(SEL); // возвращаем по ноге режим - вход _delay_ms(50); } _delay_ms(30); // еще чуток ждем }
if (Cj !=0) _delay_ms(260); // эргономика. задержка перед следующим опросом, если уже есть прыжки
if (Enc != 128){ //если было вращение энкодера if (Enc>129) Cj++; // добавляем прыжок на счетчике, направление "+" if (Enc<127) Cj--; // добавляем прыжок на счетчике, направление "-" if ((Enc==129)&(Cj == 0)) { // если на энкодере один шаг и нет прыжков имитируем кнопку DDRB |= (UP); // линию на выход PORTB &= ~(UP); // в линию "0" _delay_ms(50); DDRB &= ~(UP); // возвращаем по ноге режим - вход _delay_ms(60); } if ((Enc==127)&(Cj == 0)) { // щаг в другую сторону - имитируем другую кнопку DDRB |= (DOWN); PORTB &= ~(DOWN); _delay_ms(50); DDRB &= ~(DOWN); _delay_ms(60); } } if (Cj > 0) { // если счетчик прыжков выше нейтрали : if (~(!Pin_UP) & (F2==0)) { // если еще нет удержания и нет признака от таймера DDRB |= (UP); // линию на выход PORTB &= ~(UP); // в линию "0" wdt_enable(WDTO_2S); // таймер (watchdog) на 2сек WDTCSR=(1<<WDIE); // старт и разрешение прерывания от таймера } if (F2==1) { // если есть признак, что таймер отработал : DDRB &= ~(UP); // возвращаем по ноге режим - вход F2=0; // очищаем признак Cj--; // счетчик -1 _delay_ms(60); // пауза между "нажатиями" } } if (Cj < 0) { // если счетчик прыжков ниже нейтрали : if (~(!Pin_DOWN) & (F2==0)) { // аналогично для другой линии DDRB |= (DOWN); PORTB &= ~(DOWN); wdt_enable(WDTO_2S); WDTCSR=(1<<WDIE); } if (F2==1) { DDRB &= ~(DOWN); F2=0; Cj++; _delay_ms(60); } }
} //while return 0; }
Процедура опроса энкодера от уважаемого Леонида Ивановича, остальное сам вымучивал. Это мой первый опыт в программировании МК и в программировании (очень давно сочинял небольшие программки в машкодах для ИК80, да лет 10 назад мутил sql-запросы, чтоб инфу между системами перебросить - это весь мой опыт программирования). По сему - конструктивные советы будут кстати. Да и если кто свое предложит - милости просим.
Дополню основная "сырость" (в функционале) - реализация "прыжков". когда боролся с прошивкой у меня исполнителем был штатный светодиод (без dso138), события "шифровал" различным количеством и длительностью моргания. Тогда , вроде, добился - 3-5 быстрых дрынка энкодером - почти столько же прыжков на экране (+- один прыжок), а если приноровиться то и ровно (сколько я дрынкнул - столько он и "отпрыгал"). А вот когда подключился к dso : с доп.кнопкой и шаганием энкодером все нормально (и шагание и спокойное вращение - адекватно отрабатывается), а вот прыжки не складываются (дрынки с прыжками не сходятся). Думаю не всегда stm32 ждет 2сек., бывает что и дольше, поэтому и удержание от 328 воспринимает как одно нажатие. В ближайшие 2-3 дня, если не сильно буду занят, поиграюсь с задержками.
Еще: если кого смущает прямое соединение ног контроллеров и он хочет подстраховаться - сообщите. Перепишу, выложу. Сейчас управляющая нога переключается с режима вход на реж. выход и прижимается к 0, потом снова на реж. вход; сделаю: управляющая нога всегда выход, управ. сигнал лог. 1, подадите на транзисторы, шунтирующие кнопки - вот и развязка контроллеров. Наверно так не только безопасней, но и надежней.
Для таких как я - начинающих - я напихал толпу комментариев в листинг, Может кто захочет чего подрулить под себя или чего выкинуть (скажем без механизма прыжков все здорово упрощается, и переносимость на другие МК тоже).
На всякий случай: Прошу не считать выложенное "моей разработкой" - в том смысле, что если кто "возьмет инициативу в свои руки" - с моей стороны никаких возражений; наоборот только плюс, ведь это значит народу гораздо быстрее станет доступней более грамотное и надежное решение.
Никто не критикует, вероятно никто еще не собрал. раскритикую сам: не достаточная проработка темы на этапе постановки задачи (т.е. ее вообще не было) привела к лишним затратам времени и необоснованным ожиданиям.
собственно я о следующем: время держать кнопку, чтобы dso138-м это было воспринято как удержание, зависит от загруженности stm32 и сильно варьируется (от секунды в реж.HOLD, до 4-5сек. на длительных развертках); как уменьшить это время я в 60-ой не нашел. Посему, решил отказаться от всего этого механизма, выкинул из прошивки MiniPro все что с этим связано. Выкладываю и исходник и два hex'та один скомпилирован под частоту 2МГц(с прескалером на 8 ), другой для 16МГц (вернул фьюзы как было - без бита прескалера на 8 ). Опрашивается нога с доп.кнопкой, если не нажата - опрашиваются ноги к энкодеру, если и там движухи нет - снова на доп.кнопку. Если была движуха по кнопке или энкодеру - отрабатывается соответствующий ногодрыг на линиях к ногам dso138.
А теперь, что нашел в 60-ой (в бинарнике): смещение - было - себе сделал 7536 - 0A - 19 (10 сменил на 25) 754A - 14 - 32 (20 сменил на 50) 75B6 - 0A - 19 75CA - 14 - 32 здесь, через сколько позиций прыгает при удержании кнопки: +10, -10 и +20, -20 для маркера "окна". hex-редактор, в котором ковырял - Hex Workshop. файл формата hex открывается через импорт. Снова в hex запихивать не обязательно, st'шный Flash Loader и bin и hex понимает. в прочим ... свою 60-ю то же положил в архив.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
что-то никто не портирует прошивку на камень по-меньше, типа Attiny45 Attiny85 или не наращивает каким-нибудь генератором, мне пока это ни к чему, а то б прикрутил. А пока ...
Попался мне на днях энкодер из "мыши" - откорректировал под него прошивку. В отличии от "обычного" энкодера, у которого на один тактильный шаг приходится смена четырех состояний, у мышиного как бы полшага, т.е. тактильный шаг - с 00 на 11 либо с 11 на 00. Это и принял за условие - шаг совершен, направление определяю по последнему состоянию линий перед завершением шага, т.е. перед 11 или 00 в шаге. Ломал голову на предмет устойчивости к дребезгу, что лог."0" (в отличии от "1") не всегда может оставаться 0В (в следствии скользящего контакта), но остановился пока на такой обработке линий. Имеющийся у меня энкодер с этой прошивкой работает стабильно. Остальное как предыдущей прошивке (lite). В архиве main.c и hex для 328Р 16МГц. Энкодер мелкий, но на счет компактности всего механизма не уверен. В отличии от "обычного" энкодера, которому кроме собственно ручки больше ничего и не нужно, здесь сам энкодер как одна опора колесу, т.е. требуется вторая опора. Да и колесо пожалуй удобней широкое, чем диском.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Периодически возникают мысли - чего бы там допилить, но ведь работает и так... Есть большое желание таки разгрести родные исходники - я немного в них ковырялся, но пока только "верхний слой" разгреб - STM я всего год программирую и пока слаб в разгребании чужого - вот своего наворотить уже немного могу . Лично мне в сабже не так энкодера нехватает, как нормальной отрисовки на ВЧ диапазонах, без "фантазий" графического фильтра. Ну и второй канал. И опять таки энкодер и кнопки переключения диапазонов сигнала - как в DSO150... В общем - желание есть, а вот с квалификацией пока не очень... Кстати - схема DSO150 довольно удачна в смысле организации входной аналоговой части, там и энкодер прикручен - токо производитель туда защиту прошивки ставит... В общем - ежели кто-нибудь тоже желает погрызть прогу на уровне исходников - мне было бы очень интересно поучаствовать...
_________________ Сделать сложное - просто... А сделать простое - сложнее. Шпагин (конструктор оружейник)
Не знаю, интересно это еще кому-нибудь - новую тему создавать пока не буду. попробую тут отписаться.... В общем, в рамках освоения STM32 был заказан 3,2 дюймовый TFT ЖК-дисплей 320X240 на ILI9341. На момент заказа я был еще не совсем в теме, потому совершил "небольшую" ошибочку - заказанный дисплей хотя и имел разрешение, как у DSO138, подключался по 16 битной шине (у DSO138 - по 8ми)... Так что идея попробовать собрать на этом дисплее и отладочной плате STM32F103C8T6 аналог DSO138 провалилась еще до начала работ... Ну, раз о совместимости с DSO138 речь уже не шла, для ускорения процессов освоения TFT за основу я взял уже слегка освоенный мной процессор STM32F0R8 на плате Discovery. Задача была поставлена "учебно-боевая" - сделать свою версию карманного осциллографа - больше для удовольствия, чем по необходимости, ибо Интернет полон подобными конструкциями и без меня... (ну нравится мне сам процесс программирования и отладки )... В общем - на сегодняшний день прога написана процентов на 60 - осциллограмма отображается и синхронизируется (триггер с внешнего компаратора), но пока не прописан диапазон медленных разверток и не доделана интерфейсная часть. Экран похож (оформлением) на DSO138, немного по-другому я разместил служебную информацию. Пока использую внутренний DAC, максимальная частота семплирования - 1.2 MHz при 24 точках на клетку, что дает мне 50 kHz входного сигнала любой формы с адекватным отображением (у DSO138 на этих частотах "не синус" уже рисует криво), а применяя простейшую линейную интерполяцию мы получим относительно "честное" отображение 100 и, возможно, 200 kHz. Для получения таких частот сэмплирования пришлось слегка "разогнать" процессор, он работает на 72 MHz тактовой частоты (максимальная по даташиту- 48, максимальная еще рабочая - 96 ) при тактировании ADC 18 MHz. Планирую сделать версию с внешним DAC, там есть с чем повозиться - синхронный ввод с порта с DMA... Задачка эта решена до меня - но мне интересно разобраться самому - не справлюсь, тогда буду просить помощи у корифеев... При внешнем DAC диапазон расширится (надеюсь) раз в десять, что уже позволит называть конструкцию "прибором" . Аналоговую часть еще не делал, но наработки у меня есть (см. https://radiokot.ru/forum/viewtopic.php ... 1#p2862281) - буду делать нечто похожее, хотя и несколько иначе (другие ОУ, ключи, компаратор и т.д.), еще не рисовал начисто. В интерфейсе будет энкодер (один - точно!), несколько кнопок, уровень триггера и, возможно, уровень сдвига по вертикали будут задаваться потенциометрами. Теоретически хочу оставить возможность добавления второго канала - но пока реализовывать не буду - сначала отработаю схемотехнику на одном, да и частотные параметры двухканальника сразу уполовинятся...
_________________ Сделать сложное - просто... А сделать простое - сложнее. Шпагин (конструктор оружейник)
Ну вот - не прошло и двух лет! А вдруг кому интересно - маленький отчет. Осцилл я таки сделал! На STM32F103C8T6 Экран - 3.2'
Параметры - чувствительность 5mV - 5V на клетку(левый энкодер), развертки 100mS - 2uS на клетку(правый энкодер). Полоса пропускания аналогового тракта - около 5 MHz, реально нормально видимый сигнал - 1MHz., при этом еще можно отличить прямоугольник от синуса. Автоизмерение верхнего и нижнего напряжения по экрану и частоты срабатывания триггера развертки (ну точность там не ахти - несколько %, ибо подсчет ведется по пикселям, только чтобы по клеточкам вручную не считать , режимы развертки - авто и норм (ждущий), однократный отсутствует, что в некоторых случаях компенсируется ждущим с последующим остановом (Hold). Вход - закрытый/открытый (переменка/постоянка), уровень GND отмечен левым маркером и сдвигается в пределах экрана вверх/вниз (левый энкодер после нажатия на него), уровень триггера отмечен правым маркером и сдвигается в пределах экрана вверх/вниз (правый энкодер после нажатия на него). С помощью кнопок можно выбрать режим и фронт срабатывания триггера, заморозить изображение (Hold/Run) и переключить режим входа (переменка/постоянка). Точка срабатывания триггера отмечена на экране белой линией (первая клетка от левой стороны экрана) и двигаться не может, кольцевой буфер экрана отсутствует - двигать остановленное изображение по экрану вправо/влево нельзя. "Красивостей" в виде менюшек и разнообразных измерительно-вычислительных режимов нет.
Почему именно такой набор функций и органов управления? Ну - во-первых была поставлена цель - сделать как можно проще схему, потому в ней отсутствуют внешний АЦП, память FIFO и компаратор триггера, как следствие однократный режим развертки реализовать не получилось (я вообще крайне редко его использую, даже когда он есть - в основном я занимаюсь звуковыми устройствами). Во-вторых - я делал прибор "под себя" - мне хотелось сделать удобный осциллограф с привычным (мне) интерфейсом в "аналоговом стиле" - это когда не приходится для переключения входа "на переменный ток" заходить в две менюшки, а потом выходить из них обратно (RIGOL), об "удовольствии" изменить уровень GND в DSO138 я вообще молчу... Потому у меня два энкодера (как на "больших" осциллографах и по кнопке на каждый режим. При том удобство цифрового прибора мне хотелось тоже сохранить, потому есть режим Hold, позволяющий в сочетании со ждущим режимом триггера "поймать" нужную волну и разглядывать ее сколько угодно. Да, на медленных развертках там еще и "антиалиасинг" есть.. Что касается экранных измерений - опыт работы с RIGOL'ом показал, что точность там неважная, да и основное назначение осциллографа - визуализация сигналов, потому у меня измеряются только размах напряжения и частота. Ну и последнее - дома RIGOL'а у меня нет, а DSO138 - все же слабоват - при 100 kHz он уже форму сигнала не отображает - все переводит на синус, все, что выше 10-20 kHz - сплошная аппроксимация, да и синхронизация у него на этих частотах никакая. Да, у него есть однократный режим, токо он не работает на этих частотах... Потому я "выжал" почти на порядок лучшую частотку - на развертке 2uS на клетку АЦП снимает 12 точек и линейно аппроксимируется до 24 точек на клетку. Питание - аккумулятор (пока от старой Нокии , зарядка - по микроЮСБ (контроллер зарядки ТР4056). Потребление - около 200 мА, на плате стоит DC-DC, повышает до 7.5v, отрицательное напряжение для аналоговой части преобразуется на 7660. В аналоговой части - 2 ОУ AD8065 (поначалу купил подделки, потом перезаказал и заменил первый ОУ, второй так и остался подделкой и пара коммутаторов CD4051/53. Ну как-то так...
_________________ Сделать сложное - просто... А сделать простое - сложнее. Шпагин (конструктор оружейник)
Я где-то встречал... Жаль точно не помню - но вроде была версия с энкодером и для DSO138... Жаль один только энкодер не особенно добавляет функциональности - да и там одним энкодером не обойтись - ведь если делать все управление от энкодера, то нужно чем-то переключать входной делитель... Правда - можно поставить герконовые или твердотельные реле или коммутатор на КМОП... Так все это уже сделано в DSO150, в сети есть его схема http://img.radiokot.ru/files/99520/medi ... 51phes.jpg и, возможно, прошивки... Но все остальные-то параметры остается прежними - частотка до 100kHz с неважной синхронизацией! Да и по сложности получится не проще, чем моя конструкция....
_________________ Сделать сложное - просто... А сделать простое - сложнее. Шпагин (конструктор оружейник)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения