MCP3424, วิธีอ่านช่องสัญญาณแบบขนาน?


9

เกี่ยวกับคำถามนี้

ฉันไม่มีพื้นฐานด้านวิศวกรรมอิเล็กทรอนิกส์และนี่เป็นหนึ่งในความท้าทายครั้งแรกของฉันในการสื่อสารผ่าน I2C และการเขียนลงทะเบียนดังนั้นโปรดอย่าสันนิษฐานความรู้จากด้านข้างของฉันมากเกินไป ฉันกำลังเขียนโปรแกรม Arduino

เมื่อถามถึงส่วนประกอบ / ชิปอิเล็กทรอนิกส์เฉพาะฉันคิดว่าผู้คนไม่สามารถทดลอง / ทดสอบเพื่อให้คำตอบที่ถูกต้อง ฉันคาดหวังว่าผู้คนจะไม่รู้จักองค์ประกอบนี้ด้วยซ้ำ ดังนั้นฉันจะพยายามเพิ่มข้อมูลมากในคำถามนี้

โปรดแจ้งให้เราทราบหากคุณต้องการข้อมูลเพิ่มเติม

ส่วนประกอบมีสี่ ADC

ฉันใช้ส่วนประกอบ 4 แชนเนล MCP3424 ( แผ่นข้อมูล ) มันมาในสองแพ็คเกจ ฉันกำลังใช้ MCP3424 E / SL เวอร์ชัน SOIC 4 แชนเนลไม่ใช่เวอร์ชัน MCP3422 หรือ MCP3423 2

ฉันเชื่อว่ามันมี ADC สี่ตัว บน RS-Online ดูเหมือนว่ารุ่น E / SL มี 4 ADC ( ลิงก์โดยตรง ) ในขณะที่ E / ST มีเพียงหนึ่ง ( ลิงก์โดยตรง ) ป้อนคำอธิบายรูปภาพที่นี่

ฉันคิดว่านี่ต้องหมายความว่ามันสามารถทำการสุ่มตัวอย่างในหลาย ๆ ช่องพร้อมกัน ฉันไม่เห็นเหตุผลอื่นใดเลยที่จะวาง ADC มากกว่าหนึ่งรายการไว้บนคอมโพเนนต์

ฉันถูกไหม?

การสื่อสารผ่าน I2C

การสื่อสารเกิดขึ้นโดยการส่งการกำหนดค่าหนึ่งไบต์จากนั้นรอการสุ่มตัวอย่างถึงจุดสิ้นสุดและอ่านผลลัพธ์

รูปแบบของ Config Byte

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งที่น่าสนใจคือ:

  • บิตที่สามจากซ้ายนับจาก 1: สุ่มตัวอย่างอย่างต่อเนื่อง
  • บิตที่หนึ่งและสองจากซ้ายนับจาก 1: ที่อยู่

เพิ่มเติมเกี่ยวกับการตั้งค่าไบต์ที่สามารถพบได้บนหน้าแผ่นข้อมูล 18 ยังภาพที่นี่

รูปแบบของผลการอ่าน

ตัวอย่างของฉันจะมีความละเอียด 18 บิตเท่านั้น (บิต 5 และ 6 ตั้งค่าเป็น 1) ผลการอ่านย้อนกลับจะเป็นสี่ไบต์: สามรายการแรกมีค่าและที่สี่มีค่ากำหนดไบต์

อย่างไรก็ตามบิตซ้ายสุด,! RDY จะบอกว่าค่านี้เป็น "ใหม่" หรือไม่นั่นคือถ้าเป็นการอ่านใหม่ตั้งแต่การอ่านครั้งล่าสุด ครั้งแรกที่อ่านผลลัพธ์หนึ่งรายการค่าจะเป็น 0 และสำหรับผลลัพธ์ถัดมาคือ 1 จนกระทั่ง ADC พร้อมกับค่าตัวอย่างใหม่

วิธีใช้งานโดยไม่สุ่มตัวอย่างแบบคู่ขนาน

ฉันรู้ดีว่าจะทำอย่างไรดี และตัวอย่างทั้งหมดที่ฉันพบทางออนไลน์ก็ดูง่าย ๆ เช่นนี้ เพียงแค่เขียนไบต์การกำหนดค่าไปยังส่วนประกอบแล้วอ่านค่ากลับ

วิธีการตั้งค่าแต่ละช่องให้สุ่มตัวอย่างโดยอัตโนมัติและอ่านช่องทางคู่ขนาน

รหัสหลอกอาจเป็นเช่น

setup():
    start sampling channel 1, 18bit, 0gain, continuously
    start sampling channel 2, 18bit, 0gain, continuously
    start sampling channel 3, 18bit, 4gain, continuously
    start sampling channel 1, 18bit, 2gain, continuously

readADCs():
    // Run every 500ms
    // 18 bit samples take 375ms, so must happen in parallel 
    // to get a new sample for all every 500ms
    read channel 1
    read channel 2
    read channel 3
    read channel 4

ความพยายามที่ดีที่สุดของฉัน

ดังนั้นฉันหวังว่าต่อไปนี้จะตั้งค่า ADC แต่ละตัวอย่างอย่างต่อเนื่อง นี่คือรหัส Arduino

void setup() {

    Wire.write(0b00011100);
    Wire.write(0b01011100);
    Wire.write(0b10011110);
    Wire.write(0b11011101);
}

จากนั้นฉันจะอ่านช่องทางเฉพาะได้อย่างไร ถ้าฉันถามส่วนประกอบของผลลัพธ์มันจะส่งคืนผลลัพธ์ของแชนเนลในรีจิสเตอร์ ด้วยการตั้งค่าด้านบนฉันจะได้รับการอ่านสำหรับช่อง 4 แต่สมมุติว่าฉันต้องการอ่านจากช่องที่ 2 ในบางวิธีฉันก็ต้องบอกว่าฉันต้องการผลลัพธ์ของช่องที่ 2 ฉันไม่ต้องการ ขอให้มันสุ่มตัวอย่างอะไรมันควรจะทำการสุ่มตัวอย่างอย่างต่อเนื่องและฉันแค่ต้องการตัวอย่างที่ไม่พอใจที่สุดที่มันสร้างขึ้นในขณะที่สุ่มตัวอย่างโดยอัตโนมัติ

ด้านล่างนี้เป็นคำตอบที่ดีที่สุดของฉัน

void readADCs() {

    // Channel 1
    // ...

    // Channel 2
    Wire.beginTransmission(104);
    Wire.write(0b01011100); // I hope not to affect, just to select
    Wire.endTransmission();
    Wire.requestFrom(104);
    Wire.read(); // val byte 1
    Wire.read(); // val byte 2
    Wire.read(); // val byte 3
    Wire.read(); // config byte
}

ดังนั้นการคาดเดาที่ดีที่สุดของฉันคือ ถ้าฉันต้องการอ่านแชนเนล 2 ฉันเขียนไบต์การกำหนดค่าซึ่งเหมือนกันทุกประการเหมือนกับที่ฉันใช้สำหรับเริ่มต้นแชนเนล 2

อย่างไรก็ตามสิ่งนี้ไม่ได้ผล ไม่มีตัวอย่างพร้อมแม้ว่าจะมีมากกว่า 375ms ที่จำเป็นก็ตาม

ฉันจะบรรลุสิ่งนี้ได้อย่างไร

ฉันพยายามทำให้ดีที่สุดด้วยการอธิบายผลลัพธ์ที่ต้องการและสิ่งที่ฉันพยายาม แต่ฉันรู้ว่ามันไม่ง่ายที่จะอ่าน

คุณสามารถให้คำแนะนำเกี่ยวกับวิธีการให้ตัวอย่าง ADC ทั้งหมดแบบขนานแล้วอ่านจากพวกเขาโดยไม่รบกวน


การเริ่มต้นที่ดี. สิ่งเดียวที่ขาดหายไปคือลิงค์ไปยังแผ่นข้อมูลสำหรับ MCP3424 ซึ่งฉันได้เพิ่มไว้
JRE

MCP3424 มีสองแพ็คเกจไม่ใช่เวอร์ชั่นและทั้งสองเป็น 4 ช่องสัญญาณ ST คือ TSSOP, SL คือ Soic มี MCP3422 2 ช่อง, ที่อยู่คงที่, MCP3423, 2 ช่องทาง, ที่อยู่ที่ปรับได้และ MCP3424 4 ช่อง
Passerby

+1 คำถามที่ละเอียดมากเขียนได้ดีมาก น่าเศร้าที่ชิปตัวนี้เป็น ADC ตัวเดียว ดังแสดงในแผ่นข้อมูลใน "ฟังก์ชันบล็อกไดอะแกรม" คุณได้อ่านช่องอินพุตตามความหมายของ ADC การมีช่องสัญญาณเข้าจำนวนมากอนุญาตให้ใช้หนึ่ง ADC ในการสุ่มตัวอย่างสัญญาณต่าง ๆ (เรียงตามลำดับ) ADC นั้นแพงกว่าการทำ multiplexer แบบอนาล็อก (ซึ่งเลือกช่องสัญญาณ) และการสุ่มสัญญาณหลาย ๆ ตัวเป็นข้อกำหนดทั่วไป ดังนั้นชิป ADC มักจะทำงานในลักษณะนี้ Andy aka ได้ตอบคำถามของคุณแล้ว แต่อาจรอก่อนที่จะยอมรับเนื่องจากคุณอาจได้รับข้อมูลเพิ่มเติม
gbulmer

ฉันเชื่อว่ามันมี 4 ADCs เพราะ RS-Online บอกว่า E / SL มี 4 และ E / ST มี 1 ฉันได้เพิ่มคำอธิบาย
Mads Skjern

2
@MadsSkjern เพิกเฉยต่อ RS, Microchip และแผ่นข้อมูลของพวกเขาเป็นกษัตริย์ นั่นเป็นข้อผิดพลาดใน RS ข้อผิดพลาดในเว็บไซต์ผู้จัดจำหน่ายเป็นเรื่องธรรมดา
Passerby

คำตอบ:


11

ฉันมีรุ่นหลังที่มี ADC สี่ตัว ฉันคิดว่านี่ต้องหมายความว่ามันสามารถทำการสุ่มตัวอย่างในหลาย ๆ ช่องพร้อมกันได้

แต่น่าเสียดายที่ไม่ได้. มี ADC เพียงตัวเดียวและหากต้องการแปลงมากกว่าหนึ่งช่องต้องดำเนินการตามลำดับโดยการระบุมัลติเพล็กเซอร์ภายในเพื่อ "อ่าน" ช่องอื่น ไม่มีการสุ่มตัวอย่างพร้อมกัน: -

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุอินพุทมัลติเพล็กเซอร์เลือกเพียงหนึ่งในสี่ช่องสัญญาณในเวลาเดียว นี่เป็นวิธีการทั่วไปที่ใช้ในการอ่านหลายช่องสัญญาณ แต่มีการสุ่มตัวอย่าง ADCs พร้อมกัน ลองดูที่เทคโนโลยีเชิงเส้นพอร์ตการลงทุนของ TI หรือ ADI


+1, ใช่แล้วฉัน :-) มันอาจจะคุ้มค่าที่จะสะกดความจริงที่ว่ามันเป็นเรื่องธรรมดาสำหรับ ADC ตัวอย่างหลายช่องทางเพราะมันสามารถสุ่มตัวอย่างสัญญาณอะนาล็อกที่แตกต่างกันซึ่งเป็นกรณีทั่วไป
gbulmer

นอกจากนี้ถ้าอัตราการสุ่มตัวอย่างต่ำจะเรียกว่าสำหรับ, มัลติ / interleaving มักจะเป็นที่ดีพอ
สกอตต์เซดแมน

ปรับปรุงการ spiffing ครับ
gbulmer

@ gbulmer คุณใจดีเกินไป !!
แอนดี้อาคา

5

MCP3424เป็น ADC เดียวกับ Multiplexer ที่ปลายด้านหน้า

แผนภาพนี้จากแผ่นข้อมูลแสดงให้เห็นว่าค่อนข้างชัดเจน

MCP3424 สถาปัตยกรรม

แผ่นข้อมูลสำรองนี้ด้วยการแนะนำ:

4.1 ภาพรวมทั่วไป

อุปกรณ์ MCP3422 / 3/4 เป็นตัวแปลงสัญญาณ A / D Delta-Sigma แบบ 18 ช่องบิตที่ใช้พลังงานต่ำและมีอินเตอร์เฟซอนุกรม I2C อุปกรณ์ประกอบด้วยตัวเลือกช่องสัญญาณมัลติเพล็กเซอร์ (mux), เครื่องขยายสัญญาณแบบตั้งโปรแกรมได้ (PGA), การอ้างอิงแรงดันไฟฟ้าออนบอร์ด (2.048V) และออสซิลเลเตอร์ภายใน

ดังนั้นคุณไม่สามารถแปลงแชนเนลที่แตกต่างกันได้อย่างแท้จริงพร้อมกัน แต่คุณสามารถสุ่มตัวอย่างแชนเนลตามลำดับโดยมีความล่าช้าเล็กน้อยระหว่างกัน

เมื่อใช้อุปกรณ์นี้คุณต้องแน่ใจว่าบิตที่อยู่ I2C นั้นเสถียร อีกครั้งจากแผ่นข้อมูล:

MCP3423 และ MCP3424 มีที่อยู่อุปกรณ์ภายนอกสองพิน (Adr1, Adr0) หมุดเหล่านี้สามารถตั้งค่าเป็นลอจิกสูง (หรือผูกติดกับ VDD), ต่ำ (หรือผูกติดกับ VSS) หรือลอยซ้าย (ไม่เชื่อมต่อกับอะไรเลยหรือผูกติดกับ VDD / 2), การรวมกันของระดับตรรกะโดยใช้หมุดสองตัว อนุญาตแปดที่อยู่ที่เป็นไปได้ ตารางที่ 5-3 แสดงที่อยู่อุปกรณ์ขึ้นอยู่กับสถานะตรรกะของหมุดเลือกที่อยู่ อุปกรณ์ตัวอย่างสถานะตรรกะของหมุด Adr0 และ Adr1 ในเหตุการณ์ต่อไปนี้:

อุปกรณ์เปิดเครื่อง

ข รีเซ็ตการโทรทั่วไป

(ดูหัวข้อ 5.4“ การโทรทั่วไป”)

ค. Latch โทรทั่วไป

(ดูหัวข้อ 5.4“ การโทรทั่วไป”)

อุปกรณ์จะสุ่มตัวอย่างสถานะลอจิก (หมุดที่อยู่) ในระหว่างเหตุการณ์ข้างต้นและล็อคค่าจนกว่าจะมีเหตุการณ์การล็อคใหม่เกิดขึ้น ในระหว่างการทำงานปกติ (หลังจากสลักที่อยู่ถูกสลัก) หมุดที่อยู่จะถูกปิดใช้งานภายในจากส่วนที่เหลือของวงจรภายใน

ขอแนะนำให้ออกคำสั่งรีเซ็ตการโทรทั่วไปหรือคำสั่งล็อคการโทรทั่วไปหนึ่งครั้งหลังจากอุปกรณ์เปิดใช้ เพื่อให้แน่ใจว่าอุปกรณ์จะอ่านหมุดที่อยู่ในสภาพที่มั่นคงและหลีกเลี่ยงการล็อคบิตที่อยู่ในขณะที่แหล่งจ่ายไฟกำลังพุ่งขึ้น นี่อาจทำให้การตรวจหาพินที่อยู่ไม่ถูกต้อง

ฉันขอแนะนำให้คุณทำตามคำแนะนำนี้เพื่อให้แน่ใจว่าคุณกำลังสื่อสารกับอุปกรณ์จริงๆ

หากต้องการอ่านช่องทางเฉพาะคุณต้องเลือกช่องในการกำหนดค่าการลงทะเบียนและเริ่มการแปลง RDY บิตจะลดลงเมื่อผลลัพธ์ของการแปลงนั้นมีอยู่ในเอาต์พุตรีจิสเตอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.