เกี่ยวกับคำถามนี้
ฉันไม่มีพื้นฐานด้านวิศวกรรมอิเล็กทรอนิกส์และนี่เป็นหนึ่งในความท้าทายครั้งแรกของฉันในการสื่อสารผ่าน 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 ทั้งหมดแบบขนานแล้วอ่านจากพวกเขาโดยไม่รบกวน