0 / 0 / 0
Регистрация: 30.03.2018
Сообщений: 24

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

02.07.2018, 11:07. Показов 4316. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте !
Подскажите пожалуйста:
Необходимо считывать значения с акселерометра (значением по трем координатам от времени) посредством МК и как-то их визуализировать.
Подскажите пожалуйста в каком направлении думать или что почитать по этой теме?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.07.2018, 11:07
Ответы с готовыми решениями:

Подключение датчика к микроконтроллеру
При проектировании устройства столкнул с проблемой: путаюсь в линях передачи. Подскажите, как правильно всё соединить. Проектируется...

Подключение микросхемы к микроконтроллеру
Подскажите как подключить 9 осевой датчик к микроконтроллеру типа AVR?

Подключение светодиода к микроконтроллеру
Подключить светодиод к микроконтроллеру K1986VE92QI

33
0 / 0 / 0
Регистрация: 30.03.2018
Сообщений: 24
02.07.2018, 16:16  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Витальич Посмотреть сообщение
CMSIS - самый низкий уровень, есть только файлы определение мнемонического названия регистров (путь Джедая)
SPL - уровень абстракции выше, но по ряду причин больше не поддерживается производителем (путь Идиота)
HAL - самый высокий уровень абстракций, но память код съедает со страшной скоростью (путь кому сделать По быстрому и есть ресурсы)
Очень увлекательно, но пока остановился на МК и среде разработки...дальше ничего не понял)
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
02.07.2018, 16:43
И почему на статью ссылка не отображается?
0
02.07.2018, 16:51

Не по теме:

Потому что там говноадмин и несколько таких же модеров... :-!

0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
02.07.2018, 17:21
Лучший ответ Сообщение было отмечено 1ceberg как решение

Решение

1ceberg, делал оцифровку датчика LSM303 который стоит на плате F3DISCOVERY, правда я цифровал его с камня stm32f107vc по I2C.
инициализация I2C
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void Orient_Init()
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
    Delay_ms(10);   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 
    
    GPIO_InitTypeDef pins;
    
    pins.GPIO_Pin = ORIENT_SDA_PIN | ORIENT_SCL_PIN;
    pins.GPIO_Speed = GPIO_Speed_2MHz;
    pins.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_Init(ORIENT_I2C_PORT, &pins);  
    
    I2C_SoftwareResetCmd(ORIENT_I2C, ENABLE);
    Delay_ms(10);
    I2C_SoftwareResetCmd(ORIENT_I2C, DISABLE);   
    Delay_ms(10);
    
    I2C_InitTypeDef orient;
    
    orient.I2C_Mode = I2C_Mode_I2C;
    orient.I2C_ClockSpeed = 100000;
    orient.I2C_DutyCycle = I2C_DutyCycle_2;
    orient.I2C_OwnAddress1 = 0x01;
    orient.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    orient.I2C_Ack = I2C_Ack_Enable;
 
    I2C_Init(ORIENT_I2C, &orient);
    I2C_Cmd(ORIENT_I2C, ENABLE);     
    Delay_ms(100);
    LSM303_Init(LSM303_ADDR);
}


Функции передачи приема по I2C
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
void Orient_StartTransmission(unsigned char address, int direction)
 {
    I2C_AcknowledgeConfig(ORIENT_I2C, ENABLE); 
    while(I2C_GetFlagStatus(ORIENT_I2C, I2C_FLAG_BUSY));
    I2C_GenerateSTART(ORIENT_I2C, ENABLE);
    while(!I2C_CheckEvent(ORIENT_I2C, I2C_EVENT_MASTER_MODE_SELECT));
    if(direction == I2C_Direction_Receiver)
    {
        I2C_Send7bitAddress(ORIENT_I2C, address << 1, I2C_Direction_Receiver);
        while(!I2C_CheckEvent(ORIENT_I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    }
    else
    {
        I2C_Send7bitAddress(ORIENT_I2C, address << 1, I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(ORIENT_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    }
 }
 
 void Orient_SendByte(unsigned char data)
 {
    I2C_SendData(ORIENT_I2C, data);
    while(!I2C_CheckEvent(ORIENT_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 }
 
 unsigned char Orient_GetByte()
 {
     while(!I2C_CheckEvent(ORIENT_I2C, I2C_EVENT_MASTER_BYTE_RECEIVED));
     return I2C_ReceiveData(ORIENT_I2C);
 }
 
int LSM303_WriteByte(unsigned char HW_address, unsigned char address, unsigned char cmd)
{
     I2C_AcknowledgeConfig(ORIENT_I2C, ENABLE); 
     Orient_StartTransmission(HW_address, I2C_Direction_Transmitter);
     Orient_SendByte(address);
     Orient_SendByte(cmd);
     I2C_GenerateSTOP(ORIENT_I2C, ENABLE);
     return 1;
}    
unsigned char LSM303_ReadByte(unsigned char HW_address, unsigned char address)
{
    char data;
    I2C_AcknowledgeConfig(ORIENT_I2C, ENABLE);  
    Orient_StartTransmission(HW_address, I2C_Direction_Transmitter);
    I2C_GenerateSTOP(ORIENT_I2C, ENABLE);
    Orient_StartTransmission(HW_address, I2C_Direction_Receiver);    
    I2C_AcknowledgeConfig(ORIENT_I2C, DISABLE);
    data = Orient_GetByte();
    I2C_GenerateSTOP(ORIENT_I2C, ENABLE);
    return data;
}
int LSM303_ReadBurst(unsigned char HW_address, unsigned char address, int numbytes, Orient_Struct * Orient)
{
    I2C_AcknowledgeConfig(ORIENT_I2C, ENABLE); 
    Orient_StartTransmission(HW_address, I2C_Direction_Transmitter); 
    Orient_SendByte(address | (1 << 7));
    I2C_GenerateSTOP(ORIENT_I2C, ENABLE);
    Orient_StartTransmission(HW_address, I2C_Direction_Receiver); 
    for(int i = 0; i < numbytes - 1; i++)
        Orient->RawData[i] = Orient_GetByte();
    I2C_AcknowledgeConfig(ORIENT_I2C, DISABLE);  
    Orient->RawData[numbytes - 1] = Orient_GetByte();  
    I2C_GenerateSTOP(ORIENT_I2C, ENABLE);
    return 1;    
}


Инициализация датчика
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int LSM303_Init(unsigned char HW_address)
{
    unsigned char cmd = 0;
    if(!LSM303_WriteByte(HW_address, LSM303_INT_CTRL_M, cmd))
        return 0;    
    cmd = ((0x06 << 4) | 0x7);
    if(!LSM303_WriteByte(HW_address, LSM303_CTRL1, cmd))
        return 0;
    cmd = 0;
    cmd = (3 << 6);
    if(!LSM303_WriteByte(HW_address, LSM303_CTRL2, cmd))
        return 0;  
    cmd = 0;
    cmd = ((1 << 7) | (3 << 5) | (2 << 2));
    if(!LSM303_WriteByte(HW_address, LSM303_CTRL5, cmd))
        return 0;
    cmd = 0;
    if(!LSM303_WriteByte(HW_address, LSM303_CTRL6, cmd))
        return 0;   
    cmd = (1 << 6);
    if(!LSM303_WriteByte(HW_address, LSM303_CTRL7, cmd))
        return 0;   
    return 1;
}


Функция забора данных акселерометра
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int LSM303_GetA(unsigned char HW_address, Orient_Struct * Orient)
{
    Orient->Avalid = 0;
    if(LSM303_ReadBurst(HW_address, LSM303_OUT_X_L_A, 6, Orient) == 1)
    {
        Orient->RawAx = Orient->RawData[1] << 8 | Orient->RawData[0];
        Orient->RawAy = Orient->RawData[3] << 8 | Orient->RawData[2];
        Orient->RawAz = Orient->RawData[5] << 8 | Orient->RawData[4];        
        
        Orient->Ax = ((short)((Orient->RawData[1] << 8) | Orient->RawData[0]) * 0.000061) * 9.80065;
        Orient->Ay = ((short)((Orient->RawData[3] << 8) | Orient->RawData[2]) * 0.000061) * 9.80065;
        Orient->Az = ((short)((Orient->RawData[5] << 8) | Orient->RawData[4]) * 0.000061) * 9.80065;
        snprintf(Orient->formatA, 50, "Ax = %.4f \t Ay = %.4f \t Az = %.4f\r\n", Orient->Ax, Orient->Ay, Orient->Az);
        Orient->Avalid = 1;
        return Orient->Avalid;
    }
    else
        snprintf(Orient->formatA, 50, "Ax = -.---- \t Ay = -.---- \t Az = -.----\r\n");
        return 0;
}


Структура для данных
C
1
2
3
4
5
6
7
8
9
10
11
12
typedef struct
{
    char formatA[60];
    unsigned char RawData[6];
    float  Ax;
    float  Ay;
    float  Az;
    short RawAx;
    short RawAy;    
    short RawAz;  
    int Avalid;
}Orient_Struct;
дефайны
C
1
2
3
4
5
6
7
8
#define LSM303_WHO_AM_I    0x0F
#define LSM303_INT_CTRL_M  0x12
#define LSM303_CTRL1       0x20
#define LSM303_CTRL2       0x21
#define LSM303_CTRL5       0x24
#define LSM303_CTRL6       0x25
#define LSM303_CTRL7       0x26
#define LSM303_OUT_X_L_A   0x28
можешь покопаться, может чего поможет

Добавлено через 12 минут
Цитата Сообщение от Витальич Посмотреть сообщение
CMSIS - самый низкий уровень, есть только файлы определение мнемонического названия регистров (путь Джедая)
SPL - уровень абстракции выше, но по ряду причин больше не поддерживается производителем (путь Идиота)

Не по теме:

Вот сейчас немного обидно было :D Идиот на экскаваторе будет курить и пить пиво, смотря на копающего траншею джедая с лопатой ) С другой стороны в археологии лучше копать маленькой лопаткой чем рыть ковшом)



Добавлено через 3 минуты
Витальич, https://www.embitz.org/ вот на основе кодблокс иде. Дома пишу на нем, удобно и мало весит
2
02.07.2018, 17:33

Не по теме:

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

0
02.07.2018, 19:19

Не по теме:

Витальич, ага, я так же думал... Пока не довелось там пообщаться на неудобные темы.

А если серьёзно, то причина в SEO и конкуренции, полагаю.

0
Эксперт по электронике
7179 / 3355 / 346
Регистрация: 28.10.2011
Сообщений: 13,218
Записей в блоге: 7
02.07.2018, 21:50
Цитата Сообщение от Витальич Посмотреть сообщение
SPL - уровень абстракции выше, но по ряду причин больше не поддерживается производителем (путь Идиота)
Слишком громко сказано. Не смотря что библиотека не поддерживается, она по прежнему пригодна для практического использования.

Цитата Сообщение от Витальич Посмотреть сообщение
Подскажите ссылку на проект
https://www.embitz.org/
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
04.07.2018, 09:50
Цитата Сообщение от locm Посмотреть сообщение
Видел я какой код генерит куб.
А вы можете выложить дизасм примера кода вместе с исходником, типа файла lss?

Фишка в том, что HAL может быть сильно адапатирован к ассемблеру, и выглядеть жестоко в Сях. Притом, что будет проходить всякие lint и соответствовать другим более строгим чекерам, а главное - быть очень емким в ассемблере. [это только предположение].
0
Эксперт по электронике
7179 / 3355 / 346
Регистрация: 28.10.2011
Сообщений: 13,218
Записей в блоге: 7
04.07.2018, 10:57
Мне достаточно посмотреть какой объем флеша занимает проект на HAL по сравнению с аналогичным проектом на SPL или непосредственной работой с регистрами чтобы с уверенностью сказать что вы не правы. Это же подтверждает код, в котором много абстракций с интенсивным использованием ОЗУ.
0
0 / 0 / 0
Регистрация: 30.03.2018
Сообщений: 24
04.07.2018, 11:15  [ТС]
В общем купил плату F3DISCOVERY, но теперь понял, что разобраться в подключении акселерометра и гироскопа вызывает у меня затруднение...Может кто-нибудь помочь разобраться пожалуйста? Я не прошу за себя сделать проект, прошу лишь помощи, что необходимо прочитать и понять...Еще проблема с даташитом, не совсем хорошо понимаю, что там написано(языковой барьер)...
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
04.07.2018, 11:24
https://microtechnics.ru/start-s-stm32f3discovery/
Обратите внимание в конце раздел "Похожие статьи"
0
0 / 0 / 0
Регистрация: 30.03.2018
Сообщений: 24
13.07.2018, 13:10  [ТС]
Пожалуйста, помогите найти пример или есть есть пример работы акселерометра на плате stm32f3discovery, но без генерации Кубом и использовании HAL скиньте пожалуйста, буду благодарен.
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
13.07.2018, 13:32
1ceberg, скачиваешь с сайта ST примеры.
Примеры
Там есть демонстрационный проект. Открываешь его. Там как раз работа с акселерометром и гироскопом. Файлы
stm32f3_discovery_l3gd20.c и stm32f3_discovery_lsm303dlhc.c тебе в помощь
0
0 / 0 / 0
Регистрация: 23.06.2018
Сообщений: 12
19.08.2018, 15:03
Если автору ещё интересно, могу предложить вариант GY-951, он идёт со своим МК, который выдаёт данные на юарт.
Если нужно могу дать парсер, писал сам, так что может не самый оптимальный, но рабочий. Частота обновления GY-951 50Гц, но можно его переключить в выдачу одиночных измерений.
Естественно логику каллибровки и математики фильтрации нужно писать свою. Так же имеется датчик магнитного поля, который в полной мере позволит использовать алгоритм маджвика и полностью забыть все слова связанные с кальманом, комплементарным фильтром и всякими там скользящими.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.08.2018, 15:03

Подключение термопары к микроконтроллеру
Нужно подключить термопару ТХА к микроконтроллеру для измерения температуры в диапазоне 500..1000 градусов. Понятно, что для этого...

Подключение датчиков к микроконтроллеру STM32
Добрых времени суток, недавно начал изучать микроконтроллер STM32. Уже собрал контроллер в виде схемы, но не могу понять пару моментов а...

Подключение 62256 памяти к микроконтроллеру
Имеется микросхема памяти UT62256CPCL-70LL. Не понятно, как у нее нужно указывать адрес ячейки памяти. Кусок из инструкции: ...

Подключение цифрового индикатора к микроконтроллеру
Доброго времени суток. Подскажите как на схеме подключить цифровой индикатор к микроконтроллеру? Суть в том что, у меня есть количество...

Подключение драйвера шагового двигателя к микроконтроллеру
Разрабатывается принципиальная электрическая схема шагового двигателя. Необходимо подключить драйвер шагового двигателя серии DRV8955PPWPR...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru