نحوه دریافت دیتای بیش از ۱۰ بیت توسط واحد adc-نحوه دریافت کلی دیتای چند ده بیتی و تفکیک هر بیت

مهندس معین عزیز در صورتی که در آردوینو بخوابم دیتای ۱۸ بیتی دریافت کنیم میشه لطفاً ایده بدید برای دریافت دیتای ۱۸ بیتی.حالا مهندس این کد برای دیتای ۱۲ بیتی هست میشه لطفاً درباره تابع shiftin توضیحی بدید و اینکه کمی درباره این کد توضیح بدید ممنون میشم
و اینکه واحد adc برای دریافت مثلاً ۱۸ بیت چطور باید رفتار کند

مهندس کیفیت تصویر رو خود سیستم نمانک به شدت پایین آورده من براتون اینجا ارسال میکنم

const int CLOCK_PIN = 5;
const int DATA_PIN = 6;
const int BIT_COUNT = 25;

void setup() {
//setup our pins
pinMode(DATA_PIN, INPUT);
pinMode(CLOCK_PIN, OUTPUT);

//give some default values
digitalWrite(CLOCK_PIN, HIGH);

Serial.begin(9600);
}

void loop() {
unsigned long reading = readPosition();

Serial.print("Reading: ");
Serial.print(reading, DEC);

delay(1000);
}

//read the current angular position
int readPosition() {
// Read the same position data twice to check for errors
unsigned long sample1 = shiftIn(DATA_PIN, CLOCK_PIN, BIT_COUNT);
unsigned long sample2 = shiftIn(DATA_PIN, CLOCK_PIN, BIT_COUNT);

delayMicroseconds(25); // Clock mus be high for 20 microseconds before a new sample can be taken

if (sample1 != sample2) {
Serial.print(“Samples dont match: sample1=”);
Serial.print(sample1);
Serial.print(“, sample2=”);
Serial.println(sample2);
}

return sample1;
}

//read in a byte of data from the digital input of the board.
unsigned long shiftIn(const int data_pin, const int clock_pin, const int bit_count) {
unsigned long data = 0;

for (int i=0; i<bit_count; i++) {
data <<= 1;
digitalWrite(clock_pin, LOW);
delayMicroseconds(1);
digitalWrite(clock_pin, HIGH);
delayMicroseconds(1);

data |= digitalRead(data_pin);

}

return data;
}

سلام دوست عزیز، متوجه منظورتون از دریافت ۱۰ بیت توسط adc نشدم. واحد adc مبدل آنالوگ به دیجیتال هست که ورودیش یک سیگنال آنالوگ هست و بیت در اون مفهومی نداره. بیت اما در خروجی واحد adc بعد از تبدیل به دیجیتال مفهوم داره ولی توسط خود میکرو مدیریت میشه و نیازی به اینکه شما دستی بیت ها رو دریافت کنید نیست.
اما در مورد کد، به نظر میاد که این کد برای یک انکودر موتور نوشته شده که بتونه موقعیت موتور رو تشخیص بده. به نظر میاد که نوع ارتباط به صورتی هست که میکرو یک پالس ارسال میکنه روی clock_pin و بعد انکودر یک بیت داده رو روی data_pin قرار میده. تابع shiftIn درواقع داره به تعداد بیت ها یک لوپ ایجاد میکنه که در هر اجرا، ابتدا یک سیگنال پالسی تولید میکنه که به انکودر بگه آماده دریافت بیت بعدی هست. بعد با digitalRead مقدار ۰ یا ۱ اون بیت رو میخونه و داخل data میگذاره. دلیل اینکه data داره با این مقدار or میشه این هست که به بیت های دیگر data دست نخوره و فقط بیت اول تغییر کنه. علت اینکه data رو اول حلقه به سمت چپ شیف میدیم هم این هست که هر بیت که خونده شد، بره سمت چپ یدونه که جا برای بیت بعدی خالی بشه. این به این معنی هست که بیت ها از پر ارزش به کم ارزش دارن ارسال میشن.