роботы робототехника микроконтроллеры


 Страниц (1): [1]   

> Описание: ПО
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



Купил платку с акселерометром MMA7455. Программа для ATtiny2313. SPI реализован программно. Может кому пригодится.
/*******************************************
Program : mma7455, SPI, USART
Compiler : WinAVR
Chip type : ATtiny2313
System Clock : 8 MHz

ATtiny2313 PB7 (SCK) - SCL/SPC mma7455
ATtiny2313 PB5 (MOSI) - SDA/SDI/SDO mma7455
ATtiny2313 PB6 (MISO) - SDO mma7455
ATtiny2313 PD0 (SS) - CS mma7455

*******************************************/


#include <avr/io.h>
#include <util/delay.h>


unsigned char usart_data = 0b00000000;


void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;

/* Enable transmitter */
UCSRB = (1<<TXEN);

/* Set frame format: 8 data, 1 stop bit */
UCSRC = (1<<UCSZ1)|(1<<UCSZ0);
}


void USART_Transmit( void )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = usart_data;
}


unsigned char spi_transmit_data = 0b00000000;
unsigned char spi_receive_data = 0b00000000;

unsigned char i=0;


// SPI. Master.
void SPI_Transmit_Receive( void )
{
i = 8;
while( i != 0 )
{
i -= 1;

_delay_us(5);
if( spi_transmit_data & (1<<i) ) PORTB |= (1<<5);
else PORTB &= ~(1<<5);
_delay_us(5);

PORTB |= (1<<7);

_delay_us(5);
if( PINB & (1<<6) ) spi_receive_data |= (1<<i);
else spi_receive_data &= ~(1<<i);
_delay_us(5);

PORTB &= ~(1<<7);
}
}


int main( void )
{
// System Clock Prescaler initialization

// Clock Prescale Register
// Bits: CLKPCE - - - CLKPS3 CLKPS2 CLKPS1 CLKPS0
CLKPR = 0b10000000;
CLKPR = 0b00000000;


// Input/Output Ports initialization

// Port D initialization
DDRD = 0b00000001; // PD0 - SS
PORTD = 0b00000001;

// Port B initialization
DDRB = 0b10100000; // PB7 - SCK, PB6 - MISO, PB5 - MOSI
PORTB = 0b00000000;

// Port A initialization
DDRA = 0b00000000;
PORTA = 0b00000000;


// Baud Rate 9600 bps
USART_Init(51);


_delay_ms(200);


// mma7455 initialization

PORTD &= ~(1<<0);

spi_transmit_data = 0b10101100; // write 0x16
SPI_Transmit_Receive();

spi_transmit_data = 0b00000101; // 2g
//spi_transmit_data = 0b00001001; // 4g
//spi_transmit_data = 0b00000001; // 8g
SPI_Transmit_Receive();

PORTD |= (1<<0);


while(1)
{
PORTD &= ~(1<<0);
spi_transmit_data = 0b00001100; // read x (0x06)
SPI_Transmit_Receive();
spi_transmit_data = 0b00000000;
SPI_Transmit_Receive();
PORTD |= (1<<0);

usart_data = 0x06;
USART_Transmit();
usart_data = spi_receive_data;
USART_Transmit();

_delay_ms(3000);


PORTD &= ~(1<<0);
spi_transmit_data = 0b00001110; // read y (0x07)
SPI_Transmit_Receive();
spi_transmit_data = 0b00000000;
SPI_Transmit_Receive();
PORTD |= (1<<0);

usart_data = 0x07;
USART_Transmit();
usart_data = spi_receive_data;
USART_Transmit();

_delay_ms(3000);


PORTD &= ~(1<<0);
spi_transmit_data = 0b00010000 ; // read z (0x08)
SPI_Transmit_Receive();
spi_transmit_data = 0b00000000;
SPI_Transmit_Receive();
PORTD |= (1<<0);

usart_data = 0x08;
USART_Transmit();
usart_data = spi_receive_data;
USART_Transmit();

_delay_ms(3000);
}

return 0;
}

Прикреплено изображение
U4_051744.jpg

 
 Top
Роботов Post Id



Гуру


Сообщений всего: 1350
Дата рег-ции: Июнь 2011  



Очень интересно. Спасибо за предоставленный материал Одобряю
 
 Top
sl Post Id


Майор


Сообщений всего: 56
Дата рег-ции: Июль 2011  



А схему подключения можно?
Просто мне надо, а я не знаю что.
А этот акселерометр подойдёт для балансирующего робота?
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



для балансирующего робота можно взять потенциометр с грузиком
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



sl пишет:
А этот акселерометр подойдёт для балансирующего робота?
Не знаю. Балансирующих роботов не делал.
sl пишет:
А схему подключения можно?
Все просто. Контакты модуля подписаны. Я соединил их проводами с ножками ATtiny2313 следующим образом:
ножки ATtiny2313 --- контакты mma7455
PB7 --- SCL
PB5 --- SDA
PB6 --- SDO
PD0 --- CS
GND --- GND
VCC --- VCC

Приведенная программа раз в три секунды читает регистр содержащий значение зафиксированного акселерометром ускорения и вместе с адресом этого регистра отсылает по UART.

Еще об этом акселерометре можете посмотреть http://avrdevices.ru/akselerometr_mma7455l/

(Отредактировано автором: 05 Сентября, 2011 - 22:08:27)

 
 Top
sl Post Id


Майор


Сообщений всего: 56
Дата рег-ции: Июль 2011  



nest пишет:
для балансирующего робота можно взять потенциометр с грузиком

Он будет раскачиваться, не пойдет.
А акселерометр пойдёт, а?
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



sl пишет:
Он будет раскачиваться
если правильно делать - не будет.
с акселерометром тоже будет раскачиваться.
Акселерометр, в общем то, ничто иное как потенциометр с грузиком.
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



MMA7455, если верить datasheet, устроен немного иначе.
Прикреплено изображение
mma7455l.GIF

 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



mihail, Улыбка ну принцып всё равно один: болталка на ниточке
 
 Top
Страниц (1): [1]
« Делимся опытом »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru