استبدال الضبط التناظري بالرقمي في مصدر طاقة المختبر HY3005D

     ستناقش المقالة استبدال مقاييس فرق الجهد القياسية بمشفرات ميكانيكية EC11 (مستشعرات الزاوية المتراكمة) في وحدة تزويد الطاقة Mastech HY3005D باستخدام متحكم دقيق PIC16F1829 وسجل التحول 74HC595 تنفيذ DAC على مصفوفة المقاوم R2R

مقدمة


     منذ بضع سنوات ، اشتريت مصدر طاقة Mastech HY3005D. منذ وقت ليس ببعيد كانت هناك مشاكل في تنظيم الجهد - تم تهالك طلاء الجرافيت للمضادات الحيوية وأصبح تحديد الجهد المطلوب مهمة صعبة. لم يكن هناك ريوستات مناسبة ، وقررت ألا أشتري منها مماثلة ، ولكن لتغيير طريقة التعديل.
     يتم ضبط مستوى جهد الخرج والتيار من خلال الجهد المرجعي المزود لمضخمات التشغيل. وبالتالي ، يمكنك التخلص تمامًا من مقاييس فرق الجهد عن طريق استبدالها بـ DAC القادرة على توصيل الجهد في النطاق المطلوب.
     في كتالوج الرقائق الدقيقة ، لم أتمكن من العثور على وحدة تحكم دقيقة مناسبة تحتوي على جهازي DAC على متنها ، ولا تحتوي بطاقات DAC الخارجية على سعر صغير والعديد من الوظائف الإضافية. لذلك ، حصلت على سجلات التحول 74HC595 والمقاومات لمصفوفة R2R. كان متحكم PIC16F1829 في المخزون بالفعل.
     من أجل العودة إلى الدائرة الأصلية ، يتم تقليل جميع التغييرات - استبدال وحدة الضبط التي يتم إجراؤها على لوحة منفصلة.

وصف الوظيفة


     تعتمد الدائرة على وحدة التحكم الدقيقة PIC16F1829 التي تعمل بتردد 32 ميجاهرتز. يتم ضبط تردد الساعة بواسطة مولد الساعة المدمج ، وفقًا لورقة البيانات ، فهو ليس دقيقًا جدًا ، ولكن بالنسبة لهذه الدائرة ، فهو ليس بالغ الأهمية. ميزة هذا MK هي وجود مقاومات سحب على جميع المدخلات الرقمية ووحدتي MSSP التي تطبق SPI. يتم استخدام جميع 18 دبابيس منطق متحكم.
     على أربعة نوبات يسجل 74HC595نفذت مصفوفات R2R جهازي DACs 16 بت. تشمل مزايا هذا السجل وجود سجل نوبة منفصل وسجل تخزين. هذا يسمح لك بكتابة البيانات إلى التسجيل دون كسر قيم الإخراج الحالية. يتم تجميع مصفوفة R2R على المقاومات مع خطأ بنسبة 1٪. جدير بالذكر أن القياسات الانتقائية أظهرت خطأ لا يزيد عن 10 أوم. في البداية ، كان من المخطط استخدام 3 سجلات ، ولكن عند توصيل اللوحة ، بدا لي أنه ليس حلاً جيدًا ، بالإضافة إلى ذلك ، كان من الضروري إضافة الحلمات.
     يتم تنشيط مقاومات السحب المدمجة في MC في جميع المدخلات وتبسيط الدائرة. يتم توصيل جميع المخرجات من أجهزة التشفير مباشرة بأطراف التوصيل MK ، حيث يحتوي كل جهاز تشفير على 4 مخرجات لجهاز استشعار الدوران نفسه وواحد للزر المدمج. يتم استخدام ما مجموعه 12 استنتاج MK لمعالجة بيانات الإدخال. يتم تنعيم ارتداد الاتصال بسعة 100nF. بعد تغيير قيم المخازن المؤقتة للجهد 16 بت والجهد وفقًا لبيانات الإدخال من المشفرات ، يتم نقل القيم إلى مسجلات التحول 74HC595 عبر SPI. لتقليل وقت نقل البيانات ، يتم استخدام وحدتي SPI ، مما يسمح بنقل البيانات في نفس الوقت للتيار والجهد. بعد نقل البيانات إلى السجل ، يتم إرسال أمر لنقل البيانات من مخزن النقل المؤقت إلى مخزن التخزين المؤقت. ترتبط مخرجات السجل بمصفوفة R2R التي تعمل كمقسم لـ DAC.يتم إرسال جهد الخرج من المصفوفة إلى مدخلات مضخمات التشغيل.
     تحدد الأزرار المدمجة في برامج التشفير الحد الأدنى (زر التشفير للتعديل السلس) أو الحد الأقصى (زر التشفير للتعديل الخشن) ، على التوالي ، للتيار أو الجهد.

مخطط


     على الإنترنت ، لم أجد مخططًا يتزامن تمامًا مع خطتي ، لذلك أخذت الرابط الأول. أدخل تصحيحات على التناقضات التي تم الكشف عنها ثم أضاف التغييرات. رسمت رسمًا تخطيطيًا لكتلة الضبط في TinyCAD - قم بتنزيل الملف HY3005D-regulator.dsn .

الأصل


بعد العثور على معلومات غير دقيقة


المخطط النهائي بعد التحسين تم وضع

الوحدة المحمولة مع التعديل (مظللة باللون الأحمر) في مخطط منفصل.

يتم توصيل الفولتميتر الرقمي مع عرض على اللوحة الأمامية (ليس في المخططات) بموصل J3.

المكونات المستخدمة


     فيما يلي قائمة بالمكونات المستخدمة (يشار إلى الحالة بين قوسين). تم شراؤها كلها في أوقات مختلفة في الصين. من المهم استخدام مصابيح LED بنفس خصائص الخصائص الأصلية مثل يقفون في سلسلة في دائرة خرج مكبرات الصوت التشغيلية (أخذت نفس تلك التي وقفت على اللوحة الأم).
  • U1: PIC16F1829I / ML متحكم (QFN)
  • U2 - U5: تسجيل المناوبة 74HC595BQ (DHVQFN16 أو SOT-763)
  • U6: AMS1117 5V منظم جهد خطي (SOT-223)
  • RE1 - RE4: مستشعر الزاوية التراكمية الميكانيكية EC11
  • مصفوفات R1 و R2 و R2R: مقاومات 1 و 2 كيلو أوم (SMD 0402)
  • C1 - C12، C14-C17: المكثفات الخزفية GRM21BR71E104KA01L 100nF (SMD 0805)
  • C13: مكثف التنتالوم 22mkF 16V (TIV B)
  • D1 ، D2: جهد اللوحة الأمامية / مصابيح LED الحالية


الرسوم


     لقد ولدت اللوحة في تخطيط Sprint 6 - قم بتنزيل الملف HY3005D-regulator.lay6 . لسوء الحظ ، لم يتم الاحتفاظ بالأصل الذي صنعت منه نسختي ، بتنسيق lay6 بالفعل مع التصحيحات المحددة أثناء التجميع:

  1. أضفت وصلات مرور بجوار واجهة البرنامج الثابت إلى اتصال المقاطعة لمشفّر التحكم الحالي السلس ، لأن منعت قدرات تصفية الاتصال ترتد وامض تحكم
  2. تمت إضافة وصلات مرور مفقودة للأرض بين الجانبين
  3. تم نقل مجموعة التثبيت بجهد 5 فولت إلى الجانب الآخر للحد من خلال وصلات العبور
  4. إضافة مكثفات تنعيم على خط الطاقة ( مناقشة )

الصورة بعد الحفر والحفر (الإصدار الأول)



     مصنوعة باستخدام مقاوم للضوء الفيلم. عانيت لفترة طويلة مع أسلاك صغيرة من السجلات. في النسخة الأخيرة ، كانت هناك عيوب صغيرة يجب تنظيفها بعد النقش. لكن بشكل عام ، فشل المجلس. لا يزال هناك عدد غير كافٍ من القافزين لربط الأرض على الجانبين الأمامي والخلفي.

بعد دخول المشاكل المحددة (النسخة الثانية)


0 SMD 0805.

الصورة بعد فك وتركيبها


      . — . — 12.

     كما ترون ، التغييرات ضئيلة ، ظلت جميع الموصلات القديمة دون تغيير. اضطررت لإضافة الطعام بشكل منفصل ، لأنه الجهد الوحيد الذي يأتي إلى لوحة التعديل 2.5 فولت غير مناسب للمقسّم الأصلي. إذا قمت بإزالة الصمام الثنائي الزينر إلى 2.5 فولت (V5A) على اللوحة الرئيسية لوحدة إمداد الطاقة ووضعت وصلة في مكان المقاوم (R1A) ، يمكنك الاستغناء عن مصدر طاقة إضافي 12 فولت.

البرامج الثابتة


كود C لمترجم 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 في المخزن المؤقت ، يتوقف الضبط عن العمل حتى أفهم مكان المشكلة. معدلات * معدل * مختارة متعددة وأكثر ملاءمة في رأيي. بالنسبة لأسلوب SendData ، لم أمرر المتغيرات كمعلمات لحفظ إرشادات الجهاز والذاكرة. يجب إيقاف تشغيل وضع البرامج الثابتة منخفضة الجهد (LVP) ، وإلا لن يعمل RA3 كمدخل رقمي. لا يتم استخدام المقاطعات ، طريقة tc_int موجودة في التعليمات البرمجية بحيث يضع المترجم الكتلة الرئيسية في بداية ROM.
     بالنسبة إلى البرامج الثابتة ، يكفي إزالة وصلات العبور ، وتوصيل PICkit 3 (أو مبرمج آخر) وتنفيذ البرامج الثابتة. في الإصدار الأول ، لم يكن هناك قفز على CLK و DAT ، لذلك اضطررت إلى إلغاء تثبيت مكثفات التنعيم ، وميضها ثم لحامها مرة أخرى.
تحديث:بعد تثبيت سعات إضافية على خط الكهرباء ، اختفت مشكلة الخروج من العداد من الموضع صفر. اضطررت أيضًا إلى تغيير اتجاه الدوران. يبدو أن الضجيج الناتج عن مقوم AMS1117 حال دون التعرف الصحيح على حالة المشفرات. بالإضافة إلى ذلك ، أضفت إعدادًا لقيم البدء ، والآن يتم تعيين الجهد الافتراضي على 5 فولت (لا يزال التيار عند الحد الأقصى). قبل إرسال البيانات الأولى ، تم إدخال تأخير قدره 50 مللي ثانية في السجلات (تم أخذ قيمة التأخير بهامش كبير) لانتظار تهيئة وحدات SPI.

خصائص جهد الخرج


     بعد التجميع النهائي للجهاز ، تم إجراء قياس الجهد بين جهات الاتصال J4.1 - J4.2 (تنظيم الجهد) و J4.1 - J4.7 (التنظيم الحالي). وفقًا للبيانات التي تم الحصول عليها ، تم رسم الرسوم البيانية (أدناه تحت المفسد) لاعتمادات القيمة / الجهد لـ DAC.
الرسوم البيانية



يتم الحصول على القيم المحسوبة
للجهد بواسطة الصيغة (U * D) / (2 ^ K) ، حيث U هو الجهد عند إخراج السجل ، مع مراعاة الفواصل في الدائرة الرئيسية (للتيار المستمر DACs - 4950mV للجهد DACs - 3550mV) ؛
D هي القيمة العشرية لعداد DAC ؛
K - عمق بت DAC (16 بت)

ما يمكن تحسينه


  • إضافة حفظ مؤقت للقيم
  • ربط القيم القياسية بأزرار التشفير ، على سبيل المثال ، للجهد: 3.3 ؛ 5.0 ؛ 7.5 ؛ 12 فولت
  • للحماية من قيمة غير معروفة عند بدء التشغيل ، من الأفضل توصيل MR بـ 1 ، وسحب OE من خلال المقاوم إلى 1 وإعادة التعيين إلى 0 بعد تهيئة MK.
  • استبدل DAC بـ PWM بسلسلة تنعيم (يُقترح LampTester هنا )

Source: https://habr.com/ru/post/ar391617/


All Articles