Расширение возможностей простого МК вплоть до АЦП на 2 или 1 выводе.

 Постановка задачи: Есть микроконтроллер (далее МК) у которого нет АЦП. Надо создать варианты схем, способных выполнить роль АЦП с некоторой точностью и минимальным внешними деталями. А также схемы для измерения сопротивления переменного резистора с дополнительными функциями подключения кнопок и светодиодов на один вывод МК. Одним словом, нарастить и расширить способности самого простого МК.
  Первые комментарии к статье были слегка снисходительны: «Ха! На старье работает». Однако, не все так просто, придется уточнить идею. Эти варианты схем, действительно, могут использовать древние МК типа Pic16F84, у которого есть только ноги, таймер и больше ничего.
  Более интересный вариант, когда эти схемы могут быть применены к уже готовым, воплощенным в печатную плату изделиям для расширения их возможностей.
  Допустим, у МК на плате есть 1 или 2 свободных вывода, тогда при добавлении 3 деталей каким-нибудь навесным монтажем, можно получить новые функции уже готового изделия.
  Допустим, у МК на плате нет свободных выводов, но он имеет потенциометры, кнопки и светодиоды, подключенные к нему, тогда, при помощи схем указанных в конце статьи, можно объединить их на 1 вывод МК и, таким образом, освободить 1 или 2 его вывода для организации АЦП.
  Так получилось, что осталось у меня от одного проекта приличное количество МК Pic16F630 в корпусе SOIC14, а в нем из периферии, только компаратор с внутренним опорным напряжением с регулировкой от 0 до 15 единиц в 1/24 от напряжения питания. Компаратор я, конечно же, использую, но иногда его недостаточно. Допустим, надо померить входное, выходное напряжение на устройстве, ток, да еще 2-3 переменных резистора для управления, а у компаратора всего 2 переключаемых входа. Ну не выбрасывать же их, надо использовать. Тем более, что цены на них теперь «кусаются». В марте 2021 года в Чип-Дип покупал Pic16F684 по цене 110р. и Pic16F1825 по цене 130р., а теперь, в ноябре 2022 года, они стоят соответственно 360р и 520р., то есть в 3-4 раза больше.
 Аналог АЦП на 2-х выводах и RC цепочке при минимальном количестве внешних деталей.
   Этот вариант может быть реализован при добавлении 3-х деталей: 2 резистора и конденсатор.
Много схем существует с одним конденсатором и одним резистором, но мне они не понравились, так как имеют 2 недостатка:

1. Разряд конденсатора производится выводом МК без ограничения тока и какова его величина в начальный момент времени узнать невозможно, но, видимо, он превышает допустимый;
2. Таким способом можно измерить только напряжение, которое превышает порог срабатывания 1 порта МК, то есть примерно 1,22в. Если оно ниже, то измерить его невозможно.
  Поэтому, предлагается другая схема измерения напряжения на 2-х выводах МК. Один управляет делителем и конденсатором, второй измеряет время достижения порога.
Аналог АЦП 2 вывода
 Логика работы:
  1. Порт1 МК на выход и установить 0 в течение примерно 5 милиСек для установления поделенного напряжения на конденсаторе. Разряд конденсатора до измеряемого напряжения происходит достаточно медленно, примерно от 5 до 8 милиСек. Это время определяет, как часто мы сможем измерять напряжение. В этом случае резистор R2 по схеме работает нижним плечом резистивного делителя;
  2. Порт1 МК установить в 1 и запуск таймера. Теперь резистор R2 заряжает конденсатор от поделенного измеряемого напряжения до порога 1 Pic;
  3. Порт2 МК ожидает 1. Когда конденсатор зарядится до напряжения порога, то остановить таймер, порт1 на 0;
  4. Расчет полученного результата и приведение его в удобный для индикации вид.
Следует заметить, что чем выше напряжение, тем меньше измеренное время и наоборот. Самое большое время имеет нулевое напряжение (Время Нуля).
  Для того, чтобы получить прямую зависимость необходимо из времени Нуля вычесть измеренное время.
Чем больше напряжение, тем меньше время, тем меньше мы вычитаем из времени Нуля, тем больше получаем результат. Время нуля зависит от номиналов схемы и напряжения питания. Его сохраняют в ЕЕПРОМ.
Математика процесса.
  Заряд конденсатора происходит не с 0 до 5 вольт, а от измеряемого напряжения поделенного резистивным делителем до 5 вольт и это вносит свои особенности в расчеты. Лучше всего это обсуждено и дан пример расчета на форуме forum.ixbt.com/topic.cgi?id=48:7903 участник Vladlog во второй половине страницы.

  tзар=-ln(1-Uizm/U5)*RC;
Uizm = Uпорог(1,22в) – Uизм.напряжение; Напряжение на которое надо зарядить конденсатор за минусом напряжения на которое он уже заряжен;
U5 = 5 — Uизм.напряжение; Напряжение, поданное на RC цепь за минусом напряжения на которое уже заряжен конденсатор.

  Для расчета была создана таблица в Excel и проведен расчет для коэффициента деления резисторами равному 4, чтобы не усложнять при изложении расчеты. Две нижние строки помечены серым, потому что напряжение превышает порог 1.
  По результатам этого расчета можно сделать выводы.
Если не нужна точность, то эту схему можно использовать. Точность измерения колеблется от -5% до 8%. В центре диапазона точность можно легко довести до 0%. От этой точки +/- 1В ошибка достигает 3%, далее по краям она становится еще больше. Можно разбить весь диапазон на 7-8 поддиапазонов для кусочно-линейной коррекции, тогда точность можно довести до 1-1,5%.
  Центр точности можно сдвигать, изменяя, либо емкость конденсатора, либо сопротивление входного резистора, что удобнее, так как резистор можно подобрать из 2-х резисторов, либо поставить подстроечный.
  Скорость измерения можно вписать в 255мкС, то есть в один байт, используя R = 10кОм, конденсатор около 100 наноФарад и коэффициент умножения для перевода в милиВольты = 16, но точность падает из-за ошибки на округлении времени измерения, которое потом умножается на большой коэффициент. Оптимальный вариант R2 = 10кОм, конденсатор около 220 наноФарад и коэффициент перевода в милливольты = 8. Время измерения примерно 650мкС. Надо стараться время Нуля держать около 5000милиВольт / 8 = 625 плюс время Максимального измеряемого напряжения. Допустим для 5в, оно составит 25мкС, тогда 650-25 = 625 => 625 * 8 = 5000 мВ. В этом случае расчеты надо производить с 2-х байтовыми числами.
  Коэффициент перевода в милливольты или другими словами умножения выполняет 2 задачи: Восстанавливает значение поделенного резистивным делителем напряжения и приводит измеренное время к милливольтам. Чтобы это удобно было считать на МК желательно придерживаться цифр 2, 4, 8 и т.д. Если у нас резистивный делитель на 5, то сначала результат надо умножить на 5 и затем уже доводить его до милливольт. Как показывает практика, можно обойтись без умножения на 5 просто подобрав удобную RC цепь. Обратите внимание, что конденсатор в расчетах 0,234 микроФ, но можно подбирать не его, а сопротивление входного резистора. Он мало влияет на заряд конденсатора, но влияет на коэффициент деления входного напряжения и его можно сделать таким как нам удобно и вывести центр точности на нужное напряжение в диапазоне измеряемых напряжений.
   Пример файла расчета в Excel 2003 я постарался прикрепить к статье в Zip-архиве, ссылка внизу после статьи.
Таблица расчетов АЦП 2 вывода
График_расчета_АЦП
   В таблице зеленым цветом указано Время 0, из которого вычитается измеренное. Если вдруг измеренное время окажется больше его, то результат окажется близким к 65500, то есть меньше нуля. Расчет производился для коэффициента деления входного напряжения на 4. На графике первые значения имеют шаг измерения напряжения 0,05, затем 0,1 вплоть до 0,5в. Затем шаг между напряжения = 0,25В. Это видно на графике. Мне интересно было посмотреть измерение малых напряжений, чтобы использовать это для измерения тока на малых сопротивлениях. Как видно из таблицы при указанных параметрах разница между 0в и 50 милиВольт = 6мкС, то есть 1мкС – это 12 милиВольт. Пограничная ошибка в 1 мкС при измерении дает 12мВ/50мВ =24% ошибки при малых напряжениях. Коррекция разбита на 7 диапазонов, после нее ошибка в основном практически не превышает 1%, кроме первых трех, что видно из таблицы.
Коррекция Ошибок АЦП
  Надо заметить, что для измерений я использовал не самый лучший конденсатор, может быть, это влияло на результаты.
И еще, эта схема весьма чувствительна к напряжению питания МК, так как от этого зависит порог срабатывания 1 на его входе.
Для начала работы надо собрать схему, измерить номиналы всех элементов схемы, провести расчеты с ними.
Далее надо измерить Время 0 и запомнить его в ЕЕПРОМ.
1. Измеряем время заряда конденсатора для текущего измеряемого напряжения;
2. Вычитаем это время из Времени Нуля. 2-х байтовая операция;
3. Умножаем результат вычитания на коэффициент перевода в милиВольты.
Если нужна корректировка, то либо вычислить, либо подобрать опытным путем. Пример корректировки указан в таблице на скриншоте. Если нужны несколько характерных значений, например, напряжение на аккумуляторе 4в 3,7в 3,3в 3в 2,7в, то можно просто составить таблицу и сопоставить измеренное время с этими напряжениями.
  Ожидание достижения порога срабатывания порта 2 МК можно организовать через прерывание, чтобы в это время делать что-нибудь полезное. Время измерения зависит от величины измеряемого напряжения: при 0 – это 650мкС, а при приближении к 5 вольтам около 20мкС.
  На практике результаты, выведенные на индикатор, практически подтвердили приведенные здесь расчеты.
Естественно, что все параметры могут быть пересчитаны на другое измеряемое напряжение, изменяя параметры резистивного делителя, например, от 0 до 100В. Можно установить другое время измерения, желательно увеличить, чтобы на 1мкС приходилось не 12мВ, а 6мВ или 3мВ, но при этом время измерения около 0 будет соответственно 1,3милиС и 2,6 милиС. Да еще нужно учитывать время на разряд конденсатора с порога 1,22вольта до поделенного измеряемого напряжения, которое примерно в 5-8 раз больше, чем время заряда.
  Аналог АЦП на 1 выводе МК и RC цепочке при минимальном количестве внешних деталей.
   Проведя работу с АЦП на 2-х ногах, я подумал, а можно ли сделать тоже самое на 1 ноге МК.
Оказалось, что это возможно. Но в этом случае практические результаты не стыкуются с расчетными данными, и предсказать их невозможно. Линия измерения напряжения, полученная практически, как бы повернулась в сторону увеличения ошибки, видимо, во время переключений возникают какие-то остаточные токи, которые уменьшают время относительно расчетного.
Надо заметить, что для измерений я использовал не самый лучший конденсатор из серии желтых маленьких, так называемых многослойных, может быть, это влияло на результаты.
  И еще, эта схема весьма чувствительна к напряжению питания МК, так как от этого зависит порог срабатывания 1 на его входе. У меня был подключен модуль семисегментых индикаторов MAX7219 вместе с МК и показания, что называется «скакали», а по питанию наблюдалась приличная просадка в момент включения отдельного индикатора при динамической индикации. И это несмотря на то, что интенсивность свечения была указана 2 из 15. После того, как питание индикатора было включено через резистор 15-20 Ом, а на питание поставлен большой конденсатор в 1000мкФ, результаты «встали как вкопанные» и только на границе между двумя соседними напряжениями подрагивали. При снижении напряжении питания на 0,1 вольта Время 0 увеличивалось на один цикл опроса в 6мкС.
  Общее время измерения по сравнению с вариантом на 2-х выводах МК увеличивается на время переключения порта на вход. Время разряда конденсатора остается таким же.
  Из-за того, что во время заряда конденсатора, порт работает на выход и не может опрашивать напряжение на конденсаторе, то мы можем не обнаружить достижения этим напряжением порога срабатывания. Это мы обнаружим только после переключения порта на вход. Это дает дополнительную ошибку квантования и потому надо стараться уменьшить квант времени заряда. Практически удалось в программе сформировать квант заряда около 6мкС и время на опрос примерно 7 мкС. Чем меньше квант заряда, тем больше количество опросов и переключений порта с входа на выход. Если время 0 примерно 600мкС – это 100 квантов по 6 мкС и к ним надо прибавить еще время переключения на опрос, то есть 7*100=700мкС. Всего 1300мкС. При коэффициенте перевода в миливольты 8, нам не получится измерить напряжение меньше 48 (6*8) миливольт. Эти параметры для МК от внутреннего 4мГц генератора, 1 операнд – 1мкС.
Схема АЦП 1 вывод
  На конденсаторе образуется своеобразная лесенка, что видно на осциллографе. Во время опроса, видимо, входной резистор R1 влияет на напряжение конденсатора, но его влияние уменьшено на коэффициент деления напряжения.
  Фактически полученные результаты показаны в таблице. Расчетное время Нуля должно было быть в районе 640-650, а фактически эта цифра составила примерно 576-582мкС. Объяснить это я не могу, может быть, качество конденсатора сказывается.
  Ошибка увеличилась практически более чем вдвое. Однако, есть возможность подстроить центр точности на нужное напряжение входным сопротивлением, откорректировать кусочно-линейной аппроксимацией, либо использовать таблицу по нужным значениям напряжения.
Таблица график 1 вывод
  Желтая линия на графике – это процент ошибки умноженный на 10, чтобы все можно было видеть на одном графике.
Для примера привожу часть программы измерения на 1 выводе на Ассемблере для Pic МК. Если убрать операции nop, сдвинутые влево, то можно уменьшить квант зарядки до 5мкС, но тогда увеличивается время измерения 0: 600 / 5 = 120, тогда на время переключения 7мкС*120 = 840мкС. Всего 600+840 = 1440мкС. Тогда минимально регистрируемое напряжение 5мкС * коэф. пересчета в милливольты 8 = 40миливольт. Но я не стал этого делать, опасаясь, та как ошибка на переключениях станет еще больше.
call init_lcd      ;вызов инициализации драйвера MAX7219   Каждая строка это 1мкС, кроме goto - 2мкС
      	call VostVremya0   ; Достать _время НОЛЬ_ из EEPROM
zarIzm	bcf PORTA, 5   	   ; резистор делителя на ноль для деления изм. напр.
	call Nol_Tmr1	   ; Обнулить таймер 1  для ожидания времени измерения
	bsf T1CON, TMR1ON  ; вкл. запуск таймер 1
zdem16	btfss TMR1H, 5     ; ожидаем 5 разр.таймера  8192 милисек
	goto zdem16	   ; Ждем опорное напряжение на входе
	call Nol_Tmr1	   ; Обнулить таймер 1 для измерения
	bsf PORTA, 4       ; для осциллографа
	bsf PORTA, 5       ; резистор делителя на 1 для изм. напр. через 2 будет на вход
  ;   ===  Начало измерения  ======
skvant	bank1 		   ; переключение   
	bsf TRISA, 5   	   ; на вход   ; __ Стоп заряда конденсатора __
	bank0
	bcf T1CON, TMR1ON  ; СТОП таймер1 прекратили заряд и измерение времени
zdemP	btfsc PORTA,5 	   ; ждем единицы на входе измерения напр. RA5
	goto estPor	   ; если 1, то уходим на Фиксацию измерения
 	bank1 		   ; если 0, то продолжаем заряд  конденсатора 
	bcf TRISA, 5   	   ; 
   ; ___ Заряд конденсатора  ___
	bank0
	bsf T1CON, TMR1ON  ; ЗАПУСК таймер 1
  nop  		   ;  квант заряда 6мкС, если убрать, то  уменьшаем до 5мкс 
  nop		   ;   7 мкС    результаты более стабильные 
 	goto skvant  	   ; уйти на след. цикл заряда конденс. до порога входа      !!! 2 машинных цикла
;  _ Конец цикла измерения времени  ___
estPor	bcf T1CON, TMR1ON  ; если 1, то СТОП таймер1
	bcf PORTA, 4 	   ; для осциллографа
	movf TMR1H, W
 	movwf VremyaH	   ; фиксируем время измерения
	movf TMR1L, W	
 	movwf VremyaL	
 	bank1 		   ; перекл. на выход. Попали сюда из ситуации,когда вывод бы настроен на вход.
	bcf TRISA, 5   	   ; 
	bank0
	bcf PORTA, 5       ; прекратить заряд и разрядить конденсатор до поделенного измер. напряжения
  ; На расчет результатов
	  movf Vrem0H, W   ; копируем результат в арифм.операнды
          movwf Slag_0_Hig             ;
	  movf Vrem0L, W   ; копируем результат в арифм.операнды
          movwf Slag_0_Low             ;
	  movf VremyaH, W   ; копируем результат в арифм.операнды
          movwf Slag_1_Hig             ;
	  movf VremyaL, W   ; копируем результат в арифм.операнды
          movwf Slag_1_Low             ;
  	call Sub_16bit           ; Вычесть из Времени НУЛя  измер.время -> 
  ; Умножение на 8 уход на подпрограмму умножения
  ;  call bin2bcd   преобразование в 10-ный  для Индикации  

 Итог: Работать с этими схемами можно, но существует некая сложность расчетов и практической корректировки ошибки до точности 1-2%.
  Особенно неприятно, что надо заранее измерить Время Нуля, записать его и потом уже можно с этой схемой работать. А если поменялись питание МК, входной резистор для подстройки центра точности и еще что-нибудь его надо заново перемерить.
Можно это процесс автоматизировать, например, запоминать максимальное время измерения и считать его временем Нуля, но тогда перед измерением надо физически подать 0, например, если это возможно, замкнуть пинцетом вход измерения, либо каким-то другим способом обеспечить 0 при первом измерении.
  Можно записать измеренное Вами время в ЕЕПРОМ, но если, вдруг, при вычитании измеренного времени из времени 0 образуется отрицательное число, которое легко обнаружить по 1 в старшем бите (7) старшего байта, то в течение работы программы будет использовано наибольшее число как Время 0. При следующем старте МК будет восстановлено старое значение из ЕЕПРОМ. Либо, если число отрицательное, то обнулить его, как будто мы не смогли распознать напряжение около 0.
  Главное во всех этих способах – это достоверность результата пусть даже и с ошибкой, но известной нам.
Фото Измерений 1 вывод
   На фото слева время измерения в милиСек. В середине расчетное измеренное напряжение. Справа входное напряжение.
На первом фото слева Время Нуля. Я, на всякий случай, добавил к нему 1 и поэтому на индикаторе 8 – это коэффициент перевода в милиВольты. На этих фото указаны измерения при длительности кванта заряда 7 мкС. Ошибка измерений слегка уменьшилась и как-то выровнялась. При этом общее время измерения с учетом переключений на опрос входа составило для 0 вольт – 1280 мкС, а для 4,5 вольт – менее 300 мкс.
И не забываем, что для следующего измерения надо разрядить конденсатор до измеряемого напряжения, а на это надо в времени 8-10 * Время Нуля = 600 * 8 (10) = 4800 мкС. Шаг между соседними показаниями 7мкС * 8 = 56 милиВольт. Разрешающая способность 56 / 5000 = 1,12% плюс еще ошибка от нелинейности заряда, которую можно программно откорректировать 1-1,5%, итого можно добиться 2,5-3% точности.
   По ощущения показания стабильные, при перестройке напряжения многооборотным резистором показания «моргают» в пределах прим. 5 градусов его поворота это говорит о приличной стабильности порога 1 у МК. По истечении более 1 часа работы показания не изменились.
   Для повышения точности надо увеличивать время измерения и, тогда будет уменьшен коэффициент пересчета в милливольты. Например, в 8 раз увеличили время измерения, то есть 1280 * 8 = 10 240 мкС, время разряда для следующего измерения 8* 10240 = 81 920 мкС, тогда теоретически разрешающая способность составить 7 милиВольт.
7 / 5000 = 0,14% плюс еще ошибка от нелинейности заряда, которую можно программно откорректировать 1-1,5%, итого можно добиться 1,5-1,7 % точности.
 Это время и разрешающая способность сопоставимы с дельта-сигма АЦП. Это, конечно, радует, но огорчает, то что все это время в 10 милиСек МК будет на 100% занят этим измерением и ничем другим не сможет заняться.
Пытался поставить квант заряда 5 мкС, но мне не понравились результаты.

   В некоторых случаях большая точность не нужна. Например, у меня есть плата управления микродвигателем. Плата разведена, но там не было заложено измерение напряжения на двигателе от 0 до 24В, а теперь оказалось, что это было бы неплохо и в наличии всего один свободный вывод. Уже упоминался случай с аккумуляторами, где надо контролировать небольшое количество контрольных напряжений. Датчики температуры резистивные или на термопаре, как правило, контролируют не более 3-х точек.
P.S. Полевые транзисторы порта МК, их канал сток-исток имеют собственную емкость и при переключении с выхода на вход, если между 2 этими состояниями большая разница в напряжении, то требуется примерно от 1 до 4-5мкС для разряда этой емкости через резисторы схемы измерения. По данным Microchip емкость выходного порта примерно 50pF.
При сопротивлении 100 килоОм время заряда составит 5 мкС. Фактически время заряда/разряда по наблюдениям на осциллографе при переключении с 5в в момент заряда на вход до уровня порога 1,22в, при сопротивлении 68 килоОм составило что-то около 4 мкС. На рисунке примерная картина процессов на порту при переключении (зеленый), как из 5в до порога, так и с 0 до порога. Это примерный расчет схемы в Pspice. Между вертикальными линиями 10 мкС.
Переключение на вход
  Следовательно, чтобы это время было меньше, надо стараться для быстрого разряда емкости сток-исток использовать резисторы как можно меньше, а увеличивать конденсатор в схеме. Однако, надо не забывать о входном сопротивлении схемы измерения, чтобы она не влияла на работу измеряемой нами схемы. Компромиссом можно считать номинал около 30-47 килоОм, а конденсатор 150-300 наноФарад. Это обстоятельство следует учитывать и делать задержку после переключения на вход и перед опросом порта в 2-5 мкС, в указанной программе – это 2 команды, то есть 2мкС. Может быть, это и добавляло ошибку при измерениях в варианте схемы на 1 выводе. При заряде порт заряжает конденсатор через резистор напряжениям 5в, а после переключения на опрос пытается через этот же резистор узнать какое напряжение на конденсаторе, а в это время емкость сток-исток пытается разрядиться через этот же резистор. В настоящее время не могу это проверить, так как схему уже разобрал для опытов с дельта-сигма АЦП. Следующая статья будет посвящена дельта-сигма АЦП и общему анализу возможностей схем организации аналого-цифрового преобразования на простом МК.
  Варианты подключения Переменного сопротивления, кнопок и светодиодов на один вывод МК.
Потенциометр Кнопки Светодиоды
На рисунке 1 указана примерная схема подключения Переменного сопротивления, двух кнопок и светодиода на один вывод МК. Подбор номиналов цепочки резистор от питания к переменному сопротивлению и конденсатору, а также светодиод со своим резистором должен быть рассчитан так, чтобы при максимальном сопротивлении переменника время заряда конденсатора до 1,22в (прим. Порог срабатывания 1 у МК Pic16F630) был близок к цифре 255мкС для удобства расчетов. На этой схеме при минимальном его сопротивлении время заряда прим. 50мкС, а при максимальном – 227мкС.
   Уровень напряжения на конденсаторе при разряде, то есть вывод МК на 0, должен быть менее 0,8 В (R6,R4,R5), а в то время когда вывод МК настроен на вход более 1,5 В в любом положении движка переменника, цепь R6,R4,R5,Sv1,R7.
Логика работы :
1. Если до этого был включен светодиод, то вывод МК на вход и ждем 100-200мкС для установления напряжения.
2. Опросить порт. Если он равен 0, то нижняя по схеме Кнопка нажата, уйти на обработку нажатия кнопки.
3. Если кнопка не нажата, порт должен быть равен 1, так как ничего не включено и на выводе больше, чем 1,5 В.
4. Приступаем к измерению переменника и обнаружению нажатия верхней кнопки:
    а. Порт на выход и установить на него 0. Разряжаем конденсатор в течении 100-200мкС;
    б. Переключаем порт на вход, запускаем таймер и сразу фиксируем состояние порта. Если на входе 1, то это значит, что нажата верхняя по схеме кнопка. Уходим на обработку нажатия кнопки;
    в. Если кнопка не нажата, то происходит заряд конденсатора через переменник. При самом малом его сопротивлении 1 на входе появится примерно через 50мкС, а при максимальном – 227мкС. Берем для работы.
5. На этом цикл измерения и обнаружения закончен. Если надо включить светодиод, то выдаем 1 на его выход.
  На рисунке 2 указана примерная схема подключения 2-х светодиодов и 2-х кнопок на один вывод МК.
  Здесь на резисторах устроена виртуальная средняя точка. Если схема должна быть с малым потреблением тока, то она не совсем удачная, так как сама по себе «кушает» 0,5мА и дает ток на светодиод около 1мА. Кроме того, одновременно нажатие 2-х кнопок приводит к Короткому Замыканию по питанию. Если это надо предотвратить, то последовательно с 1 кнопкой или каждой кнопкой включить последовательно по резистору в районе 620 Ом. Просто это дополнительные детали, а мы стремимся к минимализму. ( 5В / 620 = 8,065 мА).
   Логика : — Управление светодиодами, если на выходе порта 1, то включен Нижний светодиод, если 0, то верхний;
   — Обнаружение нажатия кнопок. Переводим порт на выход, устанавливаем в 1 и держим 100мкС. Порт на вход и через 10-30мкС ( R=620 C=0.047 uF tau = 29.14 мкС) опрашиваем его, если на нем обнаруживается 0, то Нижняя кнопка нажата, иначе не нажата. Аналогично, опрос верхней кнопки. Порт на выход и устанавливаем 0 на 100мкС, после переводим на вход и, если на нем через 10-30мкС обнаруживается 1, то нажата Верхняя Кнопка, иначе она не нажата. Нажатие кнопок, как видно по схеме, сопровождается зажиганием противоположных светодиодов.
   Можно попробовать прицепить к этой схеме потенциометр с добавочным резистором между питанием и конденсатором. Однако, его величина должна быть не сильно больше резисторов схемы, иначе мы не сможем обнаружить его изменение и он будет подсвечивать нижний светодиод Sv4 током, величина которого будет зависеть от сопротивления потенциометра и будет ограничена только добавочным резистором.
   То есть светодиод Sv4 будет подсвечен всегда и будет загораться на полную силу в момент включения порта в 1. Настроить такую систему будет уже непросто, так как надо подобрать не только электрические и временные параметры, но и визуальные, чтобы различить свет подсветки от полного света, особенно при разных углах обзора.

   На рисунке 3 указана схема подключения большого количества кнопок на один простой вывод МК.
Много Кнопок на 1 выводе
Логика работы: Разряжаем конденсатор прим. 150-200мкС. Переключаем на вход и замеряем время заряда конденсатора до порога срабатывания 1 у МК. При одновременном нажатии 2-х кнопок приоритет имеет та, которая ближе к питанию. Резистор первой кнопки и резистор на вывод МК выбирают так, чтобы при ее нажатии и попытки разрядить конденсатор через резистор порта напряжение на порту должно быть менее 0,8В. С этого уровня затем и будет происходит заряд конденсатора до уровня порога 1 в МК в 1,22В. На указанной схеме при нажатии первой кнопки заряд будет происходить прим. 18мкС, а каждая последующая кнопка добавляет по 8мкС. Так удобней высчитывать ее номер:
(Время измеренное – Время первой кнопки) / 8 = Номер кнопки.
В следующей статье расскажу о вариантах реализации Дельта-Сигма АЦП на МК и анализе всех возможных схем измерения напряжения микроконтроллером без встроенного АЦП.

Если кому-то все это было интересно, значит, я не зря этим занимался. Спасибо за Внимание.
  • +3
  • 10 ноября 2022, 19:37
  • Gilaks
  • 1
Файлы в топике: К_Статье_Аналог_АЦП.zip

Комментарии (8)

RSS свернуть / развернуть
Ы! Кто то еще пишет на ассемблере. Кайф!
0
Эх, видел что-то подобное в журнале Радио за год эдак 2004. Там, по-моему, измерялось сопротивление переменного резистора.
В GamePort'ах положение резисторов джойстиков тоже вроде бы через время разряда конденсатора измерялось, АЦП там не было.
0
Снимаю шляпу перед целеустремлённостью и объёмом работы!
Ещё под AT90S2313 был аппнот с подобным способом измерения.
Посмотрите эти документы, может какие-то идеи подсмотрите:
www.ti.com/lit/an/slaa806/slaa806.pdf
ww1.microchip.com/downloads/en/Appnotes/doc0942.pdf
0
Хорошие 2 статьи.
Но в первой измеряется терморезистор и сравнивается с эталонным. Про измерение напряжение там нет речи. Эта схема использует 3 вывода МК, один из них — это компаратор.
Вторая статья уже ближе к теме. Однако, тоже использует 3 вывода МК, один из них компаратор и там предполагается, что до 2/5 заряд конденсатора линейный, а это не так даже по теоретическим расчетам, как показано в моей статье. В этой статье ничего не было сказано про ошибки, возникающие в результате нелинейности заряда.
Мой вариант предлагает использование 2-х или одного вывода МК без компаратора при минимальном количестве внешних деталей. Можно использовать совсем древний Pic16F84. Если есть готовая плата и на МК есть 1 или 2 свободных вывода, тогда в схему можно добавить 3 детали и получить новую функцию.
Спасибо за внимание к моей статье.
0
На встроенном компараторе и интегрирующей RC-цепочке можно сделать сигма-дельта АЦП. Для 12 бит АЦП делаем цикл на 4096 измерений. В цикле проверяем выход компаратора, если 1 -> ставим 0 на RC (разряд) и инкрементируем счетчик, если 0 -> то 1(заряд). По окончании цикла в счетчике получим код АЦП. Количество тактов МК должно быть одинаковым для 1 и 0 на выходе компаратора.
RC-цепочка отфильтрует битовый поток и даст среднее напряжение, которое пойдет на второй вход компаратора, а 1й вход компаратора будет входом АЦП.
0
Следующая моя статья будет посвящена дельта-сигма АЦП на компараторе и конденсаторе. Там будут описаны неудачные попытки сделать такой АЦП без компаратора и проведен общий сравнительный анализ этих двух схем и дельта-сигма АЦП на компараторе и конденсаторе по быстродействию, точности, разрешающей способности, сложности реализации.
Спасибо за внимание к моей статье.
0
Статья отличная! Замечание по форме: постарайтесь не перебарщивать с курсивом, глаза устают (
0
Да, хорошо. Убрал лишний курсив. Была ошибка из-за попытки управлять размером шрифта, после чего не закрылся тэг и этот стиль распространился на всю статью.
Спасибо за замечание.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.