Урок 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 и включаем там бит автоувеличения адреса регистра
Продолжим дальше работать с регистрами управления
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 . Регистр используем тот же, бит включаем шестой
Идем дальше по регистрам
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)
Продолжаем писать код настройки регистров управления
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. Пока отключим датчик. Используем первый управляющий регистр
Дальше будет следующий код:
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. Регистр тот же.
Пишем дальше:
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. Регистр используем девятый
Пишем дальше код функции
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 кГц. Регистр первый. Мы его уже использовали выше
Мы настроили все регистры, на этом, в принципе, инициализация закончена.
В следующей части занятия мы попробуем считать показания с датчика и как-то их отмониторить, так сказать, отобразить.
Предыдущая часть Программирование МК AVR Следующая часть
Техническая документация:
Документация на оценочную плату
Приобрести плату Atmega 328p Pro Mini можно здесь.
Программатор (продавец надёжный) USBASP USBISP 2.0
Приобрести платы с датчиком LSM6DS3 можно у следующих продавцов:
Надёжный продавец LSM6DS33 STEVAL-MKI160V1
Здесь дешевле LSM6DS33 STEVAL-MKI160V1
Здесь другая плата, намного дешевле, но от другого разработчика LSM6DS33
Смотреть ВИДЕОУРОК (нажмите на картинку)
не смог зайти на форрум,поэтому пишу здесь.Помогите очень нужна помощь по подключению датчика влажности DHT21 онже AM2301 к AVR atmega 8 на с+ буду признателен за помощ или видео урок ….
Есть видеоурок по данному датчику на stm
к сожалению юто совершенно другой датчик DS3231 работает по шине I2C. а датчик DHT21 или AM2301 по шине SPI.. Вопрос открыт, спасибо что откликнулись..
здраствуйте участники форрума всёещё не могу решить задачю с подключением DHT21 онже AM2301 ВЫРУЧАЙТЕ!!!
или подскажите где посмотреть , куда обратиться.!!!!