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

Вопросы от начинающих по МК


Рекомендуемые сообщения

Конвертация исходных байтов в hex, каждые 8 значений вставлять для терминала коды 10 и 13. Отображение в терминале указать в ANSII.

Ну я не зря прошу человека :

DmitryS, напишите тут, прямо в сообщении, что хотите видеть в терминале.

Исходя из этого, выберем ему подходящее.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

Согласен, только надо не только результат показать, но и в каком виде исходные данные.

Т.е. есть ...то-то.. нужно чтоб в терминале было ...то-то...

Потому как мне именно это непонятно. Что за данные? Скольки байтные? То ли они уже в хексах, толи просто числа. Константы указываемые при компиляции или мож массив, набор переменных? Сколькибайтных? и т.п.

Нет никакой заслуги тому, кто даёт золото, думая, что даёт камень (Будда)

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Есть продвинутые терминалы, которые могут данные в нужной форме отобразить. Например, если перед передачей пакеты данных передать коды 0xFFFF и на этот код поставить условие синхронизации в терминале, он стройненько выведет нужные данные по колоночкам. Этим должен заниматься кастомный софт, а стандартный терминал так не умеет.

Название такого терминала не припомню уже, но у него еще много всяких фишек есть в т.ч. разворачивать сырые данные в числа 1-байтные, двухбайтные и т.д.

Но иногда, для целей отладки проще написать свой терминал, на джаве например который бы интерпретировал получаемые данные ровно как тебе нужно.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

Сделать конвертацию hex в строку на примере кода mali_robot #5118 я вряд ли смогу , я просто не понимаю как это работает. sprintf и printf , пытался я несколько раз с ними разобраться , но бестолково ... каких то понятий нехватает , по этому и не сростается .

Приемник радиосигналов у меня подключен к второму пину порта Д , пин настроен на вход , без подтягивающего внутреннего резистора , может надо сделать подтяжку , а то что то чувствительность почти ни какая , брелок надо в плотную к антене подносить , только тогда принимает пакеты , да и принимает только с маленького брелка , большой как не подноси не ловит совсем , тут по всей видимости дело в том , что китайский приемник ловит только АМ модуляцию и маленький брелок ратает на АМ модуляции а большой на ЧМ . Сейчас буду искать , у меня где то валялся лобовой трансивер от сигналки . он принимает и то и другое

post-187724-0-18505900-1457960259_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

пытался я несколько раз с ними разобраться , но бестолково ...

звучит как то печально

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

печально что такие элементарные вещи вызывают затруднения. Это же стандартная библиотека, бро

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

мне будет стыдно, если не объясню

итак - функция предназначена для преобразования любого числа в строку. Возвращаемое значение (строка с ноликом на конце) заносится в массив символов

sprintf(&EchoBuffer[i*5], "0x%02X", mp3_recv_buf);

&EchoBuffer[i*5] - то место куда будет возвращено значение начиная с символа указанного в скобках. Этэншон - переполнение и выход за границы не проверяется. Результат всегда имеет завершающий символ \000

"0x%02X" - маска формата. Показывает в каком формате вернуть и что к строке прибавить. Тут надо подробнее (по порядку)

0x - просто строка константа. Будет приписываться к любому числу спереди

% - после этого символа sprintf подставит число в формате следующем за %

02Х - означает что всегда будет 2 знакоместа, даже если число состоит из одного знака (F например или 0А). Пустые места заполнятся ноликом (ноль перед двойкой). Х - число отобразится в 16-ричном формате. Иначе если придет 0хF то в строку попадет 2 символа "16", а так будет "F".

mp3_recv_buf - собсна само число, которое должно быть преобразовано. Тут может быть несколько чисел подряд через запятую, но в строке формата обязательно должно быть столько же символов %, иначе будет ошибка

к примеру в mp3_recv_buf сейчас число D. После работы функции в массив &EchoBuffer[i*5] начиная с номера i*5 будет записано следующее "0х0D" точнее "0х0D\000"

самое сложное - понять принцип построения строк формата. Но примеров в гугле масса на эту тему с комментариями. Главное усвоить суть. Очень нужная функция. адеюсь в жизни пригодится

стоит так же помнить, что функция эта довольно тормознутая и сама по себе принимает только аргументы, а потом еще штуки 3 подфункции вызывает. Поэтому я себе сделал вырезку кода из библиотеки и собрал в одну функцию inline void u_sprintf(). Работает намного шустрее

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

если придет 0хF то в строку попадет 2 символа "16", а так будет "F".
Исправьте перевод систем счисления что ли.
Тут может быть несколько чисел подряд через запятую, но в строке формата обязательно должно быть столько же символов %, иначе будет ошибка
Стоит уточнить, что не ошибка компиляции, а ошибка при работе программы, то есть при сборке компилятор проглотит и скажет что так и надо, а вот когда запустите получится фигня.
я себе сделал вырезку кода из библиотеки и собрал в одну функцию inline void u_sprintf(). Работает намного шустрее
Зачастую явное, неформатное использовать преобразование числа в строку еще лучше.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Функции sprintf и printf универсальные, но очень тормозные и отбирают много памяти. Проще и наглядней сделать свою функцию преобразования числа типа CHAR/BYTE в 16-ричное представление и использовать её для отправки двоичного значения в терминал в 16-ричном виде. Делов то - разделить байт на две половинки, и по таблице взять один из 16 символов для каждой из половинок. .

Но обычно этого на этом этапе и не нужно - достаточно использовать самописный софт на стороне терминала.

китайский приемник ловит только АМ модуляцию и маленький брелок ратает на АМ модуляции а большой на ЧМ . Сейчас буду искать , у меня где то валялся лобовой трансивер от сигналки . он принимает и то и другое

Он у тебя походу вообще ничего не ловит, а то что он "ловит" это тупо наводка прямо на вход контроллера.

Или ты неправильно используешь приёмник, у которого выход с ОК и ему НЕОБХОДИМА подтяжка.

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Он у тебя походу вообще ничего не ловит, а то что он "ловит" это тупо наводка прямо на вход контроллера.

Или ты неправильно используешь приёмник, у которого выход с ОК и ему НЕОБХОДИМА подтяжка.

Пробовал я и с подтяжкой и без - ни какой разницы . Выход у него это выход операционника LM358 первая нога , надо достать осциллограф , посмотреть че у него там на выходе
Ссылка на комментарий
Поделиться на другие сайты

С терминалом вроде наладилось , один хороший человек подсказал , как преобразовать

void Send_hex(char a) {
char b;
b=a>>4; if (b<10) b+='0'; else b+='7'; Send_UART(;
b=a&0x0F; if (b<10) b+='0'; else b+='7'; Send_UART(;
} 

Изменено пользователем DmitryS
Ссылка на комментарий
Поделиться на другие сайты

Как это шаманство работает?

Я бы делал проще

if(b<10)b+='0'; else b+=('A'-0x0A);

по крайней мере, понятно, какие символы будут выведены.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

подскажите, кто применял микросхему pl2303hx

подключил для проверки, RX-TX замкнул, шлю данные- возвращается какая то ересь: 1- 127: 55- 100

может у этой микросхемы есть какая то настройка?

Ссылка на комментарий
Поделиться на другие сайты

Как работает я полностью не понимаю , но работает точно . Как понять вот эти записи b+='0'; не понятен 0 в кавычках или 'А'

b+='0' это b = b + '0' - Сложение, совмещённое с присваиванием.

if(b<10)b+='0';else b+=('A'-0x0A);

COKPOWEHEU, видимо имеет ввиду что по предоставленной им строчке сразу видно что по ветке "истино" идет смещение от нуля (цифры), а по ветке "ложно" идут буквы смещение от первой буквы "А".

А так это суть одно и тоже.

Идет сравнение по условию меньше ли десяти. если мень ше надо отобразить цифру, но цыфра начинается с кода 48 = '0'.

Если более 10-ти значит надо отображать буквы (в шестнадцатиричной системе счисления на счет 10 - A, 11 - B, 12 - C, 13 - D, 14 - E. 15 - F).

Но букввы начинаются с кода 65 = 'A'. Т.е. На счет 10 нужна цифра 65, на счет 11 - 66. (65- 10 = 55 это код '7', как в вашем коде. Только у вас 10 + '7' (10 + 55) - согласитесь малопонятно хоть и верно. А у COKPOWEHEU сразу видно в коде символ 'A', т.е. что пошли от буквы 'A' + смещения.

-0x0A

Т.е. минус 10 (кстати этот циферь лучше бы в десятичной оставить). Отнимание необходимо чтобы откинуть цифры от 0 до 9. 'A' - "десятая".

Например пусть b = 12 Нам нужно вывести в терминалку символ 'С' (согласно шестнадцатиричной системе счисления).

А букве 'C' соответствует по таблице ANSII цифра 67. Т.е. наша мегафункция должна вернуть в ответ на цифру 12 цифру 67.

Ну ка проверим.

Условие b<10 (12 <? 10) !! не выполняется идем во ветке else b+=('A'-10); считаем b = b + ('A' - 10) = 12 + (65 - 10) = 67. Что и соответствует символу 'C' по таблице ANSII.

Хотя запись b+=('A'-10) при раскрытии логичнее выглядит в виде b = (b -10) + 'A' а не b = b + ('A' - 10), т.е. (b -10) это конкретно смещение от буквы 'A', впрочем с точки зрения математики разницы нет.

Надеюсь просто объяснил.

Изменено пользователем Microchip

Нет никакой заслуги тому, кто даёт золото, думая, что даёт камень (Будда)

Ссылка на комментарий
Поделиться на другие сайты

Вот за что я не люблю С, когда можно простые функции сократить так что непонятно с первого взгляда как они работают.

И эта фиговая способность языка считать символы 8-битными целыми числами, это тоже путает будь здоров.

B+=5 лучше ВСЕГДА записывать как B = B + 5. Сокращённая форма записи нужна совсем для других случаев, когда одним выражением не обойтись. Но и те случая в принципе тоже могут быть развёрнуты в более понятную форму.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Первые шаги, прошу снисходительно отнестись. Есть устройство, с 4-ями светодиодами, при поступлении сигнал один из -4х или все вместе загораются. Задача увеличить время свечения этих светодиодов. Решил дополнить еще одним МК, Но мыкаюсь ничего не выходит. Не тухнет диод после задержки, и не могу разобрать, как сделать условие для всех входов и выходов. Срабатывает по одному порту, входа, и выхода. Код сокращен, не стал указывать, как пытался сделать функцию для всех портов, чтоб не смешить людей.

Chip type : ATtiny2313

AVR Core Clock frequency: 8,000000 MHz

Memory model : Tiny

External RAM size : 0

Data Stack size : 32

*******************************************************/

#include <io.h>

#include <delay.h>

// Declare your global variables here

void main(void)

{

DDRB=0x00; // порт работает на вход

PORTB=0x00; // установка 0 на выводах

DDRD=0xFF; // порт работает на выход

PORTD=0x00; // установка 0 на выводах.

while (1)

{

if(PINB.0==1)

PORTD.0=1;

delay_ms(300);

PORTD.0=0;

}

}

post-182921-0-86486800-1458495314_thumb.jpg

Изменено пользователем Тарапунька
Ссылка на комментарий
Поделиться на другие сайты

Что непонятного может быть в операторе += (увеличить число) или -= (уменьшить число) чтобы стараться ограничить его использование? Сокращенную запись для того и придумали, чтобы ей пользоваться. Например, не переписывать длинное имя переменной несколько раз, или совершать меньше ошибок при изменении имени переменной.

В чем проблема считать 8-битные коды символов 8-битными числами тоже непонятно. Наоборот, это гораздо удобнее при преобразовании цифры в символ. Проще и понятнее написать x += '0', чем, как в паскале, x := chr( ord(x) + ord('0') );

Вот использовать вместо символа его десятичный или еще какой цифровой код - дикость, потому что сильно снижает понятность кода. Как в том же примере, операция b += '7' гораздо менее очевидна, чем b += ('A'-0x0A), хотя делают они ровно одно и то же. Но символ '7' не привязан ни к чему, он случайно оказался равен разности символа 'A' и числа 10. Вопрос, записывать ли 10 или 0x0A спорный, мне больше нравится второй вариант, поскольку переводим-то в шестнадцатеричную систему, выводимому символу соответствует шестнадцатеричная цифра. По аналогии, первую часть можно было записать как b += ('0' - 0x00);

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Это как раз то зло которого не должно быть в программировании. Еще скажи что помогает программу быстрее набирать на клавиатуре...

В чем проблема считать 8-битные коды символов 8-битными числами тоже непонятно.

В 90-х годах может это и было нормальным, но уже на дворе 2016-й год, давно уже НИКТО не считает символ байтом и кроме того форматов этих символов появилось как грязи.

Попробуй ту же фишку провернуть с UNICODE-символами.

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

Причём эта фигня генерирует просто поражающие воображение поля из граблей.

Не тухнет диод после задержки, и не могу разобрать, как сделать

while (1)

{

if(PINB.0==1)

PORTD.0=1;

delay_ms(300);

PORTD.0=0;

}

Присмотритесь к коду повнимательней. Ещё внимательней, пока не снизойдёт озарение.

На самом деле он тухнет, но... на считанные МИКРОСЕКУНДЫ, потом загорается вновь на 300 милисекунд.

Разница в 5 порядков, ясное дело что глазом не успеваете заметить.

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Не вижу ничего плохого в быстроте набора программы и легкости ее чтения.

А разве UNICODE уже кодируется одним 8-битным char'ом? Вроде для этого wchar_t придумали, который с char'ом несовместим. И из-за этого с ним гораздо сложнее работать. Тем более контроллеру: ворочать 4 байтами там, где достаточно 1. ASCII все еще остается стандартом с вполне пригодна для вывода английского текста без спецсимволов. Для многих применений этого достаточно, и тот же вывод 16-ричных чисел к ним относится. Возможно, представление 8-битного ASCII-кода символа числом это костыль, но вряд ли его прекратят поддерживать в ближайшем будущем, так зачем жертвовать читабельностью кода?

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

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

#define TIME_MAX 10000 //время горения, в периодах срабатывания таймера
//настройку и запуск таймера, а также выбор из доступных опускаю, в данной задаче это не важно
ISR(TIMER???_vect){ //прерывание оформлено в стиле avr-gcc, а не cvavr. Если надо, измените на свое
 static unsigned int time[4] = {0,0,0,0}; //рекомендую посмотреть, что означает модификатор static и почему без него работать не будет
 char signal = PINB;
 static char old_signal = keys;
//запись получается громоздкой, но от битовой магии я отказался в угоду наглядности
 if( (signal & (1<<0)) && (!(old_signal & (1<<0))) ){ //первая скобка - "равен ли текущий уровень лог.1" ; вторая - "равен ли предыдущий уровень лог.0" ; объединяем лог.AND и получаем детектор фронта - "изменился ли уровень с лог.0 на лог.1"
   time[0] = TIME_MAX; //запускаем таймер
   PORTD |= (1<<0); //включаем диод. Кстати, конструкция подобная "+=". Писать PORTD = PORTD | (1<<0); мне лень, к тому же такая запись короче и легче воспринимается
 }
//здесь обработка остальных каналов
 if(time[0] > 0){
   time[0]--; //учите Си, это стандартная конструкция, как бы их не ненавидел Alexeyslav
   if( time[0] == 0 ) PORTD &=~(1<<0); //гасим диод
 }
//обработка остальных каналов
 old_signal = signal; //для следующего цикла наше "текущее" значение будет уже "предыдущим"
}

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

UTF-8 кодируются. Верней может кодироваться.

Конечно, попридумывали всяких разных чаров несовместимых друг с другом и всё из-за этого злополучного чара-байта, чтобы не сломать совместимость. Одна проблема создаёт кучу других.

Это вообще идеологически неправильно оперировать символом как числом, то что они на каком-то этапе стали тождественными не означает что так и должно быть. Из-за этого много проблем возникает в программах.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Это как раз то зло которого не должно быть в программировании. Еще скажи что помогает программу быстрее набирать на клавиатуре...

[

За замечание спасибо. Мне не нужна цикличность функции. Мне надо, чтоб происходил постоянный опрос пинов 0-3 порта Д. И при появлении на одном из них 1, установить 1 на аналогичном пине порта Д. После установки 0 на пине порта Б, выдержать, допустим 20 сек. и установить 0 и на порте Д, отключив светодиод.

Изменено пользователем Тарапунька
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Этого не может быть. 15мм для этих 5-дюймовых авто-хрюшек - смертельный трюк, и произойдёт уже тогда, когда вся подвижка распрощается с корзиной.    Если реально так, то только в большой ЗЯ - объём двери "шохи" само то для этих пийониров; ПАС для них сильно жирно. 
    • У меня такой вариант.  постараюсь протестировать завтра совместно с wm019.  ещё задумался над колонками, sb-pm4 есть ли смысл в них. или мелкие 15ас лучше.   
    • Зачем? Это всего лишь буферная ёмкость между ИИП и платой усилителя, сглаживающая возможные просадки. А плёнка/керамика есть(должна быть) на плате, возле питающих микросхему "ног", как в этом варианте  Поскольку система бюджетная, для "2." пара 15ас-213 вполне приемлема. А что ты планируешь в качестве ".1"?  Сабвуфер всё-таки.
    • Ну, обычное сложение диодным "ИЛИ" выходов интеграторов каналов стабилизации выходного напряжения и выходного тока, "кто перетянет". В чём вопрос-то? Будет ли работать? Ну будет работать. Или вам мнение про что-то другое надо?
    • Если плата односторонняя - поставьте заклёпку.
    • Очевидно, внимательно смотреть по всем цепям, которыми подключено, начаная с питания?
    • Вот любительская конструкция в которой можно подглядеть интересную систему замера сопротивления и в целом возможную топологию.   Так же советую заценить мануалы на В7-38, В7-84 и особенно В7-87. Последние два весьма современные приборы, и из В7-87 по сути весь "фронтэнд" можно взять как базу. Однако, прежде чем начать разрабатывать конкретную схему, стоит уточнить требования к итоговому прибору, да и его конструктив в том числе. Настольный/переносной? Какая у прибора будет разрядность? Какой будет использоваться АЦП? На тему встроенных АЦП МК есть отличная статья от Леонида Ивановича, где описана проблема, которая возникнет при работе с ними, и метод её решения. https://leoniv.livejournal.com/194681.html С диапазонами непонятка. В параметре "10мВ-1В" что имеется в виду? Не понятно, почему все пределы не кратны по десятке (например, 1/10/100 или 5/50/500). С токовыми пределами тот же вопрос, 1мА-100мА что означает, и почему пределы 1А и 5А не кратны друг другу, скажем как 1А и 10А (ну или обратно, 5А и 500мА)?   Касательно входного делителя. Не обязательно делать его на все пределы индивидуально, поставьте туда перед АЦП усилитель-буфер с переключаемым усилением между х1 и х10, например, ведь в любом случае, от схемы требуется измерять ток, а для этого нужен будет усилитель сигнала с шунта. Поэтому можно использовать этот усилитель для добавления в делитель некоторых пределов. Делитель будет делать "шаг" в сто раз - х1 х100, а после него стоит усилитель, добавляющий, в данном случае, предел х10 и х0.1 Так, например, построен В7-38, разве что х10 усилителя там нет, это "усиление" реализовано за счёт переключения предела АЦП с 2В до 0,2В. Коммутаторов, в таком случае, в цепи напряжения будет два - реле переключающее х1 и х100 делитель, поскольку оно работает с возможными +/-500В по входу, и ключ на полевиках типа DG419/DG411/4052/4053/etc, переключающий усиление буфера между х1 и х10, работающий с +/-5В максимум. Обычно делители ставят по принципу R+9R+90R+... и тд, таким образом мы в любой точке включения получаем делитель, дающий одну десятую/сотую и тд от входного напряжения. От этого метод с усилителем в 10 раз и кажется мне более логичным - нужно реализовать всего один делитель 99:1 (например из двух резисторов МРХ 10 МОм и 100кОм, параллельно 100кОм прицепить цепочку настройки, которая собьёт его сопротивление до 90к), после чего уже индивидуально подстраивать х10 усилитель и входной делитель. Плюс, получаем узел, который можно использовать для усиления сигнала с шунта. В целом, так же можно снизить и число шунтов, в "крутых" приборах я видел их от силы два, на "много ампер" и на "всё остальное", что реализуется усилителями после них. Тут уже вопрос стоит в том, какое падение напряжения на шунте максимально допустимо для конструкции. Я в своих мыслях по измерителю на ICL7135 пришёл к выводу, что пожертвовать 0,1В...0,2В на амперметр это максимум, который можно себе позволить.   PS На всякий случай, а то может кто прицепится Я не предлагаю использовать такие экзотические вещи, как сборки согласованных резисторов, а так же сильно запариваться над эффектами, которые по-хорошему надо бы учесть при финальном проектировании - навроде дрейфа коэффициентов деления/усиления от температуры, потому что не тот уровень конструкции. Исходя из скромного ТЗ, как я понял, задачи получить какой-либо серьезный измеритель не стоит, чисто прибор уровня детешки +/-, с возможностью вывода значений во внешний мир через USB. PPS Мануалы на вышеназванные мультиметры со схемами: v7-87.pdf v7-84-тпг.pdfВ7-38 - ТОИЭ (вариант 1).djvu
  • Похожий контент

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