Компас CMPS03

Цифровой компас CMPS03. Функциональное назначение - вспомогательное средство навигации. Вспомогательное - это потому, что очень ненадежное. Компас очень чутко реагирует на любые металлические предметы, которые могут оказаться рядом с роботом во время движения, при этом показывать он начинает все что угодно, только не правильное направление. Компас имеет интерфейс I2C, по нему может выдавать угол поворота в виде одного байта (0..255), либо в виде двух байтов (0..3599). Также у него есть аналоговый выход с ШИМ сигналом (от 1мс - 0 градусов, до 36.99мс - 359.9 градусов).

CMPS03

Подробное описание этого компаса есть на wiki-портале сайта Roboforum.ru. Оно явлется переводом оригинального английского описания компаса.

Процедуры для работы с компасом на MikroC

// I2C адрес компаса по умолчанию
#define CMPS_ADR 0xC0
 
// Возвращает версию прошивки компаса
char cmps_firmware (void) {
 char firmware = 0; 
 I2C_Init(100000);          // Инициализация шины на скорости 100кбит/с
 I2C_Start();               // Посылка стартового бита
 I2C_Wr(CMPS_ADR);          // Посылка адреса компаса
 I2C_Wr(0x00);              // Посылка адреса необходимого регистра
 I2C_Repeated_Start();      // Посылка повторного стартового бита
 I2C_Wr(CMPS_ADR+1);        // Посылка адреса компаса с высоким уровнем 
                            // бита R/W
 firmware = I2C_Rd(0u);     // Чтение значения регистра
 I2C_Stop();                // Посылка стопового бита
 return firmware;
}
 
// Возвращает азимут компаса как байт (0 - 255 на 360 градусов)
char cmps_azimuth_b (void) {
 char azimuth = 0;
 I2C_Init(100000);
 I2C_Start();
 I2C_Wr(CMPS_ADR);
 I2C_Wr(0x01);
 I2C_Repeated_Start();
 I2C_Wr(CMPS_ADR+1);
 azimuth = I2C_Rd(0u);
 I2C_Stop();
 return azimuth;
}
 
// Возвращает азимут компаса как слово
// (0 - 3599 соответствует 0 - 359.9 градусов)
int cmps_azimuth_w (void) {
 char lo_byte = 0;
 char hi_byte = 0;
 int grade = 0; 
 I2C_Init(100000);
 I2C_Start();
 I2C_Wr(CMPS_ADR);
 I2C_Wr(0x02);
 I2C_Repeated_Start();
 I2C_Wr(CMPS_ADR+1);
 hi_byte = I2C_Rd(1u);
 lo_byte = I2C_Rd(0u);
 I2C_Stop();
 grade = (hi_byte << 8) + lo_byte; // Суммирование старшего и младшего байтов
 return grade;
}

back

Hosted by uCoz