LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Кстати, всё не совсем гладко, хотя дело уже не в инициализированных переменных. I2C как-то медленно работает. Ну... Сейчас опрос MPU6050 занимает 13 миллисекунд, в моей программе на AVR на это уходило менее 1.5 мс, хотя там МК был слабее (8-битный на 16 МГц, а тут 16-битный на 20 МГц) и не было никакой асинхронности.

Вот такой у меня код:

const uint8_t mpu6050_request[1] = {MPU6050_RA_ACCEL_XOUT_H};
int16_t mpu6050_response[3 + 3 + 1];

void mpu6050_poll() {
	accel_x = ((int16_t)BYTE_SWAP(mpu6050_response[0])) / 8192.0;
	accel_y = ((int16_t)BYTE_SWAP(mpu6050_response[1])) / 8192.0;
	accel_z = ((int16_t)BYTE_SWAP(mpu6050_response[2])) / 8192.0;
	temperature = ((int16_t)BYTE_SWAP(mpu6050_response[3])) / 340.0 + 36.53;
	gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) / 32.768 * M_PI / 180.0;
	gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) / 32.768 * M_PI / 180.0;
	gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) / 32.768 * M_PI / 180.0;
	i2c_request(MPU6050_ADDR, (uint8_t*)mpu6050_request, sizeof(mpu6050_request), (uint8_t*)(mpu6050_response), sizeof(mpu6050_response), 0);
}

Как можно заметить, я указываю параметр wait = 0 при вызове i2c_request. Это значит, что функция не будет ждать завершения передачи данных, а пойдёт дальше. После опроса датчиков у меня идёт работа с UART, которая занимает где-то 1 миллисекунду. За это время датчики должны успеть опроситься, но это не так, потому что mpu6050_poll выполняется очень долго (значит, i2c_request ждёт освобождения шины перед новым запросом). Дело не в математике - если убрать вызов i2c_request, то функция выполняется менее чем за 1 миллисекунду. Вероятно, я что-то криво настроил.

Исходники моей библиотеки работы с I2C есть в первом посте.

Исправление KivApple, :

Кстати, всё не совсем гладко, хотя дело уже не в инициализированных переменных. I2C как-то медленно работает. Ну... Сейчас опрос MPU6050 занимает 13 миллисекунд, в моей программе на AVR на это уходило менее 1.5 мс, хотя там МК был слабее (8-битный на 16 МГц, а тут 16-битный на 20 МГц) и не было никакой асинхронности.

Вот такой у меня код:

const uint8_t mpu6050_request[1] = {MPU6050_RA_ACCEL_XOUT_H};
int16_t mpu6050_response[3 + 3 + 1];

void mpu6050_poll() {
	accel_x = ((int16_t)BYTE_SWAP(mpu6050_response[0])) / 8192.0;
	accel_y = ((int16_t)BYTE_SWAP(mpu6050_response[1])) / 8192.0;
	accel_z = ((int16_t)BYTE_SWAP(mpu6050_response[2])) / 8192.0;
	temperature = ((int16_t)BYTE_SWAP(mpu6050_response[3])) / 340.0 + 36.53;
	gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) / 32.768 * M_PI / 180.0;
	gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) / 32.768 * M_PI / 180.0;
	gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) / 32.768 * M_PI / 180.0;
	i2c_request(MPU6050_ADDR, (uint8_t*)mpu6050_request, sizeof(mpu6050_request), (uint8_t*)(mpu6050_response), sizeof(mpu6050_response), 0);
}

Как можно заметить, я указываю параметр wait = 0 при вызове i2c_request. Это значит, что функция не будет ждать завершения передачи данных, а пойдёт дальше. После опроса датчиков у меня идёт работа с UART, которая занимает где-то 1 миллисекунду. За это время датчики должны успеть опроситься, но это не так, потому что mpu6050_poll выполняется очень долго (значит, i2c_request ждёт освобождения шины перед новым запросом). Дело не в математике - если убрать вызов i2c_request, то функция выполняется менее чем за 1 миллисекунду. Вероятно, я что-то криво настроил.

Исходная версия KivApple, :

Кстати, всё не совсем гладко, хотя дело уже не в инициализированных переменных. I2C как-то медленно работает. Ну... Сейчас опрос MPU6050 занимает 13 миллисекунд, на в моей программе на AVR на это уходило менее 1.5 мс, хотя там МК был слабее (8-битный на 16 МГц, а тут 16-битный на 20 МГц) и не было никакой асинхронности.

Вот такой у меня код:

const uint8_t mpu6050_request[1] = {MPU6050_RA_ACCEL_XOUT_H};
int16_t mpu6050_response[3 + 3 + 1];

void mpu6050_poll() {
	accel_x = ((int16_t)BYTE_SWAP(mpu6050_response[0])) / 8192.0;
	accel_y = ((int16_t)BYTE_SWAP(mpu6050_response[1])) / 8192.0;
	accel_z = ((int16_t)BYTE_SWAP(mpu6050_response[2])) / 8192.0;
	temperature = ((int16_t)BYTE_SWAP(mpu6050_response[3])) / 340.0 + 36.53;
	gyro_x = ((int16_t)BYTE_SWAP(mpu6050_response[4])) / 32.768 * M_PI / 180.0;
	gyro_y = ((int16_t)BYTE_SWAP(mpu6050_response[5])) / 32.768 * M_PI / 180.0;
	gyro_z = ((int16_t)BYTE_SWAP(mpu6050_response[6])) / 32.768 * M_PI / 180.0;
	i2c_request(MPU6050_ADDR, (uint8_t*)mpu6050_request, sizeof(mpu6050_request), (uint8_t*)(mpu6050_response), sizeof(mpu6050_response), 0);
}

Как можно заметить, я указываю параметр wait = 0 при вызове i2c_request. Это значит, что функция не будет ждать завершения передачи данных, а пойдёт дальше. После опроса датчиков у меня идёт работа с UART, которая занимает где-то 1 миллисекунду. За это время датчики должны успеть опроситься, но это не так, потому что mpu6050_poll выполняется очень долго (значит, i2c_request ждёт освобождения шины перед новым запросом). Дело не в математике - если убрать вызов i2c_request, то функция выполняется менее чем за 1 миллисекунду. Вероятно, я что-то криво настроил.