Я запрашиваю МЭМС-акселерометр ADXL362 с цифровым выходом для его данных оси, которые он хранит как два 8-битных регистра, которые объединяются, чтобы дать 12-битное значение, и я пытаюсь выяснить, как объединить эти значения. Я никогда не был хорош в побитовых манипуляциях, поэтому любая помощь будет принята с благодарностью. Я бы предположил, что это примерно так:
number = Z_data_H << 8 | Z_data_L;
number = (number & ~(1<<13)) | (0<<13);
number = (number & ~(1<<14)) | (0<<14);
number = (number & ~(1<<15)) | (0<<15);
number = (number & ~(1<<16)) | (0<<16);
Лист данных ADXL362 (стр. 26)
Регистр данных оси Z
Вам просто нужно сделать:
signed short number;
number = Z_data_H << 8 | Z_data_L;
Сдвиг влево на 8 бит в сочетании с более низкими битами, которые вы уже понял, правильно комбинирует 2 байта. Просто используйте соответствующий размер данных, чтобы код C правильно распознал знак 12-битного числа.
Обратите внимание, что short
не обязательно относится к 16-битному значению, в зависимости от вашего компилятора и архитектуры, поэтому вы можете попробовать это.
В первой строке должно быть то, что вам нужно:
int16_t number;
number = (Z_data_H << 8) | Z_data_L;
Биты расширения знака означают, что вы можете читать значение, как если бы оно было 16-битным целым числом со знаком. значение просто никогда не будет выходить за пределы диапазона 12-битного целого числа. Важно оставить эти биты нетронутыми, чтобы правильно обрабатывать отрицательные значения.
Вашей первой строки должно быть достаточно - из раздела "Регистр данных оси Z", Биты расширения знака (B [15:12], обозначенные как SX в битовой карте ZDATA_H, которая следует ниже) имеют то же значение, что и MSB (B11).