Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 30.03.2018
Сообщений: 24

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

02.07.2018, 11:07. Показов 4262. Ответов 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
Эксперт по электронике
7145 / 3324 / 342
Регистрация: 28.10.2011
Сообщений: 13,115
Записей в блоге: 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
Эксперт по электронике
7145 / 3324 / 342
Регистрация: 28.10.2011
Сообщений: 13,115
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru