อินเทอร์เฟซสำหรับเครื่องชาร์จ USB Type C ด้วย PD/PPS
โครงการนี้มีต้นกำเนิดมาจากการรวมตัวกันกับ PSMBE GmbH
พวกเขาทำได้ดีมากใน
มีบอร์ดที่น่าสนใจบางอย่างที่จะเรียกแหล่งส่งพลังงาน USB Type C เช่น zy12pdn
คุณสามารถค้นหารายละเอียดมากมายได้ที่ Manuel BL .. โมดูลเหล่านี้ช่วยให้คุณก้าวผ่านโปรไฟล์คงที่ที่มีอยู่ซึ่งรวมถึง 5 V, 9 V, 12 V, 15 V และ 20 V. มีคนอื่น ๆ อีกมากมายที่มีแรงดันไฟฟ้าที่เลือกได้ผ่านตัวต้านทานหรือจัมเปอร์
ฉันจัดการเพื่อให้ได้หนึ่งในการใช้ชิป HUSB238 จาก Hynetek อันนี้สามารถตั้งโปรแกรมได้ผ่านตัวต้านทานหรือไมโครคอนโทรลเลอร์โดยใช้ I2C
น่าเสียดายที่สิ่งนี้ต่ำกว่าความสามารถของแหล่งจ่ายไฟที่สอดคล้องกับ PD 3.0 โมดูลทั้งหมดเหล่านี้ใช้เฉพาะที่เรียกว่าโปรไฟล์คงที่ แต่มีโหมด PPS (แหล่งจ่ายไฟที่ได้รับ porgrammable) สิ่งนี้ใช้โปรไฟล์ Augmented โปรไฟล์การเติมนั้นเป็นไปได้จาก 3.3 V ถึง 21 V และสูงสุด 5 A. แรงดันไฟฟ้าสามารถเลือกได้ในขั้นตอน 20 mV และสามารถเลือกกระแสสูงสุดในขั้นตอน 50 Ma
และนี่คือความคิดของฉัน: คุณเคยใช้หนึ่งในแหล่งจ่ายไฟในห้องปฏิบัติการแบบหนา ๆ ที่กินพื้นที่ส่วนใหญ่บนโต๊ะทำงานของคุณหรือไม่? แหล่งจ่ายไฟเหล่านี้มักจะอยู่ในช่วง 0 - 30 V และ 0 - 5 A. เท่าที่ฉันกังวลฉันส่วนใหญ่ใช้ 5 - 15 V ที่แอมป์ไม่กี่แอมป์
ถ้าเราสามารถใช้โปรไฟล์เพิ่มนี้เพื่อเลียนแบบแหล่งจ่ายไฟในห้องปฏิบัติการ เราจะต้องมีชิปซึ่งสามารถขอโปรไฟล์นี้จากแหล่งจ่ายไฟ USB Type C ที่เหมาะสมที่เหมาะสม
มีวิธีที่ง่ายและยาก:
วิธีที่ง่ายคือการบอกชิปบางอย่างเพื่อขอแรงดันไฟฟ้าที่ต้องการในรูปแบบแหล่งจ่ายไฟ
ชิปดังกล่าวคือ AP33772 ที่มีให้จาก Diodes Incorporated คุณสามารถรับไดโอดแบบฟอร์มการประเมินผลหรือผู้ผลิตรายอื่นได้เช่น Microe นี่คือ USB-C Sink 2 คลิก แบบฟอร์ม Microe: 
ชิปนี้ถูกทำเครื่องหมายว่าเป็น NRND และถูกแทนที่ด้วย AP33772S เวอร์ชัน "S" นั้นใช้งานง่ายยิ่งขึ้น แต่มีข้อเสียอย่างมาก: อนุญาตให้ใช้ขั้นตอนเพียง 100 mV และ 250 Ma
วิธีที่ยากคือการใช้หนึ่งใน USB-C PD Phys พวกเขาให้อินเทอร์เฟซ OSI 0 + 1 กับแหล่งจ่ายไฟ ระดับที่สูงขึ้นจะต้องดำเนินการใน SW ชิปที่ใช้กันมากที่สุดดูเหมือนจะเป็นรูปแบบ FUSB302 บนเซมิคอนดักเตอร์ ชิปนี้ใช้ใน zy12pdn ดั้งเดิม
และนี่คือ: 
นี่คือ PD-Micro ที่ได้รับการออกแบบโดย Ryan Ma มันคือ aruduino pro micro ที่มี FUSB302, ไฟ LED บางตัว, สวิตช์ไฟและตัวควบคุมแรงดันไฟฟ้า Ryan ทำให้ง่ายต่อการเลือกโปรไฟล์ Appropiate Kai Clemens Liebich ได้ทำการปรับปรุง Lib FUSB302 ของ Ryan
ปัญหาเดียวคือความเสถียรของแรงดันไฟฟ้า แม้ว่าจะใช้สาย USB C 5 A USB CABRES การลดลงของแรงดันไฟฟ้าก็ค่อนข้างสำคัญ ดังนั้นเราอาจจำเป็นต้องวัดแรงดันเอาต์พุตเพื่อปรับแรงดันไฟฟ้าของแหล่งจ่ายไฟ แนวคิดของ Frist คือการใช้ ADC ภายในกับ Eference แรงดันไฟฟ้า 2.048 V ภายนอก ปัญหาคือนี่เป็นเพียง 10 บิต ADC แต่เราจำเป็นต้องวัดแรงดันไฟฟ้าสูงถึง 21 V. สมมติว่าเราคลิปที่ 20.48 V เราจะมีความละเอียด 20 mV สิ่งนี้ดูเหมือนจะเพียงพอ แต่เราทำได้ดีกว่านี้ เมื่อใช้ ADC เฉพาะเช่น INA219
เราสามารถปรับปรุงความแม่นยำเป็น 4 mV นี่คือต่ำกว่า 20 mV stepeize เราได้รับเซ็นเซอร์ปัจจุบันอยู่ด้านบน
คำเตือนเกี่ยวกับเซ็นเซอร์ปัจจุบัน ACS712
ACS 712 เป็นเซ็นเซอร์ปัจจุบันที่ใช้งานง่าย แต่:
ตอนนี้เราสามารถตั้งค่าแรงดันไฟฟ้าเปิดใช้งานเอาต์พุตและวัดแรงดันเอาต์พุตและกระแสไฟฟ้า ดังนั้นเราสามารถเขียนโค้ดสองสามบรรทัดเพื่อใช้แหล่งแรงดันไฟฟ้า / กระแสไฟฟ้าคงที่ เวลาตอบสนองของการกู้คืนจะถูก จำกัด ด้วยความเร็วของแหล่งจ่ายไฟ แต่อยู่ในขีด จำกัด ที่เหมาะสมกับแหล่งจ่ายไฟ USB ของคุณ PS ของฉันเป็น Ugreen Nexode 2 ที่ล้าสมัยด้วย 100W ซึ่งสลับใน ~ 40 .. 50 ms
แต่แรงดันไฟฟ้าและกระแสไฟฟ้าเป็นอย่างไร? เราสามารถใช้อินเทอร์เฟซอนุกรมและคอมพิวเตอร์เพื่อ "ควบคุมระยะไกล" วงจร แต่สิ่งที่เกี่ยวกับ LCD สวิตช์โรตารี่เป็น UI?
และสิ่งนี้นำฉันไปสู่ต้นแบบแรกของฉัน

และนี่คือส่วนประกอบตามเข็มนาฬิกาเริ่มต้นด้วยด้านซ้ายบน

นี่คือแรงดันไฟฟ้าและเซ็นเซอร์ปัจจุบัน ตัวต้านทานการแบ่งย่อยลดลงเหลือ R015 เพื่อรับการอ่าน 5 ครั้งเต็ม
มี EEPROM อนุกรม 24C256 บนกระดาน ใช้สำหรับการจัดเก็บพารามิเตอร์ ฉันสามารถใช้ Atmel บน Chip Eeprom ได้ แต่นี่มีวิธีการต่อต้านการสึกหรอน้อยลง ฉันไม่ทราบว่าจะต้องใช้รอบการเขียนกี่รอบดังนั้นฉันจึงเลือก Eeprom ภายนอก

นี่คือหัวใจของวงจร
พอร์ต USB - C ของ PD -micro ถูกครอบครองโดยแหล่งจ่ายไฟ อินเทอร์เฟซ USB ไม่สามารถใช้สำหรับการสื่อสาร อินเทอร์เฟซอนุกรม HW จึงมีสายไปยัง FT232 USB ไปยังชิปอนุกรม

นี่คือจอแสดงผลที่เข้ากันได้กับ 20x4 HD44780 ด้วย PCF8574, อินเวอร์เตอร์แรงดันไฟฟ้าและแหล่งปัจจุบันสำหรับความคมชัดตามที่อธิบายไว้ในไลบรารี LCD ของฉัน
ซ้ายไปยังจอแสดงผลมีสวิตช์เข้ารหัสแบบโรตารี่ KY-040 เหนือสวิตช์มีเพียงบาร์บัส I2C และ VCC
แหล่งจ่ายไฟในห้องปฏิบัติการต้องการคุณสมบัติอะไรบ้าง?












เมื่อเริ่มต้นระบบจะแสดงเวอร์ชันและสร้างข้อความก่อนเริ่มต้นในเมนูหลัก
PD/PPS-Controller
====================
Ver. : 3.3 nbl
Build: mmm dd yyyy
หลังจากการเริ่มต้นเสร็จสิ้นเมนูหลักจะปรากฏขึ้น
Mode (x:...) [UI^] !
UU.UU V I.II A
OUT UU.UU V I.II A
[i i i i i] (i)
บรรทัดสุดท้าย I: ไอคอนเมนู
ในการเลือกรายการเมนูกดปุ่มเคอร์เซอร์จะปรากฏขึ้น หมุนสวิตช์โรตารี่จนเคอร์เซอร์อยู่ที่ตำแหน่งของรายการที่ต้องการ กดปุ่มอีกครั้งเพื่อเลือกเมนู ในเมนูนี้ "V" และ "A" ในบรรทัดที่สองเป็นรายการเมนูด้วย เลือกเพื่อปรับแรงดันไฟฟ้าหรือกระแสที่ต้องการ
เมนูนี้ใช้เพื่อเลือกโปรไฟล์ PD ที่ต้องการ
# 1 / n (...)
U= UU.UU V - UU.UU V
I= I.II A max
[i i i] (i)
บรรทัดสุดท้าย I: ไอคอนเมนู
ในการเลือกโปรไฟล์กดปุ่มนำทางไปยังสัญลักษณ์ "#" ในบรรทัดแรกและกดอีกครั้งเพื่อป้อนการเลือกโปรไฟล์ การเปลี่ยนจะก้าวผ่านโปรไฟล์ Avalabla ในการเลือกการกดโปรไฟล์อีกครั้งและนำทางไปยังเครื่องหมายถูกในบรรทัด Buttom หรือเลือก "X" เพื่อยกเลิก
เมนูนี้ใช้เพื่อเปลี่ยนโหมดการทำงานหรือค่าการสอบเทียบ
(i)=auto (*)=. *
(i)=auto
(i)=auto
[i i i x] (i)
[i] หรือ (i) ไอคอนในวงเล็บ
I= I.III A: I.III A
[i i i x] (i)
[i] หรือ (i) ไอคอนในวงเล็บ
ในการปรับการสอบเทียบการวัดปัจจุบันจะเปิดใช้งานเอาต์พุตด้วยโหลดและใช้เครื่องวัดแอมป์ที่สอบเทียบเพื่อวัดกระแส
ป้อนเมนูการตั้งค่าและไปที่เมนูการสอบเทียบ ป้อนกระแสที่วัดได้และเลือกเครื่องหมายถูกที่ได้รับการแนะนำให้เลือกกระแสที่สูงที่สุดเท่าที่จะเป็นไปได้เพื่อให้ได้ความแม่นยำสูงสุด
AVR SW เขียนด้วย Arduino IDE ในขณะที่พัฒนา SW ฉันพบบางสิ่งเกี่ยวกับระบบ:
หลังจากเริ่มต้นประสบความสำเร็จอย่างรวดเร็วในประเด็นกับแฟลชและราม คุณอาจสามารถเรียกใช้รหัส AVR แต่ฉันขอแนะนำให้ลดฟังก์ชั่นการทำงานของหน่วยความจำฟรี
และสิ่งนี้นำฉันไปสู่ต้นแบบที่สองโดยใช้ ATSAMD21G18
ซอฟต์แวร์ในโฟลเดอร์ AVR เป็นไปตามที่เป็นอยู่ เธอจะไม่พัฒนาต่อไปในสาขานี้ มันทำงานได้ แต่ใช้ความเสี่ยงของคุณเอง มันคอมไพล์โดยไม่มี bootloader คุณจะต้องเพิ่มไฟล์ boards.local.txt จากโฟลเดอร์ config ไปที่
C:Users_user_AppDataLocalArduino15packagesarduinohardwareavr1.8.6
(อย่างน้อยบนเครื่อง Windows) และเลือก Arduino Leonardo w/o bootloader จากบอร์ดที่มีอยู่
คุณจะต้องมี avrdude และ usbasp
คำแนะนำ: ระวังเมื่อซื้อโคลนราคาถูก พวกเขามักจะมาพร้อมกับ SW ที่ล้าสมัยและจะไม่ทำงาน ไม่มีปัญหาในการอัปเดตสิ่งเหล่านี้ แต่คุณจะต้องใช้อะแดปเตอร์ USBASP ที่ใช้งานได้
โปรแกรมเมอร์เพื่อแฟลช SW สำหรับผู้ใช้ที่ไม่ใช่ CLI: avrduess เป็น GUI ที่ยอดเยี่ยมสำหรับ avrdude
คุณอาจใช้ Arduino Uno เป็นสะพาน USB ถึง ISP
หลังจากความพ่ายแพ้ของฉันฉันลอง Arduino Zero บอร์ดนี้ใช้ ATSAMD21G18 ซึ่งเป็นตัวควบคุม Cortex M0+ ARM ที่ทำงานที่ 48 MHz มันมีแฟลช 256 kb และ 32 kb ram และอินเทอร์เฟซมากมาย พอร์ตด่วนแสดงให้เห็นว่า SW สามารถพอร์ตได้ง่ายจาก AVR ไปยังแขนโดยแทบไม่มีปัญหา
นี่คือจุดที่เราตัดสินใจที่จะเริ่มต้น PCB ที่กำหนดเองครั้งแรกของเราเพื่อหลีกเลี่ยงปัญหาทั้งหมดที่พบกับ portotype แรก
อาการปวดหัวบางอย่างทำให้ VCC จัดหา วงจรตัวแปลงบั๊กส่วนใหญ่ต้องการส่วนหัวแรงดันไฟฟ้าบางส่วนในการทำงานและ "คุณสมบัติ" วงจรล็อคแรงดันต่ำ แต่นี่คือการไม่ไปสำหรับวงจรนี้ มันจำเป็นต้องทำงานให้ต่ำถึง 3.3 V VBUS เราต้องการ Curcuit บายพาส Undervoltage เพื่อรับประกันการดำเนินการที่ 3.3 V VBUS มิฉะนั้นวงจรจะล็อคเมื่อ VBUs ลดลงต่ำกว่าขีด จำกัด ซึ่งโดยทั่วไปจะเป็น 4 V - 4.7 V ที่เอาต์พุต 3.3 V
ปัญหานี้ได้รับการแก้ไข overgineered เล็กน้อย เราใช้หน่วยงานกำกับดูแล 3.3 V สองตัวซึ่งมีไดโอดในอุดมคติ
TPS62932 ได้รับการกำหนดค่าเป็นเอาต์พุต 3.45 V. UVLO ถูกตั้งค่าเป็น 4.55 V และการเปิดใช้งานถูกตั้งค่าเป็น 5.06 V. สิ่งนี้รับประกันได้ว่าตัวแปลงบั๊กทำงานสูงกว่า 5 V และเอาต์พุตเล็กน้อยสูงกว่า 3.3 V เล็กน้อย LDO เป็นชุด NCV2951ACDMR2G เป็น 3.3 V. แรงดันกลางคันคือสูงสุด 450 mV ที่ 100 mA การบริโภคปัจจุบันของวงจรต่ำกว่า 50 Ma ดังนั้นเราจะมีการออกกลางคันสูงสุด 300 mV
เมื่อแรงดันไฟฟ้าอินพุตสูงกว่า 5.06 V LDO นั้นไม่ได้ใช้งานและ VCC คือ 3.45 V. เมื่อ voltag อินพุตลดลงต่ำกว่า 4.55 V ตัวแปลงบั๊กจะถูกปิดใช้งานและ LDO ใช้ OVE ส่งผลให้ VCC 3.3 V
CPU จะทำงานได้อย่างดีถึง 2.7 V ขึ้นอยู่กับการตั้งค่า Brownout
PCBA: 
ต้นแบบการทำงาน: 
Current Calibration
internal I.III A
reference I.III A
[i i i x] (i)
การอ่านปัจจุบันและค่าอ้างอิงได้รับการจัดระเบียบใหม่
SW ได้รับการ refactored และตอนนี้เป็น USB-PD2 ใน SW ครั้งแรกการควบคุมแหล่งจ่ายไฟถูกนำไปใช้ในคลาสเมนู สิ่งนี้ถูกย้ายไปยังคลาสคอนโทรลเลอร์ของตัวเอง
มีการเพิ่มส่วนหัวสำหรับการเตือนความจำ todo แล้วมีการเพิ่มคลาสทดสอบแหล่งจ่ายไฟในการเปลี่ยนแปลงโปรไฟล์การทดสอบ
เพื่อที่จะแฟลช SW เป็นครั้งแรกคุณจะต้องมีอินเตอร์เฟสการดีบัก JTAG เช่น
คุณสามารถใช้ Atmel Studio หรือ Arduino IDE เพื่อแฟลช Arduio Zero bootloader
คุณสามารถใช้การสาธิต Blink ได้เช่นกัน เลือกร่าง -> ส่งออกไบนารี IDE จะสร้างไฟล์ xxx.ino.with_bootloader.arduino_zero.bin เพียงแค่แฟลชไฟล์ คุณอาจต้องคัดลอกบิตฟิวส์จาก Arduino Zero
มีตัวอย่างบางอย่างในโฟลเดอร์ฟิวส์ ฟิวส์บางส่วนได้รับการปรับแต่งจากโรงงานและไม่สามารถเขียนทับได้
เมื่อ bootloader ทำงานคุณสามารถแฟลช SW โดยใช้ SAM-BA bootloader SW ที่จัดทำโดย Microchip มี CLI ซึ่งเหมาะสำหรับอุปกรณ์ SAM ทั้งหมดที่รองรับ SAM-BA และดังนั้นจึงค่อนข้างยุ่งยากในการใช้งาน เครื่องมือที่ง่ายกว่าคือ Bossa จาก Shumatech
เครื่องชาร์จของฉันรองรับ 5 V / 9 V / 12 V / 15 V @ 3A และ 20 V @ 5A profiles แก้ไขและ 3.3 V - 21 V @ 5 โปรไฟล์เพิ่ม ระวังตัวชาร์จจำนวนมากที่ทำเครื่องหมายด้วย 100W (แม้แต่ UGREEN) จะรองรับ 65 W PPS (3.25 A) ที่มีช่วงแรงดันไฟฟ้า จำกัด พวกเขาอาจไม่ได้รับแรงดันไฟฟ้าต่ำกว่า 3.3 V. บางตัวจะมีโปรไฟล์ PPS สองตัวที่มีการจัดอันดับแรงดันไฟฟ้า / กระแสไฟฟ้าที่แตกต่างกัน
UGREEN NEXODE 2 พอร์ต 100W PD-Charger (รุ่น CD254 #50827) โปรไฟล์ที่รองรับ:
Ugreen Nexode 100W Desktop Charger (รุ่น CD328 #90928) โปรไฟล์ที่รองรับ:
Anker Powerport ฉัน 30W PD
โปรไฟล์ที่รองรับ:
Ilepo USB C ที่ชาร์จเร็ว 65 W
โปรไฟล์ที่รองรับ
Iniu Power Bank 20000mAh, 22.5W
โปรไฟล์ที่รองรับ
พลังงานบางอย่างดูเหมือนจะรีเซ็ตพลังงานเมื่อไม่มีกระแสไฟฟ้าถูกดึง
"Nexode 100W Desktop Charger" ของฉัน P/N 90928 รีเซ็ตหลังจาก ~ 1 ชั่วโมงโดยไม่ต้องโหลด เครื่องชาร์จอื่น ๆ ไม่ได้
ธนาคารพลังงาน INIU ของฉันรีเซ็ตโดยไม่มีการโหลดภายใน ~ 10s
บันทึกด้วยโหลด 20r
0006: FUSB302 ver ID:B_revA
0118: USB attached CC1 vRd-3.0
0172: RX Src_Cap id=1 raw=0x53A1
0172: obj0=0x2A01912C
0172: obj1=0x0002D0E9
0172: obj2=0x0003C096
0172: obj3=0xC076323C
0172: obj4=0xC0DC3228
0172: [0] 5.00V 3.00A
0172: [1] 9.00V 2.33A
0172: [2] 12.00V 1.50A
0172: [3] 5.00V-5.90V 3.00A PPS *
0172: [4] 5.00V-11.00V 2.00A PPS
0176: TX Request id=0 raw=0x1082
0176: obj0=0x42022628
0186: RX GoodCRC id=0 raw=0x0121
0192: RX Accept id=2 raw=0x05A3
0210: RX PS_RDY id=3 raw=0x07A6
0212: PPS 5.50V 2.00A supply ready
0214: Load SW ON
5214: TX Request id=1 raw=0x1282
5214: obj0=0x42022628
5222: RX GoodCRC id=1 raw=0x0321
5228: RX Accept id=4 raw=0x09A3
5246: RX PS_RDY id=5 raw=0x0BA6
5246: PPS 5.50V 2.00A supply ready
10248:TX Request id=2 raw=0x1482
10248: obj0=0x42022628
10256:RX GoodCRC id=2 raw=0x0521
10262:RX Accept id=6 raw=0x0DA3
10280:RX PS_RDY id=7 raw=0x0FA6
10280:PPS 5.50V 2.00A supply ready
...
บันทึกโดยไม่ต้องโหลด:
0006: FUSB302 ver ID:B_revA
0118: USB attached CC1 vRd-3.0
0172: RX Src_Cap id=1 raw=0x53A1
0172: obj0=0x2A01912C
0172: obj1=0x0002D0E9
0172: obj2=0x0003C096
0172: obj3=0xC076323C
0172: obj4=0xC0DC3228
0172: [0] 5.00V 3.00A
0172: [1] 9.00V 2.33A
0172: [2] 12.00V 1.50A
0172: [3] 5.00V-5.90V 3.00A PPS *
0172: [4] 5.00V-11.00V 2.00A PPS
0176: TX Request id=0 raw=0x1082
0176: obj0=0x42022628
0186: RX GoodCRC id=0 raw=0x0121
0192: RX Accept id=2 raw=0x05A3
0210: RX PS_RDY id=3 raw=0x07A6
0212: PPS 5.50V 2.00A supply ready
0214: Load SW ON
5214: TX Request id=1 raw=0x1282
5214: obj0=0x42022628
5222: RX GoodCRC id=1 raw=0x0321
5228: RX Accept id=4 raw=0x09A3
5248: RX PS_RDY id=5 raw=0x0BA6
5248: PPS 5.50V 2.00A supply ready
10250:TX Request id=2 raw=0x1482
10250: obj0=0x42022628
10258:RX GoodCRC id=2 raw=0x0521
10264:RX Accept id=6 raw=0x0DA3
10284:RX PS_RDY id=7 raw=0x0FA6
10284:PPS 5.50V 2.00A supply ready
==> The Power bank resets and defaults to 5V only.
0006: FUSB302 ver ID:B_revA
0118: USB attached CC1 vRd-3.0
0352: TX Get_Src_Cap id=0 raw=0x0087
0704: TX Get_Src_Cap id=0 raw=0x0087
1056: TX Get_Src_Cap id=0 raw=0x0087