В статье пойдет речь о замене штатных потенциометров на механические энкодеры EC11 (накапливающие датчики угла поворота) в блоке питания Mastech HY3005D с использованием микроконтроллера PIC16F1829 и сдвигового регистра 74HC595 реализующей ЦАП на резисторной матрице R2R

Предисловие


     Несколько лет назад приобрел блок питания Mastech HY3005D. Не так давно возникли проблемы с регулировкой напряжения — истерлось графитовое покрытие реостатов и выставить необходимое напряжение стало сложной задачей. Подходящих реостатов не нашлось, и я решил не покупать аналогичные, а изменить способ регулировки.
     Уровень выходного напряжения и тока задается опорным напряжением, подаваемым на операционные усилители. Таким образом можно полностью избавиться от потенциометров заменив их на ЦАП способный выдавать напряжение в нужном диапазоне.
     В каталоге microchip я не смог подобрать подходящего микроконтроллера, имеющего два ЦАП на борту, а внешние ЦАП имеют не малый ценник и слишком много лишнего функционала. Поэтому приобрел сдвиговые регистры 74HC595 и резисторы для матрицы R2R. Микроконтроллер PIC16F1829 уже был в наличии.
     Для возможности вернуться к первоначальной схеме все изменения сведены к минимуму — замене блока регулировки выполненного на отдельной плате.

Описание работы


     В основе схемы лежит микроконтроллер PIC16F1829 работающий на частоте 32МГц. Тактовая частоста задается встроенным тактовым генератором, согласно даташиту он не слишком точный, но для данной схемы — это не критично. Плюсом данного МК является наличие подтягивающих резисторов на всех цифровых входах и два MSSP модуля реализующих SPI. Все 18 логических вывода микроконтроллера использованы.
     На четырех сдвиговых регистрах 74HC595 и R2R матрицах реализованы два ЦАП по 16 бит. К плюсам данного регистра можно отнести наличие раздельного сдвигового регистра и регистра хранения. Это позволяет записывать данные в регистр, не сбивая текущие выходные значения. Матрица R2R собрана на резисторах с погрешностью 1%. Стоит заметить, что выборочные замеры показали погрешность не более 10 Ом. Изначально планировалось использовать 3 регистра, но при разводке платы мне показалось это не удачным решением, к тому же требовалось складывать полубайты.
     Встроенные в МК подтягивающие резисторы активированы на всех входах и позволяют упростить схему. Все выходы с энкодеров подключены напрямую к выводам МК, всего 4 энкодера у каждого по два вывода для самого датчика поворота и один для встроенной кнопки. Итого 12 выводов МК используется для обработки входных данных. Дребезг контактов сглаживается емкостью 100нФ. После изменения значений 16-битных буферов тока и напряжения в соответствии с входными данными от энкодеров значения передаются в сдвиговые регистры 74HC595 по SPI. Для сокращения времени передачи данных используется два SPI-модуля что позволяет передавать данные одновременно для тока и напряжения. После того как данные переданы на регистр подается команда переноса данных из сдвигового буфера в буфер хранения. Выходы регистра подключены к матрице R2R выполняющую роль делителя для ЦАП. Выходное напряжение с матрицы передается на входы операционных усилителей.
     Кнопки, встроенные в энкодеры, устанавливают значения на минимум (кнопка энкодера плавной регулировки) или максимум (кнопка энкодера грубой регулировки), соответственно, для тока или напряжения.

Схема


     В интернете не нашел схему, полностью совпадающую с моей, поэтому взял по первой ссылке. Внес исправления по выявленным несоответствиям и затем добавил свои изменения. Схему блока регулировки чертил в TinyCAD — скачать файл HY3005D-regulator.dsn.

Оригинал


После найденных неточностей


Итоговая схема после доработки

Выносной блок с регулировкой (выделен красным) вынес в отдельную схему.

К разъему J3 подключается цифровой вольтметр с дисплеем на лицевой панели (его нет на схемах).

Использованные компоненты


     Ниже приведен список использованных компонентов (в скобках указан корпус). Все приобретались в разное время в Китае. Важно использовать светодиоды с такими же характеристиками что и родные, т.к. они стоят последовательно в выходной цепи операционных усилителей (я взял те же что стояли на родной плате).
  • U1: микроконтроллер PIC16F1829I/ML (QFN)
  • U2 — U5: сдвиговый регистр 74HC595BQ (DHVQFN16 или SOT-763)
  • U6: линейный регулятор напряжения AMS1117 на 5В (SOT-223)
  • RE1 — RE4: механический накапливающий датчик угла поворота EC11
  • R1, R2 и матрицы R2R: резисторы 1 и 2 кОм (SMD 0402)
  • C1 — C12, C14-C17: керамические конденсаторы GRM21BR71E104KA01L 100нФ (SMD 0805)
  • C13: танталовый конденсатор 22мкФ 16В (тив B)
  • D1, D2: светодиоды индикации напряжения/тока на лицевой панели


Плата


     Плату разводил в Sprint Layout 6 — скачать файл HY3005D-regulator.lay6. К сожалению, оригинал, на котором я сделал свой вариант, не сохранился, в формате lay6 уже с исправлениями, выявленными в ходе сборки:

  1. В разрыв подключения энкодера плавной регулировки тока добавил перемычки рядом с интерфейсом для прошивки, т.к. емкости, фильтрующие дребезг контактов, не позволяли прошивать контроллер
  2. Добавил недостающие перемычки для земли между сторонами
  3. Переместил стабилизирующую сборку на 5В на другую сторону для уменьшения сквозных перемычек
  4. Добавлены сглаживающие конденсаторы на линии питания (обсуждение)

Фото после травления и сверления (первая версия)



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

После внесения выявленных проблем (вторая версия)


В качестве перемычек использованы три резистора номиналом 0 Ом в корпусе SMD 0805.

Фото после распайки и установки на место


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

     Как видно, изменения минимальны, все старые разъемы остались без изменений. Пришлось добавить отдельно питание, т.к. единственное напряжение, приходящее на плату регулировки 2.5В для родного делителя не подходит. Если на основной плате блока питания убрать стабилитрон на 2.5В (V5A) и поставить перемычку в место резистора (R1A), можно обойтись и без дополнительного подведения 12В питания.

Прошивка


Код на Си для компилятора XC8. Прошивал оригинальным PICkit 3.

config.h
// PIC16F1829 Configuration Bit Settings

// 'C' source line config statements

#include <xc.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)


main.c
#include "config.h"

#define _XTAL_FREQ 32000000
#pragma intrinsic(_delay)
extern void _delay(unsigned long);
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))

#define TransferNotDone          !(SSP2STAT&0b00000001)

#define StoreAll                 LATA4
#define ResetAll                 LATC6

#define VoltageSharpCHA          RC1
#define VoltageSharpCHB          RC0
#define VoltageSharpBTN          RA2

#define VoltageSmoothCHA         RB5
#define VoltageSmoothCHB         RB4
#define VoltageSmoothBTN         RC2

#define CurrentSharpCHA          RC5
#define CurrentSharpCHB          RC4
#define CurrentSharpBTN          RC3

#define CurrentSmoothCHA         RA1
#define CurrentSmoothCHB         RA0
#define CurrentSmoothBTN         RA3

#define VoltageRateSharp         0x0100
#define VoltageRateSmooth        0x0010
#define CurrentRateSharp         0x0040
#define CurrentRateSmooth        0x0004

#define VoltageMax               0xC000
#define CurrentMax               0x5000
#define VoltageMin               0x0000
#define CurrentMin               0x0000

#define VoltageStart             0x1E00
#define CurrentStart             CurrentMax

unsigned short VoltageBuff;
unsigned short CurrentBuff;

void interrupt tc_int() {
};

void SendData() {
    SSP1BUF = VoltageBuff>>8;
    SSP2BUF = CurrentBuff>>8;
    while ( TransferNotDone );
    SSP1BUF = VoltageBuff;
    SSP2BUF = CurrentBuff;
    while ( TransferNotDone );
    StoreAll = 1;
    StoreAll = 0;
};

void main() {
    // Configure oscillator for 32MHz
    //             76543210
    OSCCON     = 0b11110000; //B1

    // Enable individual pull-ups
    //             76543210
    OPTION_REG = 0b01111111; //B1

    // Configure analog port (1 - enable, 0 - disable)
    //             76543210
    ANSELA     = 0b00000000; //B3
    ANSELB     = 0b00000000; //B3
    ANSELC     = 0b00000000; //B3

    // Reset latch
    //             76543210
    LATA       = 0b00000000; //B2
    LATB       = 0b00000000; //B2
    LATC       = 0b00000000; //B2

    // Alternate pin function (set SDO2 on RA5)
    //             76543210
    APFCON0    = 0b00000000; //B2
    APFCON1    = 0b00100000; //B2

    // Configure digital port (1 - input, 0 - output)
    //             76543210
    TRISA      = 0b00001111; //B1
    TRISB      = 0b00110000; //B1
    TRISC      = 0b00111111; //B1

    // Configure input level (1 - CMOS, 0 - TTL)
    INLVLA     = 0b11000000; //B7
    INLVLB     = 0b00001111; //B7
    INLVLC     = 0b00000000; //B7

    // Configure individual pull-ups (1 - enable, 0 - disable)
    //             76543210
    WPUA       = 0b00111111; //B4
    WPUB       = 0b11110000; //B4
    WPUC       = 0b11111111; //B4

    ResetAll = 0;
    ResetAll = 1;

    // Configure SPI in master mode
    //             76543210
  //SSP1ADD    = 0b00000000; //B4
    SSP1STAT   = 0b01000000; //B4
    SSP1CON3   = 0b00000000; //B4
    SSP1CON1   = 0b00100000; //B4
  //SSP1ADD    = 0b00000000; //B4
    SSP2STAT   = 0b01000000; //B4
    SSP2CON3   = 0b00000000; //B4
    SSP2CON1   = 0b00100000; //B4

    VoltageBuff = VoltageStart;
    CurrentBuff = CurrentStart;
    __delay_ms(50);
    SendData();

    while ( 1 ) {
        if ( !VoltageSharpCHA ) {
            if ( VoltageSharpCHB ) { VoltageBuff-=VoltageRateSharp; if ( VoltageBuff > VoltageMax ) VoltageBuff = VoltageMin; }
                              else { VoltageBuff+=VoltageRateSharp; if ( VoltageBuff > VoltageMax ) VoltageBuff = VoltageMax; }
            while ( !VoltageSharpCHA );
            SendData();
        }

        if ( !VoltageSmoothCHA ) {
            if ( VoltageSmoothCHB ) { VoltageBuff-=VoltageRateSmooth; if ( VoltageBuff > VoltageMax ) VoltageBuff = VoltageMin; }
                               else { VoltageBuff+=VoltageRateSmooth; if ( VoltageBuff > VoltageMax ) VoltageBuff = VoltageMax; }
            while ( !VoltageSmoothCHA ); 
            SendData();
        }

        if ( !CurrentSharpCHA ) {
            if ( CurrentSharpCHB ) { CurrentBuff-=CurrentRateSharp; if ( CurrentBuff > CurrentMax ) CurrentBuff = CurrentMin; }
                              else { CurrentBuff+=CurrentRateSharp; if ( CurrentBuff > CurrentMax ) CurrentBuff = CurrentMax; }
            while ( !CurrentSharpCHA );
            SendData();
        }

        if ( !CurrentSmoothCHA ) {
            if ( CurrentSmoothCHB ) { CurrentBuff-=CurrentRateSmooth; if ( CurrentBuff > CurrentMax ) CurrentBuff = CurrentMin; }
                               else { CurrentBuff+=CurrentRateSmooth; if ( CurrentBuff > CurrentMax ) CurrentBuff = CurrentMax; }
            while ( !CurrentSmoothCHA );
            SendData();
        }

        if ( !VoltageSharpBTN  ) { VoltageBuff = VoltageMax; while ( !VoltageSharpBTN  ); SendData(); }
        if ( !VoltageSmoothBTN ) { VoltageBuff = VoltageMin; while ( !VoltageSmoothBTN ); SendData(); }
        if ( !CurrentSharpBTN  ) { CurrentBuff = CurrentMax; while ( !CurrentSharpBTN  ); SendData(); }
        if ( !CurrentSmoothBTN ) { CurrentBuff = CurrentMin; while ( !CurrentSmoothBTN ); SendData(); }
    };
}


     Для минимальных значений VoltageMin и CurrentMin выставлена 1, т.к. при 0 в буфере регулировка перестает работать, пока не понял где проблема. Рейты *Rate* подбирал кратные и наиболее удобные на мой взгляд. Для метода SendData не делал передачу переменных в качестве параметров для экономии машинных команд и памяти. Режим прошивки с низким напряжением (LVP) должен быть выключен, иначе RA3 не будет работать как цифровой вход. Прерывания не используются, метод tc_int присутствует в коде для того чтобы компилятор поместил основной блок в начало ППЗУ.
     Для прошивки достаточно снять перемычки, подключить PICkit 3 (или другой программатор) и выполнить прошивку. В первой версии не было перемычек на CLK и DAT, поэтому мне пришлось выпаять сглаживающие конденсаторы, прошить и потом впаять их обратно.
UPD: После установки дополнительных емкостей на линии питания проблема с выходом из нулевого положения счетчика исчезла. Так же пришлось поменять направление вращения. Судя по всему, шум от выпрямителя AMS1117 мешал корректно распознавать состояние энкодеров. Дополнительно добавил установку стартовых значений, теперь напряжение по умолчанию выставляется на 5 вольт (ток по-прежнему на максимум). Перед первой отправкой данных в регистры вставлена задержка в 50мс (значение задержки взял с большим запасом) для ожидания инициализации модулей SPI.

Характеристики выходного напряжения


     После окончательной сборки устройства был выполнен замер напряжений между контактами J4.1 — J4.2 (регулировка напряжения) и J4.1 — J4.7 (регулировка тока). По полученным данным построены графики (ниже под спойлером) зависимостей значение/напряжение для ЦАП.
Графики



Расчетные значения напряжений получены по формуле (U*D)/(2^K), где
U — напряжение на выходе регистра с учетом делителей в основной схеме (для ЦАП тока — 4950мВ, для ЦАП напряжения — 3550мВ);
D — десятичное значение счетчика ЦАП;
K — разрядность ЦАП (16 бит)

Что можно улучшить


  • добавить сохранение значений по таймеру
  • завязать на кнопки энкодеров переключение стандартных значений, например для напряжения: 3,3; 5,0; 7,5; 12В
  • для защиты от неизвестного значения при старте лучше подключить MR на 1, а OE подтянуть через резистор к 1 и сбрасывать в 0 после инициализации МК.
  • заменить ЦАП на ШИМ со сглаживающей цепочкой (предложил LampTester тут)

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


  1. sprutspb
    11.03.2016 10:22
    +1

    Плата симпатичная, но вот флюс стоит отмыть.


    1. Michael314
      11.03.2016 13:01

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


      1. holomen
        11.03.2016 13:33

        Идем в ближайший хозмаг и покупаем денатурат и бензин-галоша. Смешиваем 3:1.… Профит!


  1. holomen
    11.03.2016 10:46
    -2

    Применение PIC было принципиально? Есть ведь копеечный STM32F100С как раз с двумя ЦАП.


    1. POS_troi
      11.03.2016 10:52
      +3

      То что есть под рукой то и пихается видимо.
      Я вот при наличии пары десятков мега8/16 то-же врятли бы стал пихать СТМ-ки :)


      1. holomen
        11.03.2016 11:35
        +1

        Там конечно в одном абзаце все описано
        >>В каталоге microchip я не смог подобрать подходящего микроконтроллера имеющего два ЦАП на борту, а внешние ЦАП имеют не малый ценник и слишком много лишнего функционала.
        Т.е. покупка все равно планировалась, но
        >>Микроконтроллер PIC16F1829 уже был в наличии.
        Т.е. из того что было, но
        >>Поэтому приобрел сдвиговые регистры 74HC595 и резисторы для матрицы R2R.
        Все равно покупалось, и
        STM32f100c4 54грн (http://kosmodrom.ua/el.php?name=STM32F100C4T6B)
        vs
        HC595 6.25*4=25грн (http://kosmodrom.ua/el.php?name=M74HC595RM13TR)
        плюс три десятка 1% резисторов 10грн/сотня плюс пик даже не знаю, но пусть он уже есть, но все равно покупался и думаю был подороже чем стм32 сейчас.
        В сухом остатке плата проще, проц дешевле, можно поиграться с новой архитектурой если раньше до этого не успел.


    1. Michael314
      11.03.2016 13:17
      +1

      на текущий момент у меня есть опыт работы только с PIC.
      спасибо за совет, давно смотрю в сторону STM. обязательно попробую.


      1. LampTester
        11.03.2016 13:36

        Прошу прощения, если кто уже спрашивал, но почему R-2R, а не ШИМ? Большая скорость обновления тут не нужна, но зато ШИМ линейнее.

        Кстати, в STM32F100Cx есть т.н. advanced control timer, который в числе прочего поддерживает прямую аппаратную обработку энкодера. Т.е., крутим энкодер — а значение в регистре таймера само меняется соответственно механическому положению крутилки. Ну и два двенадцатибитных ЦАП. Но конечно, фактор "есть под рукой" понятен и естесственнен; про STM32 это я так, к слову.

        на текущий момент у меня есть опыт работы только с PIC.

        На самом деле, разные контроллеры-то идейно мало чем отличаются друг от друга, так что если есть опыт работы с PIC, перейти на STM будет несложно. Главное, не ведитесь на StdPeriphLib, STM32MX Cube и прочие протезы для мозга, которые по маркетинговым причинам в изобилии предлагает ST. Читайте даташит, после него — reference manual. Дальше качайте среду разработки по вкусу (я предпочитаю EmBlocks), и вперед. Все как и везде — регистры, биты, прерывания. Остальное решается внимательным чтением документации, ничего сверхъестесственного.


        1. Costic
          11.03.2016 14:22

          Главное, не ведитесь на StdPeriphLib, STM32MX Cube и прочие

          Вот тут я с вами не соглашусь. Standard Peripheral Library — шикарная вещь! Лично для меня она понятна, функции скрывают несущественные детали по работе с регистрами. На виду остаётся только суть. Производительность труда растёт. Помнить все регистры и их биты слишком сложно. Плюс переносимость кода между большим семейством Cortex-M процессоров. Да, код немного больше будет.
          Более того, похожие библиотеки есть у Миландра и Техаса. Это с чем я лично работал. Имея опыт работы с SPL можно быстро перейти на аналоги, например MDR у Миландра. Если бы SPL не была так хороша, то про неё давно забыли (забили) бы, imho.


          1. JerleShannara
            11.03.2016 16:22

            У стандартных библиотек частенько есть один косяк: while ( !( getsomereg(REG9999) & BITMASK_SOME ) ); что не очень хорошо — можно словить вечный цикл, причём хорошо, если это вскроется во время отладки, а если по шине какой-нибудь прилетит ошибочное значение в процессе эксплуатации? Юзать эту либу можно и нужно, но надо либо делать многозадачность и городить обработку таких приколов, либо переписывать эту кучу циклов.


            1. LampTester
              11.03.2016 19:01

              У чужих библиотек всегда один недостаток — непонятно, что внутри, а потому неизвестно, какие сюрпризы можно словить. Потому надо изучать код. Однако как правило проще и быстрее написать свой.


          1. LampTester
            11.03.2016 19:01

            Standard Peripheral Library — шикарная вещь!

            Да-да, а Ардуино так вообще верх совершества.

            Производительность труда растёт.

            "Время разработчика дороже чипа" — знакомая песня. Люди (и разработчики тоже) склонны любить то, что позволяет им не включать мозг. Бизнес склонен любить то, что позволит выпустить устройство через неделю, пускай оно и будет ужасно неоптимально — покупатель не разберется. В итоге имеем то, что имеем. И ситуация год от года становится печальнее.

            Помнить все регистры и их биты слишком сложно.

            А помнить все функции StdPeriph_Lib и все поля ее стуктур проще? И в том, и в другом случае не надо помнить ничего кроме основного принципа. Просто надо держать под рукой документацию и не стесняться в нее заглядывать.

            Более того, похожие библиотеки есть у Миландра и Техаса.

            Это говорит только о том, что и они вынуждены прогибаться под требования рынка, возникающие из соображений, имеющих корень в алчности инвесторов. TI так и вообще под Arduino косить начали (Energia).

            Имея опыт работы с SPL можно быстро перейти на аналоги, например MDR у Миландра.

            Имея опыт программирования контроллеров вообще, можно быстро перейти на любой другой контроллер — была бы документация и toolchain.

            Если бы SPL не была так хороша, то про неё давно забыли (забили) бы, imho.

            Из той же серии — "если бы курить было так вредно, все бы давно бросили", верно?

            В целом, я не имею желания разводить тут холивар. Вы высказались, я высказался. А теперь пойдемте писать код, каждый по-своему.


        1. Michael314
          11.03.2016 18:36

          но почему R-2R, а не ШИМ?

          не уверен что ОУ нормально это воспримет, особенно учитывая низкую частоту ШИМ.

          Главное, не ведитесь на StdPeriphLib, STM32MX Cube и прочие протезы для мозга, которые по маркетинговым причинам в изобилии предлагает ST.

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


          1. POS_troi
            11.03.2016 18:42

            Потому-что через r2r можно рисовать сиськи (с)Dihalt :)
            http://easyelectronics.ru/img/starters/DAC-R-2R/siske.png


          1. LampTester
            11.03.2016 19:06

            не уверен что ОУ нормально это воспримет, особенно учитывая низкую частоту ШИМ.

            Я имел в виду, предварительно его отфильтровав. Скажем, поставить фильтр саллена-кея второго порядка с частотой среза этак 5 кГц при частоте ШИМ порядка 30 кГц. На выходе будет чудесный постоянный уровень, правда меняться будет медленно — ну так быстро тут и не надо.

            если они хорошо реализованы

            C этим у StdPeriph_Lib есть определенные проблемы.

            главное проверить что они делают именно что нужно.

            Как правило, за время проверки чужого кода такого типа можно написать свой.


  1. Alexeyslav
    11.03.2016 12:48

    Если использовать резисторы с одной ленты, то можно брать и 5% точностью. Это у них указана точность номинала сопротивления, а воспроизводимость от экземпляра к экземпляру в пределах одой партии и тем более одой ленты очень высокая. Использовать один резистор в качестве R и парочку в качестве 2R.

    Схемы нет в статье, это очень печально. Какой-то левый файл под TinyCAD — очень несерьёзно.
    Посему кстати непонятно какой битности реализован ЦАП? 10, 12 или 16 бит?
    Можно ещё было посмотреть в сторону цифровых потенциометров(на каждый канал 6 битный(точная подстройка)+8 битный(грубая))… они хоть и дороже но не надо было бы паять целый массив SMD-резисторов.


    1. Michael314
      11.03.2016 13:09

      Если использовать резисторы с одной ленты, то можно брать и 5% точностью.

      у меня было две ленты на 1 и 2 кОм

      Схемы нет в статье, это очень печально.

      схема есть картинкой под спойлером "После доработки"

      Какой-то левый файл под TinyCAD — очень несерьёзно.

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

      Посему кстати непонятно какой битности реализован ЦАП? 10, 12 или 16 бит?

      два ЦАПа по 16 бит

      Можно ещё было посмотреть в сторону цифровых потенциометров(на каждый канал 6 битный(точная подстройка)+8 битный(грубая))… они хоть и дороже но не надо было бы паять целый массив SMD-резисторов.

      смотрел. и даже пробовал AD5292. решил что лучше самому сделать R2R


      1. Costic
        11.03.2016 14:08

        Мне кажется вы усложнили задачу и схему. Есть же дешевый 12-битный ЦАП у microchip MCP4922 с управлением по SPI. Впрочем это дело вкуса. Задача решена, это главное.
        А чем схема с AD5292 вам не понравилась?


        1. Michael314
          11.03.2016 18:54

          нужно писать код работы с устройством, ждать инициализацию, ждать выполнение команд. сложность только в изготовлении платы, в остальном — простой код, высокая скрость работы (можно не думать, успеет ли отправиться команда прежде чем придет второй импульс от энкодера).


      1. Alexeyslav
        11.03.2016 19:42

        Пользоваться то можно чем угодно, только выкладывать на всеобщее пользование лучше в более распространённом формате PNG например или PDF. Чтобы можно было как минимум посмотреть.

        Ежели 16 бит, то как с линейностью и монотонностью характеристики код-напряжение? Даже на R-2R матрицах довольно проблематично добиться приемлемых характеристик, а для блока питания вполне хватило бы даже 12 бит что сократило бы количество необходимых регистров до 3-х.

        >картинкой под спойлером «После доработки»
        Никогда бы не догадался что схема именно там…


        1. Michael314
          11.03.2016 20:12

          Ежели 16 бит, то как с линейностью и монотонностью характеристики код-напряжение?

          на 16 не проверял. смотрел для 8 бит на макете — было хорошо.

          для блока питания вполне хватило бы даже 12 бит что сократило бы количество необходимых регистров до 3-х.

          изначально планировалось разместить именно 3 регистра между энкодерами и использовать по 12 бит. но при разводке платы показалось не удачным решением. в итоге выбрал вариант с 4 регистрами и передачей данных параллельно в 2 SPI-канала, что увеличило скорость в 1.5 раза и избавило от необходимости складывать полубайты.


        1. Michael314
          13.03.2016 15:33

          Ежели 16 бит, то как с линейностью и монотонностью характеристики код-напряжение?

          добавил в конце статьи раздел с графиками, замерял только используемый диапазон в уже собранном БП.


  1. coshac
    11.03.2016 13:01

    Мне кажется, или с платы флюс не смыт?


    1. Michael314
      11.03.2016 13:01

      так и есть


      1. coshac
        11.03.2016 13:12

        Лучше смыть, даже если не активный и не требует смывки, со временем пыли поналипает, очень неаккуратно будет.


        1. Michael314
          11.03.2016 13:21

          согласен, но оно же внутри и не видно
          в идеале было бы хорошо покрывать лаком или как минимум тем же фоторезистом оставляя только места под пайку… но это пока только желания


          1. holomen
            11.03.2016 13:38

            Дело не в видно или нет, а в том, что остатки флюса могут и будут подъедать дороги и совсем не диэлектрик. И со временем в неотмытой плате может поселиться барабашка.


            1. sim2q
              11.03.2016 20:28

              канифоль принципиально не смываю если для себя, работает как лак, хотя механически и не стойкий


  1. KonstantinSoloviov
    11.03.2016 14:49
    +1

    Рад узнать, что R2R ЦАП на 74HC595 — рабочая идея.
    А как насчет цифровых потенциометров, не возникало желание использовать их?

    И еще, опорное ЦАПа (оно же питание 74HC595) снимается с AMS1117-5.
    Режет глаз отсутствие конденсаторов, на выходе AMS1117-5 и около 74HC595.


    1. Michael314
      11.03.2016 19:03

      А как насчет цифровых потенциометров, не возникало желание использовать их?

      возникало и даже пробовал AD5292. но с ними ложнее работать, чем просто отправить 2 байта в буфер. и как мне показалось, обвязка схемы сложнее.

      Режет глаз отсутствие конденсаторов, на выходе AMS1117-5 и около 74HC595.

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


      1. LampTester
        11.03.2016 19:15
        +1

        решил что стабилизации 12В будет достаточно, а выходные 5В плавать не должны.

        Конденсаторы ставятся не для стабилизации, а (в цифровых схемах) для подавления помех, возникающих за счет переключения логических элементов внутри цифровых микросхем. Конденсатор рядом с цифровой микросхемой должен быть всегда и обязательно — это правило хорошего тона. Типовой номинал — 100 нФ, керамика (у керамических конденсаторов низкий ESR). Работать, как видно, будет и без этого, но ухудшится надежность и электромагнитная совместимость.
        Регулятор же без конденсаторов определенной емкости и типа может возбуждаться. Проявляться может повышенными шумами по питанию или даже нагревом с выходом из строя. Надо смотреть, разрешено ли в документации использовать регулятор без конденсаторов.


        1. Michael314
          11.03.2016 19:59

          это актуально для подобных простых схем? можете посоветовать что почитать в данном направлении?
          я думаю это не единственный недостаток в плане помех

          Регулятор же без конденсаторов определенной емкости и типа может возбуждаться.

          а тут не совсем понял, о каком регуляторе речь?


          1. sim2q
            11.03.2016 20:30

            актуально


          1. Alexeyslav
            11.03.2016 20:44

            Стабилизатор напряжения это классический регулятор с обратной связью по выходному напряжению, у него как у любого регулятора есть границы устойчивой работы вне которых он будет срываться в генерацию. Так вот одним из условий работы регулятора в пределах границ устойчивости может являться наличие конденсатора на выходе, причем как можно ближе к выводам ибо дорожка представляет собой индуктивность и с конденсатором сложится в последовательный колебательный контур, который на резонансной частоте не выполняет функцию гашения колебаний, а значит способствует самовозбуждению стабилизатора…
            Еще для стабилизатора по этой же причине может являться важным условием чтобы конденсатор на входе был больше конденсатора на выходе.


            1. LampTester
              12.03.2016 09:22

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


          1. LampTester
            12.03.2016 09:09

            Да, это актуально всегда. Одна и та же микросхема всегда шумит одинаково (при одинаковой частоте переключений), что в простой схеме, что в сложной. В принципе, можно было бы встраивать этот конденсатор прямо внутрь микросхемы (выпускают же операционные усилители со встроенными элементами частотной компенсации), но этого не делают потому, что в разном окружении требования к развязывающим конденсаторам могут разниться, хотя чаще всего хватает керамики 100 нФ, как я уже писал выше. Да и конденсатор достаточно громоздкий элемент в масштабах кристалла. Сделать на кристалле конденсатор емкостью в десятки нанофарад будет сложно, дорого и неэффективно, а монтировать его по гибридной технологии — опять же дорого (усложнение техпроцесса). Потому остается ставить внешние конденсаторы.

            Речь идет о регуляторе напряжения, AMS117-5. Кстати я почитал даташит на него, и выяснил, что конденсаторы вы не поставили очень, очень зря. Вам просто повезло, что он еще работает, правда, непонятно насколько повезло — надо бы ткнуться осцилографом и посмотреть, не генерирует ли он. Ибо на странице 4 читаем:

            The circuit design used in the AMS1117 series requires the use of
            an output capacitor as part of the device frequency compensation.
            The addition of 22?F solid tantalum on the output will ensure
            stability for all operating conditions.
            When the adjustment terminal is bypassed with a capacitor to
            improve the ripple rejection, the requirement for an output
            capacitor increases. The value of 22?F tantalum covers all cases of
            bypassing the adjustment terminal. Without bypassing the
            adjustment terminal smaller capacitors can be used with equally
            good results.
            To further improve stability and transient response of these
            devices larger values of output capacitor can be used.


            То есть мои предостережения — четко ваш случай.

            Насчет почитать — должен сразу извиниться, сходу я не могу назвать ни одной книги или статьи на русском. Если с английским нормально, то вот Dave Jones очень доходчиво рассказывает про развязывающие конденсаторы (YouTube, eevblog). Насчет стабильности наверное можно почитать Linear Circuit Design Handbook от Analog Devices.


            1. Alexeyslav
              12.03.2016 12:24

              Есть на русском книжка, «Конструирование высокоскоростных цифровых устройств. начальный курс чёрной магии.» ISBN 5-8459-0707-8 (рус.)
              Там поднимается эта тема и более актуальные, поясняется почему это важно в цифровых схемах даже на частотах в десятки килогерц.


            1. Michael314
              13.03.2016 15:30

              большое спасибо за ссылки.
              часть даташита AMS1117 о стабилизации я действительно упустил из виду. проверил осциллографом выходное напряжение, была генерация на 7кГц с амплитудой 0.5 вольта.
              после установки танталового конденсатора 22мкФ напряжение стабилизировалось. за компанию поставил емкости 100нФ максимально близко к линиям питания регистров.


  1. wormball
    11.03.2016 16:34

    А что, там внутри правда всё на рассыпухе? Двадцать первый век, однако…


    1. holomen
      11.03.2016 16:38

      Простите, но на чем должно быть? Петлю ОС завести в/через контроллер?


      1. wormball
        11.03.2016 16:45

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


        1. holomen
          11.03.2016 17:07

          Задачи разные, параметры разные. Да даже принцип работы разный!


          1. wormball
            11.03.2016 18:31

            Ага, шим посложнее будет, нежели линейный регулятор.


            1. LampTester
              11.03.2016 19:20

              Смотря какой ШИМ, смотря какой линейный регулятор. Прецизионный линейный лабораторный источник гораздо сложнее импульсного зарядника для телефона.


        1. POS_troi
          11.03.2016 17:42

          компьютерный БП на 90% состоит из «рассыпухи» и то ещё вопрос считать шимку рассыпухой или нет. :)
          Вообще чем больше рассыпухи тем лучше — ремонтнопригодность в разы выше.


          1. wormball
            11.03.2016 18:26

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


            1. POS_troi
              11.03.2016 18:33

              Конечно проще, эта одна микруха может быть вообще без маркировки и что-то по спецзаказу (привет китайцам) а ещё оно может быть и с прошивкой :)


        1. Michael314
          11.03.2016 19:35

          Ну видели блок питания от писюка? Там рассыпухи раза в два меньше, а то и в три.

          мне кажется у вас ошибочное представление о количестве рассыпухи в БП.

          вот для примена несколько фото
          HY3005D


          БП ПК попроще


          посложнее



    1. Michael314
      11.03.2016 19:32

      del


  1. slog2
    13.03.2016 13:51

    При выключении ранее установленные напряжения и токи не сохраняются? Это же жутко неудобно.


    1. Michael314
      13.03.2016 15:23

      Были мысли сделать сохранение, но в итоге сделал при старте ток на максимум, напряжение на 5 вольт. По личному опыту работы с БП, эти значения наиболее используемы.
      С другой стороны, это решается программно и ничто не мешает в любой момент добавить сохранение и прошить МК (ну кроме того, что нужно разбирать БП).


      1. Alexeyslav
        13.03.2016 16:32

        Вообще это фигово… кратковременный провал напряжения в розетке и светодиод 3.6в@350мА подключенный к блоку питания уже дымится… т.к. он снял ограничение по току.
        Кстати еще одна фигня, ладно там с другими сигнальными выводами но сигнал сброса регистров у тебя подключен к контроллеру без подтяжки. А это значит что N-е время после подачи питания на схему пока отработает BOR контроллера, задержка сброса, инициализация регистров контроллера сброс внешних регистров не гарантирован а значит на их выходе может оказаться произвольное напряжение… подключенная схема будь даже на 5В к выходу блока питания в считанные милисекунды может оказаться под напряжением в 30В — для многих элементов этого времени достаточно чтобы сгореть.
        Поставь подтягивающие резисторы на сигнальные входы регистров, хотябы на вход сброса так чтобы он находился в активном состоянии пока вывод контроллера находится в неопределённом состоянии.


        1. Michael314
          13.03.2016 17:19

          кратковременный провал напряжения в розетке

          с перебоем напряжения — это интересный кейс, надо подумать. тут еще нужно посмотреть, что сам БД делает в это время.

          сигнал сброса регистров у тебя подключен к контроллеру без подтяжки

          учитывая даташит, подтягивать сброс не имеет смысла, т.к. он сбрасывает только внутренний регистр. нужно подтягивать OE к 1, а после прогрузки МК программно переводить его в 0.

          Поставь подтягивающие резисторы на сигнальные входы регистров

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


          1. Alexeyslav
            14.03.2016 12:44

            В момент подачи напряжения активный сброс с самого начала обнулит регистры, а потом они же скопируются и на выход. И кстати, OE достаточно легко держать в неактивном состоянии при подаче напряжения питания необходимое время при помощи супервизора питания и RC-цепочки, например 100мс после подачи питания, за которое все переходные процессы закончатся, МК проснётся(а если не проснётся? неудачная прошивка, сбой ФЛЕШ-памяти и т.д.) и обнулит регистры уже штатным способом.
            Всё-таки надо бы продумать вопрос о безопасном состоянии регистра на момент подачи питания вне зависимости от контроллера — что будет если включить блок питания с отсутствующим контроллером?


            1. Michael314
              14.03.2016 13:51

              потом они же скопируются и на выход

              не совсем понял, как они скопируются на выход? кто-то должен перевести из 0 в 1 сигнал STCP.

              Всё-таки надо бы продумать вопрос о безопасном состоянии регистра на момент подачи питания вне зависимости от контроллера

              нужно подтягивать OE к лог.1 резистором. тогда до инициализации МК на выходах ЦАП будет 0В.


              1. Alexeyslav
                14.03.2016 14:10

                На сигнал сброса — подтяжку вниз, на STCP — подтяжку вверх. Тогда при подаче питания регистры обнулятся и скопируются.


                1. Michael314
                  14.03.2016 21:26

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


  1. AVKinc
    13.03.2016 20:55

    Япона мать, гораздо проще было поменять переменники в регулировке.
    Для чего городить контроллер, если никакого нового функционала вообще нет?


    1. Michael314
      14.03.2016 11:10

      Соглашусь с вами если энкодеры сломаются так же быстро, как и реостаты. Основная цель/причина описана в предисловии — быстрый выход из строя реостатов. Из дополнительного — увеличилась точность и линейность регулировки. А дополнительный функционал при наличии МК запрограммировать не составит труда. Возможные улучшения перечислены в конце статьи.


    1. KonstantinSoloviov
      14.03.2016 11:49

      С переменными резисторами нового функционала нет и не будет.
      А с МК регулировкой — тут уже фантазия начинает играть.
      ВАХ например снимать или вообще генератор сигналов сделать )

      И это, кстати, ответ на вопрос автора:

      это актуально для подобных простых схем?
      Актуально, ведь невозможно предсказать насколько может усложниться простая схема