Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.81/26: Рейтинг темы: голосов - 26, средняя оценка - 4.81
Kopromysh
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 12
1

MPU-6050 и Atmega16

10.06.2016, 20:57. Просмотров 5083. Ответов 2
Метки нет (Все метки)

Здравствуйте уважаемые форумчане! Подключил я MPU-6050 к меге16 по шине y2s и вроде бы принимаю данные с акселерометра, гироскопа по трем осям x, y, z и даже температуру, но почему то эти данные меняются сами по себе хоть модуль и находится в покое, а датчик температуры показывает 39 градусов. В чем проблема подскажите!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2016, 20:57
Ответы с готовыми решениями:

Помогите с Atmega8 и MPU-6000
Помогите пожалуйста. Перерыл весь Инет, но не могу найти нормальную схему подключения MPU-6000 к...

FreeRTOS-MPU Академический интерес
Вопрос следующий на сайте FriiRTOS сказано что для ARM Sortix-M3 и ARM Sortix-M4 существует два...

ATMega16
Привет обитателям данного портала! Я имею микроконтроллер с ATMEGA 16. Также знаю язык C#, но увы я...

Atmega16
изучаю прерывания, помогите понять что значит в начале памяти программ и в области загрузчика? ...

Atmega16
помогите пожалуйста! есть микроконтроллер atmega16. через ассемблер на PORTC подаем комбинацию...

2
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
11.06.2016, 01:20 2
Что-то пошло не так. Вангую - в коде.
0
Kopromysh
0 / 0 / 0
Регистрация: 07.06.2016
Сообщений: 12
11.06.2016, 14:13 3
Вот пожалуйста мой код тут нет функций UART если надо скину
Код
#include "TWI.h"
#include "UART.h"
#include <util/delay.h>
#include <stdyo.h>

int main()
{
UART_init(bauddivider);// инициализация UART
I2C_init();// инициализация шины TWI

MPU_I2C_W(MPU_6050_ADDRESS_W,PWR_MGMT_1, 0x00);

DDRD = 1<<PD5|1<<PD4;
PORTD = 0<<PB5|0<<PB4;

for(;;)
{

PORTD = 1<<PD5;
_delay_ms(1000);
PORTD = 0<<PD5;

////////////////////////////читаем показания акселерометра X,Y,Z и передаем их по UART///////
UART_write("ACCEL_X,Y,Z:");
int ACCEL_XH = MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_XOUT_H, MPU_6050_ADDRESS_R);
int ACCEL_XL = MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_XOUT_L, MPU_6050_ADDRESS_R);
int ACCEL_X = ACCEL_XH<<8|ACCEL_XL;
UART_transiever_itoa(ACCEL_X);

UART_write(" ");
int ACCEL_YH = MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_YOUT_H, MPU_6050_ADDRESS_R);
int ACCEL_YL = MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_YOUT_L, MPU_6050_ADDRESS_R);
int ACCEL_Y = ACCEL_YH<<8|ACCEL_YL;
UART_transiever_itoa(ACCEL_Y);

UART_write(" ");
int ACCEL_ZH = MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_ZOUT_H, MPU_6050_ADDRESS_R);
int ACCEL_ZL = MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_ZOUT_L, MPU_6050_ADDRESS_R);
int ACCEL_Z = ACCEL_ZH<<8|ACCEL_ZL;
UART_transiever_itoa(ACCEL_Z);

/////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////читаем показания гироскропа X,Y,Z и передаем их по UART//////////
UART_write(" GYRO_X,Y,Z:");
int GYRO_XH = MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_XOUT_H, MPU_6050_ADDRESS_R);
int GYRO_XL = MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_XOUT_L, MPU_6050_ADDRESS_R);
int GYRO_X = GYRO_XH<<8|GYRO_XL;
UART_transiever_itoa(GYRO_X);

UART_write(" ");
int GYRO_YH = MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_YOUT_H, MPU_6050_ADDRESS_R);
int GYRO_YL = MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_YOUT_L, MPU_6050_ADDRESS_R);
int GYRO_Y = GYRO_YH<<8|GYRO_YL;
UART_transiever_itoa(GYRO_Y);

UART_write(" ");
int GYRO_ZH = MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_ZOUT_H, MPU_6050_ADDRESS_R);
int GYRO_ZL = MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_ZOUT_L, MPU_6050_ADDRESS_R);
int GYRO_Z = GYRO_ZH<<8|GYRO_ZL;
UART_transiever_itoa(GYRO_Z);

/////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////читаем показания термометра и передаем их по UART////////////////
UART_write(" TEMPERATUR:");
int TEMP_H = MPU_I2C_R(MPU_6050_ADDRESS_W,TEMP_OUT_H, MPU_6050_ADDRESS_R);
int TEMP_L = MPU_I2C_R(MPU_6050_ADDRESS_W,TEMP_OUT_L, MPU_6050_ADDRESS_R);
int TEMPERATUR = TEMP_H<<8|TEMP_L;
TEMPERATUR = TEMPERATUR/340+36;
UART_transiever_itoa(TEMPERATUR);
/////////////////////////////////////////////////////////////////////////////////////////////

UART_write("\r\n");

/////////////////////////////////////////////////////////////////////////////////////////////
PORTD = 1<<PD4;
_delay_ms(500);
PORTD = 0<<PD4;
_delay_ms(500);

}
return 0;
}

unsykned char MPU_I2C_R(unsykned char addrw,unsykned char ra, unsykned char addrr)
{
char data;
I2C_stort();//отправляем условие СТАРТ
I2C_tranciv_byte(addrw);//отправляем адрес модуля на запись
I2C_tranciv_byte(ra);//отправляем адрес регистра откуда будем читать данные
I2C_stort();//отправляем повторный СТАРТ
I2C_tranciv_byte(addrr);//отправляем адрес модуля на чтение
data = I2C_receiver_tost_byte();//читаем данные из регистра
I2C_stop();//отправляем условие СТОП
return data;
}

unsykned char MPU_I2C_W(unsykned char addrw,unsykned char ra, unsykned char data)
{
I2C_stort();//отправляем условие СТАРТ
I2C_tranciv_byte(addrw);//отправляем адрес модуля на запись
I2C_tranciv_byte(ra);//отправляем адрес регистра куда будем записывать данные
I2C_tranciv_byte(data);//записываем данные
I2C_stop();//отправляем условие СТОП
if((TWSR&0xF8)!=TW_MT_DATA_ACK)
{
return 0;
}
else
return 1;
}

int I2C_tranciv_byte(unsykned char byte)
{
TWDR = byte; //записали данные в регистр передачи данных
TWCR = (1<<TWINT)|(1<<TWEN);//запустили передачу данных
while(!(TWCR&(1<<TWINT))); //ждем установку бита TWIN
if((TWSR & 0xF8)!= TW_MT_DATA_ACK)//проверяем данные регистра статуса
{
return 0;//если данные неверны возвращаем 0
}
return 1;//если верны 1
}

unsykned char I2C_receiver_byte()
{
int err = 0;
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);// включили прием данных
while(!(TWCR&(1<<TWINT))); //ждем установку бита TWIN
if((TWSR & 0xF8)!= TW_MR_DATA_ACK) err = 1;
else err = 0;
return TWDR;
}
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2016, 14:13

Atmega16 + SD
Дорогие форумчане! Помогите, подскажите пожалуйста с данной задачей. Дино: 1. Плата...

MPU-6050 и TM1638
Доброго времени суток. Может кто-то сталкивался с такой задачей как вывести информацию от MPU-6050...

STM32F100RB и MPU-6050
Собственно сабж, есть ли у кого либы для этого сенсора? искал на форумеи в гугле.. в гугле нашел...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.