Формирование необработанных данных АЦП - PullRequest
2 голосов
/ 20 апреля 2019

Я хотел бы попросить вас объяснить эту часть моего кода.Я не уверен, что это действительно делает.Это пример кода, и я хотел бы понять это.Целью оригинального кода должно быть получение данных от АЦП в потоковом режиме.Это должно быть о формировании необработанных данных.Спасибо.

#define CH_DATA_SIZE 6
uint8_t read_buf[CH_DATA_SIZE];
uint32_t adc_data;

TI_ADS1293_SPIStreamReadReg(read_buf, count);                            

adc_data = ((uint32_t) read_buf[0] << 16) | ((uint16_t) read_buf[1] << 8) 
| read_buf[2];

1 Ответ

1 голос
/ 20 апреля 2019

Я пропущу объявление переменной, потому что я буду ссылаться на него в остальной части описания.

Код начинается с этой строки:

TI_ADS1293_SPIStreamReadReg(read_buf, count);

В поиске Google я предполагаю, что у вас есть эта функция из этого файла . Если это именно эта функция, она будет читать три регистра из этого модуля (см. 8.6 Карты регистров , регистры данных DATA_CHx_ECG имеют длину три байта, что должно быть в переменной count).

После выполнения этой функции у вас есть данные ЭКГ в первых трех байтах переменной read_buf, но вам нужно 24-битное значение, так как квантифицированное значение является 24-битным значением.

Поскольку у нас нет uint24_t в C (и нет другого языка, о котором я знаю), мы берем следующий возможный размер, который равен uint32_t, чтобы объявить переменную adc_data.

Теперь следующий код перестраивает одно 24-битное значение из 3 байтов, которые мы читаем из АЦП:

adc_data = ((uint32_t) read_buf[0] << 16) | ((uint16_t) read_buf[1] << 8) 
| read_buf[2];

Из таблицы данных и TI_ADS1293_SPIStreamReadReg мы знаем, что функция считывает значения в том порядке, в котором их адреса поступают, в данном случае старшие байты, средние байты и младшие байты в этом порядке (соответственно в read_but[0], read_buf[1] и read_buf[2]).

Чтобы восстановить 24-битное значение, код сдвигает значение с соответствующим смещением: read_buf[0] идет от битов 23 к 16, таким образом сдвинуты 16 битов, read_buf[1] от битов 15 к 8, таким образом сдвинуты 8 битов и read_buf[2] от 7 до 0, таким образом, смещено 0 бит (это смещение не представлено). Мы представим их как таковые (0xAA, 0xBB и 0xCC являются примерами значений, чтобы показать, что происходит):

read_buf[0] = 0xAA => read_buf[0] << 16 = 0xAA0000
read_buf[1] = 0xBB => read_buf[0] << 8  = 0x00BB00
read_buf[2] = 0xCC => read_buf[0] << 0  = 0x0000CC

Чтобы объединить три сдвинутых значения, код использует побитовый или |, что приводит к следующему:

0xAA0000 | 0x00BB00 | 0x0000CC = 0xAABBCC

И теперь у вас есть 24-битное значение вашего АЦП.

...