Собрал тут компактные настольные часы. В этот раз решил всё делать без контроллеров и прочих достижений современной электроники, по возможности ограничившись элементной базой полувековой давности.
Полную схему рисовать категорически лень, но про самые интересные куски расскажу.
Поскольку любимое занятие инженеров - изобретение велосипедов, на чужие схемы внимания не обращал и на вселенскую новизну описанного не претендую
Индикация сделана на ИН-17 и 155ид1.
Основная логика на cd4060 и трех корпусах десятичных счетчиков 74hc390. Они удобны тем, что делители на 2 и на 5 отдельные. Делитель на 2 от счетчика десятков часов используется для деления 2гц выхода 4060 и получения секундных импульсов.
Чтобы получить делитель на 6 из десятичного пошёл не совсем стандартным путём:

Обычно вместо С4 и R6 reset подтягивается к питанию через резистор. Но тогда через него постоянно будет течь ток, сокращая время работы от резервного питания. Три резистора по 500к удвоят потребление, это уже существенно. А если сильно больше резисторы поставить, фронты будут пологие, можно трудноуловимых глюков словить.
В этой же схеме фронт получается хороший, а потери - только "холостая" зарядка 1нф конденсатора через диод раз в минуту. Этим уже совсем пренебречь можно.
Без R6 тоже работать будет, но напряжение на QC будет скакать сильнее и следующие каскады, которые с этой ноги сигнал на вход берут, могут глючить.
Вместо D3 можно подтянуть reset к массе достаточно большим сопротивлением. Его смысл только в том, чтобы при выском уровне на QC конденсатор не зарядился токами утечки и не призошел несвоевременный сброс счетчика.
Для счетчика часов решение аналогичное.
Преобразователь 5v->200v - классический
Baxandall (оно же resonant Royer).
Трансформатор взял из какого-то дохлого импульсного блока питания, вроде бы он когда-то usb зарядкой был

. Феррит EE12 или что-то похожее. Штатную низковольтную обмотку отковырял и намотал на освободившееся место 6+6 витков первички и 2 витка обратной связи изолированным проводом, трансформатор даже разбирать не пришлось. Транзисторы 2sd965, резисторы по 1к, Конденсатор 22нф, рабочая частота около 200кгц. На холостом ходу потребление около 70ма, трансформатор чуть теплый. Выходное напряжение нестабилизировано и просаживается примерно на 7% при полной нагрузке. Если нужна бОльшая стабильность, можно увеличить емкость конденсатора. Но тогда ток холостого хода вырастет.
Питание генератора и счетчиков зарезервировано ионистором на 5.5в 1.5ф. По расчётам на сутки хватить должно.
Поскольку хотелось получить ещё и практичное поделие, сделал авторегулировку яркости по внешнему освещению.
У неоновых ламп есть задержка включения до нескольких десятков мкс, ШИМ с фиксированной частотой не очень хорошо работает в области малой яркости. Поэтому решил зафиксировать ширину импульса, а яркостью управлять через частоту следования этих импульсов.
Инверторы с триггерами Шмитта, я использовал cd4093.
На U1 собран генератор, его частота обратно пропорциональна сопротивлению фоторезисторов. U2 буферный. На U3 и U4 собран перезапускаемый генератор импульсов c запуском по фронту, при указанных параметрах RC ширина импульса около 150мкс.
Общая яркость регулируетя подбором С3. С помощью R1 можно задать минимальную частоту, чтобы мерцание в темноте не раздражало. В моём случае это около 180гц.
У микросхем 4000 серии малая нагрузочная способность, поэтому перегрузить выход или защитные диоды через С1 и С2 они физически не могут. Если использовать 74hc серию, то последовательно с C1 и С2 стоит включить резисторы 0.5-1к.
Теоретически зависимость между средней яркостью и освещенностью у этой схемы должна быть полностью линейной, но на практике она определяется гаммой фоторезисторов. Поэтому их имеет смысл выбирать с бОльшим номиналом, как правило там гамма ближе к единице. Я использовал gm5549, яркость комфортно и почти незаметно меняется от полной темноты до дневного света.
Ещё один костыль, который изобрёл по ходу дела - выставление скорости хода часов по ардуине, если частотомера нет под рукой.
Через прерывания на первом таймере можно довольно точно померить интервал между секундными импульсами.
Спойлер
Код: Выделить всё
// Time measurement code inspired by https://www.gammon.com.au/timers
// This program is designed for digital clock adjustment
// Connect arduino gnd to clock gnd and pin D8 to 1hz clock signal
// Use serial monitor with 115200 baud for output readings
// Please note that arduino frequency can be +-100ppm, do not trust absolute values too much
// Using it to correct clock speed for a known relative amount is totally fine
// Output is in ppm (parts per million)
// 1 second per day is ~11ppm
// Good luck!
volatile bool first;
volatile bool isResultAvailable;
volatile uint32_t overflowCount;
volatile uint32_t startTimestamp;
volatile uint32_t finishTimestamp;
ISR (TIMER1_OVF_vect)
{
overflowCount++;
}
ISR (TIMER1_CAPT_vect)
{
if (isResultAvailable)
return;
const uint16_t timer1CounterValue = ICR1;
uint32_t overflowCopy = overflowCount;
if ((TIFR1 & bit (TOV1)) && timer1CounterValue < 0x7FFF)
overflowCopy++;
if (first)
{
startTimestamp = ((uint32_t)overflowCopy << 16) + timer1CounterValue;
first = false;
return;
}
finishTimestamp = ((uint32_t)overflowCopy << 16) + timer1CounterValue;
isResultAvailable = true;
TIMSK1 = 0;
}
void prepareForInterrupts ()
{
noInterrupts ();
first = true;
isResultAvailable = false;
TCCR1A = 0;
TCCR1B = 0;
TIFR1 = bit (ICF1) | bit (TOV1);
TCNT1 = 0;
overflowCount = 0;
TIMSK1 = bit (TOIE1) | bit (ICIE1);
TCCR1B = bit (CS10) | bit (ICES1);
interrupts ();
}
void setup ()
{
Serial.begin(115200);
prepareForInterrupts ();
}
void loop ()
{
if (!isResultAvailable)
return;
uint32_t elapsedTicks = finishTimestamp - startTimestamp;
int32_t ppm = 1000000 - ((int64_t)elapsedTicks * 1000000) / F_CPU;
Serial.print ("Current ppm diff: ");
Serial.print (ppm);
Serial.println (" Positive values mean faster clock than reference");
delay (500);
prepareForInterrupts ();
}
Сам по себе кварц у ардуино не особо точный (у моего экземпляра 70ppm погрешность примерно), но если известен уход часов за сутки или неделю, его можно быстро и удобно убрать за один раз.
Вроде основные моменты все описал, если что ещё интересует - спрашивайте
