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

 

 

 

 

    Урок 39

Часть 1

 

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

 

 

Сегодня мы продолжим знакомство, которое мы начали в уроке 38, с интересной отладочной платой, выполненной на базе микроконтроллера  Atmega 328p.

На прошлом занятии мы смогли подключить данную плату к программатору и использовать её как понтоправную отладочную плату для программирования в среде Atmel Studio.

Сегодня мы усложним свой проект и попробуем подключить к данной плате хороший акселерометр LSM6DS3, который также ещё является и гироскопом. Но мы пока будем работать с данным датчиком только как с акселерометром, а как с гироскопом мы попробуем поработать с ним возможно в последующих занятиях, либо вы сможете изучить этот вопрос самостоятельно, так как все тонкости подключения и общения с датчиком мы в данном занятии обязательно рассмотрим. С данным датчиком мы уже работали, подключая его к микроконтроллеру STM32F401 и у нас это успешно получилось. Поэтому обязательно данные уроки советую посмотреть для того, чтобы вам стала немного понятнее организации структуры данного датчика.

Тем не менее в этом уроке я характеристики данного датчика также приведу:

Диапазон показаний ±2g/±4g/±8g/±16g;

Чувствительность 0.061 – 0.49 mg/digit;

Отклонение от нуля ±40 mg.

Скорость считывания данных 12,5 Гц – 6,66 кГц.

С некоторыми остальными показателями, регистрами, значениями и другими тонкостями акселерометра мы познакомимся в ходе его программирования.

Проект мы также создадим для контроллера Atmega 328p и назовём его Accel_LSM6DS3.

Исходный код в main.c удалим полностью и скопируем готовый из проекта прошлого занятия LIGHTS.

Полностью уберём код из бесконечного цикла

 

while (1)

{

}

 

Создадим заголовочный файл main.h обычным образом и весь код с подклчением всех заголовочных файлов с добавлением ещё файлов, которые нам в последствии пригодятся, а также с объявлением частоты тактирования, из файла main.c перенесём в данный файл

 

#ifndef MAIN_H_

#define MAIN_H_

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

#define F_CPU 16000000L

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

#include <avr/io.h>

#include <avr/interrupt.h>

#include <util/delay.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <stdlib.h>

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

#endif /* MAIN_H_ */

 

Ну и, соответственно, подключим данный файл в файле main.c

 

#include "main.h"

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

int main(void)

 

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

Данный интерфейс в контроллере Atmega328 организован приблизительно таким же образом, как и в Atmega8, с некоторыми незначительными отличиями. Отличия касаются в наименованиях регистров в связи с тем, что в роли второго USART в Atmega328 может выступать интерфейс SPI.

Тем не менее для начала мы скопируем файлы usart.h и usart.с из проекта урока 14 под названием Test12.

Также не стоит забывать подключить файл usart.h в файле main.h

 

#include <stdlib.h>

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

#include "usart.h"

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

 

Теперь зайдём в файл usart.c и внесём там ряд изменений в свете требований МК Atmega328, иначе у нас при сборке возникнет масса ошибок. Все имена данных регистров имеются в технической документации

 

#include "usart.h"

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

void USART_Init( unsigned int ubrr)//Инициализация модуля USART

{

  //Зададим скорость работы USART

  UBRR0H = (unsigned char)(ubrr>>8);

  UBRR0L = (unsigned char)ubrr;

 

  UCSR0B=(1<<RXEN0)|( 1<<TXEN0); //Включаем прием и передачу по USART

  UCSR0B |= (1<<RXCIE0); //Разрешаем прерывание при передаче

  UCSR0A |= (1<<U2X0); // Удвоение частоты

  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);// ассинхронный режим (UMSEL=0), без контроля четности (UPM1=0 и UPM0=0),

  //1 стоп-бит (USBS=0), 8-бит посылка (UCSZ01=1 и UCSZ00=1)

}

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

void USART_Transmit( unsigned char data ) //Функция отправки данных

{

  while ( !(UCSR0A & (1<<UDRE0)) ); //Ожидание опустошения буфера приема

  UDR0 = data; //Начало передачи данных

}

 

Для частоты тактирования 16 МГц значение UBRR0 будет именно 16 при условии, что удвоение у нас также включено

 

image00

 

Также уберем инициализацию портов из функции main() и вызовем там функцию инициализации USART

 

int main(void)

{

  USART_Init (16); //115200

  while (1)

 

 

Теперь давайте запустим и настроим терминальную программу и проверим работоспособность нашего USART.

Для этого мы также скопируем код из Test12.c, касающийся передачи данных и вставим в main()

 

USART_Init (16); //115200

USART_Transmit('O');//Передаем при включении

USART_Transmit('k');//сообщение "Ok!", что свидетельствует

USART_Transmit('!');//о правильно работе программы

USART_Transmit(0x0d);//переход в начало строки

USART_Transmit(0x0a);//переход на новую строку

while (1)

 

Переходник USART подключим к следующим ножкам платы

 

image01

 

Данный датчик у меня находится на плате от STM STEVAL-MKI160V1. Данная плата предназначена в свою очередь для соединения и работы с оценочной платой X-NUCLEO-IKS01A1, которая нам будет уже не нужна. Также данный датчик можно найти и без платы, и будет это гораздо даже дешевле.

Так как у меня именно такая плата, то приведу её схему (нажмите на картинку для увеличения изображения)

 

image03_0500

 

В данной схеме уже распаяны соответствующие конденсаторы, необходимые для фильтрации различных помех. Также данная схема представлена без датчиков, с одними только разъёмами. У меня на такой плате установлен только один датчик, именно тот, который мы рассматриваем сегодня. Он на схеме можно сказать представлен в виде контактной площадки, находящейся на рисунке слева. На данной плате снизу распаяны две контактные площадки в виде штырьков с интервалом 2,54 мм, что позволяет воткнуть её в беспаечную макетную плату, что ми и сделаем. И посредством гибких проводов соединим с микроконтроллером.

Самое главное! Внимание! Данный датчик, как видно из его технической документации питается напряжением от 1,71 вольт до 3,6 вольт, но не как не от 5 вольт. Поэтому питать схему нужно напряжением не более 3,6 вольт. У меня в программаторе есть переключатель, который я перевёл в положение 3,3 вольта.

Подключается данный датчик двумя способами — посредством шины I2C и шины SPI. Мы будем пользоваться I2C, так как урок для STM был именно с применением данной шины, а следовательно, мне было легче писать сценарий для урока по AVR. Также в технической документации мы можем прочитать, какие ещё контакты кроме двух контактов шины I2C нужно ещё подсоединить. Получится примерно вот так:

 

image04_0500

 

Сборку проекта, тестирование и далнейшие действия продолжим в следующей части.

 

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

 

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

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

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

 

 

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

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

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

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

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

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

 

 

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

 

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

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

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

*