AVR УРОК 39. Акселерометр LSM6DS3. Часть 3



 

    Урок 39

Часть 3

 

    Акселерометр LSM6DS3

 

Продолжаем работать с подключением акселерометра.

В прошлой части занятия мы уже написали некоторый код и считали идентификатор датчика, что даёт нам основание считать, что шину мы настроили правильно, и что мы общаемся именно с тем датчиком.

Сегодня мы продолжим писать код инициализаци.

Теперь начнем инициализировать регистры. Здесь нам уже придётся писать в шину I2C.

Но и здесь, зная, как работает шина, мы без труда напишем функцию для записи значения в регистр. Тем более, нам писать придется всегда только по одному байту

 

//———————————————

static void I2Cx_WriteData(unsigned char Addr, unsigned char Reg, unsigned char Value)

{

  I2C_StartCondition();// Отправим условие START

  I2C_SendByte(Addr);

  I2C_SendByte(Reg);

  I2C_SendByte(Value);

  I2C_StopCondition();// Отправим условие STOP

}

//———————————————

unsigned char Accel_ReadID(void)

 

Добавим функцию для инициализации регистров

 

//———————————————

void AccInit(void)

{

}

//———————————————

void Accel_Ini(void)

 

Вызовем её в главной функции инициализации

 

  if(read_buf[0]!=0x69) Error();

  AccInit();

}

 

Начнем писать тело функии инициализации регистров, используя функции чтения и записи шины I2C и видоизменяя определённые регистры датчика таким же образом, как мы делали и в уроке по контроллеру STM

 

void AccInit(void)

{

  //автоувеличение адреса регистра

  I2Cx_ReadData(0xD4,LSM6DS3_ACC_GYRO_CTRL3_C,1,read_buf);

  read_buf[0]&=~LSM6DS3_ACC_GYRO_IF_INC_MASK;

  read_buf[0]|=LSM6DS3_ACC_GYRO_IF_INC_ENABLED;

  I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL3_C,read_buf[0]);

 

Данным кодом мы обращаемся к управляющему регистру 3 и включаем там бит автоувеличения адреса регистра

 

image06

image07

 

 

Продолжим дальше работать с регистрами управления

 

I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL3_C,read_buf[0]);

//установим бит BDU

I2Cx_ReadData(0xD4,LSM6DS3_ACC_GYRO_CTRL3_C,1,read_buf);

read_buf[0]&=~LSM6DS3_ACC_GYRO_BDU_MASK;

read_buf[0]|=LSM6DS3_ACC_GYRO_BDU_BLOCK_UPDATE;

I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL3_C,read_buf[0]);

 

Здесь мы включаем бит BDU, о назначении которого мы уже хорошо знаем из занятий по подобным датчикам с контроллером STM . Регистр используем тот же, бит включаем шестой

 

image10

 

Идем дальше по регистрам

 

I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL3_C,read_buf[0]);

//выбор режима FIFO

I2Cx_ReadData(0xD4,LSM6DS3_ACC_GYRO_FIFO_CTRL5,1,read_buf);

read_buf[0]&=~LSM6DS3_ACC_GYRO_FIFO_MODE_MASK;

read_buf[0]|=LSM6DS3_ACC_GYRO_FIFO_MODE_BYPASS;

I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_FIFO_CTRL5,read_buf[0]);

 

В данном коде мы выбираем режим ввода-вывода, работая уже с пятым регистром управления FIFO (Для FIFO существуют отдельные регистры). Режим мы установи без изменения (bypass)

 

image08 image09

 

 

Продолжаем писать код настройки регистров управления

 

I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_FIFO_CTRL5,read_buf[0]);

//пока выключим датчик (ODR_XL = 0000)

I2Cx_ReadData(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,1,read_buf);

read_buf[0]&=~LSM6DS3_ACC_GYRO_ODR_XL_MASK;

read_buf[0]|=LSM6DS3_ACC_GYRO_ODR_XL_POWER_DOWN;

I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,read_buf[0]);

 

Ну тут всё также как и в уроках по STM. Пока отключим датчик. Используем первый управляющий регистр

 

image11 image12

 

Дальше будет следующий код:

 

I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,read_buf[0]);

//Full scale selection 2G

I2Cx_ReadData(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,1,read_buf);

read_buf[0]&=~LSM6DS3_ACC_GYRO_FS_XL_MASK;

read_buf[0]|=LSM6DS3_ACC_GYRO_FS_XL_2g;

I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,read_buf[0]);

 

Тут понятно. Включаем амплитуду измерения 2G. Регистр тот же.

 

image13

 

Пишем дальше:

 

I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,read_buf[0]);

//Включим оси

I2Cx_ReadData(0xD4,LSM6DS3_ACC_GYRO_CTRL9_XL,1,read_buf);

read_buf[0]&=~(LSM6DS3_ACC_GYRO_XEN_XL_MASK|LSM6DS3_ACC_GYRO_YEN_XL_MASK|LSM6DS3_ACC_GYRO_ZEN_XL_MASK);

read_buf[0]|=(LSM6DS3_ACC_GYRO_XEN_XL_ENABLED|LSM6DS3_ACC_GYRO_YEN_XL_ENABLED|LSM6DS3_ACC_GYRO_ZEN_XL_ENABLED);

I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL9_XL,read_buf[0]);

 

Здесь мы уже включаем оси (с каких осей будут сниматься данные). Используем все три оси – X,Y и Z. Регистр используем девятый

 

image14 image15

 

Пишем дальше код функции

 

  I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL9_XL,read_buf[0]);

  //Включим Data Rate 104 Гц

  I2Cx_ReadData(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,1,read_buf);

  read_buf[0]&=~LSM6DS3_ACC_GYRO_ODR_XL_MASK;

  read_buf[0]|=LSM6DS3_ACC_GYRO_ODR_XL_104Hz;

  I2Cx_WriteData(0xD4,LSM6DS3_ACC_GYRO_CTRL1_XL,read_buf[0]);

}

 

По закрывающей фигурной скобки мы видим, что это окончание функции и также окончание инициализации акселерометра. Здесь мы, конечно, должны включить наш датчик. Частоту снятия данных будем использовать 104 кГц. Регистр первый. Мы его уже использовали выше

 

image16

 

Мы настроили все регистры, на этом, в принципе, инициализация закончена.

В следующей части занятия мы попробуем считать показания с датчика и как-то их отмониторить, так сказать, отобразить.

 

 

Предыдущая часть Программирование МК AVR Следующая часть

 

Техническая документация:

Документация на датчик

Документация на оценочную плату

 

 

Приобрести плату Atmega 328p Pro Mini можно здесь.

Программатор (продавец надёжный) USBASP USBISP 2.0

Приобрести платы с датчиком LSM6DS3 можно у следующих продавцов:

Надёжный продавец LSM6DS33 STEVAL-MKI160V1

Здесь дешевле LSM6DS33 STEVAL-MKI160V1

Здесь другая плата, намного дешевле, но от другого разработчика LSM6DS33

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR Акселерометр LSM6DS3

4 комментария на “AVR УРОК 39. Акселерометр LSM6DS3. Часть 3
  1. Михаил:

    не смог зайти на форрум,поэтому пишу здесь.Помогите очень нужна помощь по подключению датчика влажности DHT21 онже AM2301 к AVR atmega 8 на с+ буду признателен за помощ или видео урок ….

  2. Михаил:

    к сожалению юто совершенно другой датчик DS3231 работает по шине I2C. а датчик DHT21 или AM2301 по шине SPI.. Вопрос открыт, спасибо что откликнулись..

  3. Михаил:

    здраствуйте участники форрума всёещё не могу решить задачю с подключением DHT21 онже AM2301 ВЫРУЧАЙТЕ!!!

    или подскажите где посмотреть , куда обратиться.!!!!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*