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

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

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

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

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

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

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

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

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

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

Не по теме:

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

0
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
02.07.2018, 17:21 24
Лучший ответ Сообщение было отмечено 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
  #25

Не по теме:

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

0
Rius
02.07.2018, 19:19
  #26

Не по теме:

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

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

0
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
02.07.2018, 21:50 27
Цитата Сообщение от Витальич Посмотреть сообщение
SPL - уровень абстракции выше, но по ряду причин больше не поддерживается производителем (путь Идиота)
Слишком громко сказано. Не смотря что библиотека не поддерживается, она по прежнему пригодна для практического использования.

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

Фишка в том, что HAL может быть сильно адапатирован к ассемблеру, и выглядеть жестоко в Сях. Притом, что будет проходить всякие lint и соответствовать другим более строгим чекерам, а главное - быть очень емким в ассемблере. [это только предположение].
0
4393 / 2243 / 252
Регистрация: 28.10.2011
Сообщений: 8,574
Записей в блоге: 6
04.07.2018, 10:57 29
Мне достаточно посмотреть какой объем флеша занимает проект на HAL по сравнению с аналогичным проектом на SPL или непосредственной работой с регистрами чтобы с уверенностью сказать что вы не правы. Это же подтверждает код, в котором много абстракций с интенсивным использованием ОЗУ.
0
0 / 0 / 0
Регистрация: 30.03.2018
Сообщений: 24
04.07.2018, 11:15  [ТС] 30
В общем купил плату F3DISCOVERY, но теперь понял, что разобраться в подключении акселерометра и гироскопа вызывает у меня затруднение...Может кто-нибудь помочь разобраться пожалуйста? Я не прошу за себя сделать проект, прошу лишь помощи, что необходимо прочитать и понять...Еще проблема с даташитом, не совсем хорошо понимаю, что там написано(языковой барьер)...
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
04.07.2018, 11:24 31
https://microtechnics.ru/start-s-stm32f3discovery/
Обратите внимание в конце раздел "Похожие статьи"
0
0 / 0 / 0
Регистрация: 30.03.2018
Сообщений: 24
13.07.2018, 13:10  [ТС] 32
Пожалуйста, помогите найти пример или есть есть пример работы акселерометра на плате stm32f3discovery, но без генерации Кубом и использовании HAL скиньте пожалуйста, буду благодарен.
0
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
13.07.2018, 13:32 33
1ceberg, скачиваешь с сайта ST примеры.
Примеры
Там есть демонстрационный проект. Открываешь его. Там как раз работа с акселерометром и гироскопом. Файлы
stm32f3_discovery_l3gd20.c и stm32f3_discovery_lsm303dlhc.c тебе в помощь
0
0 / 0 / 0
Регистрация: 23.06.2018
Сообщений: 12
19.08.2018, 15:03 34
Если автору ещё интересно, могу предложить вариант GY-951, он идёт со своим МК, который выдаёт данные на юарт.
Если нужно могу дать парсер, писал сам, так что может не самый оптимальный, но рабочий. Частота обновления GY-951 50Гц, но можно его переключить в выдачу одиночных измерений.
Естественно логику каллибровки и математики фильтрации нужно писать свою. Так же имеется датчик магнитного поля, который в полной мере позволит использовать алгоритм маджвика и полностью забыть все слова связанные с кальманом, комплементарным фильтром и всякими там скользящими.
0
19.08.2018, 15:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.08.2018, 15:03
Помогаю со студенческими работами здесь

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

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

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

Подключение LCD LTS220Q1-HE1 к микроконтроллеру
Вновь я с нестандартной штуковиной, LTS220Q1-HE1. Это TFT-LCD дисплей от самсунг с разрешением...

Подключение светодиода обоими выводами к микроконтроллеру
Подключение светодиода обоими выводами к микроконтроллеру возможно?? просто видел схему и код где...

Подключение сервопривода к микроконтроллеру с помощью Timer2
Всем доброго времени суток) не знаю,возможно вопрос уже поднимался но я не нашел,но если что...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru