HRP-N3 - серия источников питания с максимальной пиковой мощностью в 350% от MEAN WELL

Цепочка весовых конденсаторов позволяет сократить число линий интерфейса кодового переключателя

Texas Instruments CD40106B

Журнал РАДИОЛОЦМАН, июль 2017

При использовании этой простой конденсаторной схемы и небольшой программы разработчикам, применяющим Arduino Uno, для считывания состояния шестнадцатеричного кодового переключателя потребуются лишь два вывода

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

Широтно-модулированный импульсный сигнал (ШИМ) и RC-цепочки на основе группы весовых конденсаторов, дополненные КМОП инвертором с триггером Шмитта, генерируют импульсы, ширина которых прямо пропорциональна номеру каждой из 16 выходных комбинаций кодового переключателя. Для декодирования используется плата Arduino Uno, в которой задействуются лишь два контакта разъема (OC0A и INT0), а все остальные остаются свободными для выполнения других функций.

Теоретической основой предлагаемой схемы служит хорошо известная формула для напряжения на заряжающемся конденсаторе:

Время T, необходимое для достижения напряжения k×V, можно найти с помощью формулы

указывающей на линейную зависимость от C при фиксированном сопротивлении R.

ШИМ выход OC0A (PD6) платы Arduino Uno формирует входной сигнал схемы (Рисунок 1), выход которой подключен к входу прерывания INT0 (PD2).

Цепочка весовых конденсаторов позволяет сократить число линий интерфейса кодового переключателя
Рисунок 1. Функциональная схема состоит из шестнадцатеричного кодового
переключателя, подключенного к набору весовых конденсаторов,
зарядного резистора R1, разрядного диода D1 и инвертора
с триггером Шмитта.

Конденсаторы с соотношением емкостей 8:4:2:1 выбираются переключателем SW1, и затем заряжаются через резистор R1 при высоком уровне сигнала ШИМ и разряжаются через диод D1 при низком уровне. В начале цикла заряда сигнал на выходе инвертора с триггером Шмитта U1A имеет высокий уровень; он изменится на низкий, когда напряжение на конденсаторе достигнет верхнего порога переключения инвертора. Отрицательный фронт импульса используется для прерывания процессора.

Работающий на частоте 16 МГц микроконтроллер платы Arduino Uno запрограммирован таким образом, чтобы частота импульсов на ШИМ выходе OC0A Таймера 0 равнялась 244 Гц при коэффициенте заполнения 224/255. Формы сигналов, когда в переключателе SW1 замкнут только ключ #8, показаны на Рисунке 2. Параллельные конденсаторы C1 и C2 заряжаются при высоком уровне сигнала на выходе OC0A, и, когда напряжение на них достигает порогового значения, равного примерно двум третьим напряжения питания, состояние выхода инвертора с триггером Шмитта изменяется на противоположное. Этот отрицательный перепад используется для прерывания процессора, который затем считывает текущее значение Таймера 0.

Цепочка весовых конденсаторов позволяет сократить число линий интерфейса кодового переключателя
Рисунок 2. ШИМ выход OC0A платы Arduino заряжает весовые конденсаторы, и когда
напряжение на них достигает порогового значения триггера Шмитта,
равного приблизительно 3 В, формируется сигнал прерывания INT0.

Считая, что высокий уровень сигнала OC0A равен напряжению питания, длительность формируемого импульса можно вычислить по формуле

не зависящей от напряжения питания. Если значения R и С равны 8.2 кОм и 0.2 мкФ, то T = 1801 мкс (при длительности периода 4096 мкс), и в момент прерывания Таймера 0 в его счетчике будет число 112. Значение, полученное экспериментально, равнялось 115.

В Таблице 1 показаны состояния Таймера 0 на моменты прерываний для 16 комбинаций переключателя SW1. Приведены значения для различных напряжений питания.

Таблица 1. Экспериментальные значения состояний Таймера 0 на моменты
прерываний при различных положениях переключателя SW1
Положение SW1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
VCC 4.5  В 0 15 31 45 60 73 88 102 115 129 143 157 171 184 199 212
VCC 4.0 В 0 15 31 44 59 73 88 101 115 128 142 155 169 182 197 210
VCC 5.0 В 0 14 30 44 58 72 87 100 113 127 142 155 169 182 197 210

Рисунок 3 показывает, что состояния счетчика, захваченные в моменты различных прерываний при 16 комбинациях SW1, довольно хорошо соответствуют линейной характеристике с примерной разностью значений 14 единиц. Положения переключателя декодируются программой, допускающей максимальное отклонение ±6 единиц от номинальных средних значений.

Цепочка весовых конденсаторов позволяет сократить число линий интерфейса кодового переключателя
Рисунок 3. Состояния счетчика на момент прерываний при 16 положениях переключателя
SW1 показывают хорошую линейность результата.

Как видно из Рисунка 4, благодаря тому, что высокий уровень сигнала OCRA и верхний порог триггера Шмитта с изменением напряжения питания VCC меняются пропорционально, отклонения всех 16 значений счетчика Таймера 0 в моменты прерываний находятся в допустимых пределах. Показаны отклонения при напряжениях питания схемы 4.0 В и 5.0 В относительно значений, полученных при напряжении 4.5 В.

Цепочка весовых конденсаторов позволяет сократить число линий интерфейса кодового переключателя
Рисунок 4. Отклонения захваченных значений счетчика Таймера 0, обусловленные
изменениями напряжения питания, при всех 16 положениях переключателя
SW1 находятся в допустимых пределах.

В Листинге 1 содержится блок кода на Си, используемый для декодирования положения переключателя. Переменная duty, содержащая состояние счетчика Таймера 0, передается в функцию get-switch, которая, сравнивая duty со средними целыми значениями, возвращает значение кода переключателя.

Листинг 1. Этот блок кода на Си декодирует состояния Таймера 0 и определяет положения кодового переключателя.

get_switch(uint8_t duty){
    if (duty<=7){ switch_value=00;}
    else{if (duty> 7 && duty <=22){switch_value=l;}

        else{if (duty> 22 && duty <=37){switch_value=2;}
            else{if (duty> 37 && duty <=51){switch_value=3;}
                else{if (duty> 51 && duty <=66){switch_value=4;}
                    else{if (duty> 66 && duty <=80){switch_value=5;}
                        else{if (duty> 80 && duty <=95){switch_value=6;}
    else{if (duty> 95 && duty <=108){switch_value=7;}
        else{if (duty> 108 && duty <=122){switch_value=8;}
            else{if (duty> 122 && duty <=136){switch_value=9;}
                else{if (duty> 136 && duty <=150){switch_value=10;}
                    else{if (duty> 150 && duty <=164){switch_value=ll;}
    else{if (duty> 164 && duty <=177){switch_value=12;}
         else{if  (duty> 177 && duty <=191){switch_value=13;}
             else{if (duty> 191 && duty <=205){switch_value=14;}
                 else{if (duty> 205){switch_value=15;}

}}}}}}}}}}}}}}}
return (switch_value);
}

Используя общий выход OC0A, этот метод можно расширить на дополнительное количество шестнадцатеричных переключателей, поддерживаемых другими прерываниями, доступными в Arduino Uno. Преимуществом описанного подхода является то, что, не требуя для своей реализации АЦП, компараторов и линий интерфейсов, он применим для микроконтроллеров с небольшим числом выводов.

Материалы по теме

Перевод: AlexAAN по заказу РадиоЛоцман

На английском языке: Hex-Switch Decoder Uses Weighted-Capacitor Network to Reduce I/O Pin Count

5 предложений от 5 поставщиков
CMOS HEX SCHMITT TRIGGERS
CD40106B=HEF40106BT SO14
NXP
13 ₽
T-electron
Россия и страны СНГ
CD40106B=HCF40106M013TR SO14
709 ₽
Acme Chip
Весь мир
CD40106B
по запросу
CD40106B----CALLREP
Texas Instruments
по запросу
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя