Создание собственной системы стабилизации

SergDoc

О блин ST на семинар приглашали:

Free technical seminars

Save weeks of development time by attending a free seminar on the new STM32 F0 MCU based on the ARM® Cortex™-M0 core. Learn more about the features of the ARM® Cortex™-M0 core (system architecture, connectivity interfaces, advanced digital and analog peripherals) and the ecosystem of STM32 F0 microcontroller (development and programming tools, evaluation and development kits, firmware libraries). More

SergDoc

Немного заглядывая вперёд:
STM32F405RGT6
MPU6000
bmp180 ?
HMC5883L ?
FGPMMOPA6B - GPS модуль на MT3329
как-то так

SergDoc

Из приятного, CP2102 дружит с линуксом определяется как TTYUSB 0 без всяких извращений, так что теперь оба контроллера под одной ОС запускаются…

SergDoc

в фотике CANON PC1475 стоят две гиры ENC-03 SMD 😃

IvanDeft
SergDoc:

MPU6000

Заказал себе 6050. Жду когда придет, начну мучать )))

SergDoc

Хватит, и можно клон NAZE 32 сварганить, я просто хочу по SPI, после СС чёт I2C не вставляет, хотя на данный момент вроде без ошибок работает…

Gapey

ну так ставте 6000 и будет SPI … правда они в отличии от 6050 пока в дефиците …

SergDoc

Первый запуск драйвера ничего не дал, не определилась LSMка 😦

SergDoc

аааа, а в автодетект кто править будет:)

SergDoc

Чёт я не могу въехать

 bool ack = false;
    uint8_t sig = 0;

    ack = i2cRead(ADXL345_ADDRESS, 0x00, 1, &sig); // вот тут немогу разобратся что вычитывается из акселя, я так понимаю что и ack и sig присваивается значение 0хЕ5 это id устройства, к чему привязатся в LSM?
    if (!ack || sig != 0xE5) // но тут же неack
        return false;

Аксель определился, но читатся отказывается…

# statusshow
System Uptime: 863 seconds, Voltage: 0 * 0.1V (2S battery)
Detected sensors: ACC BARO MAG   ACCHW: lsm330acc
Cycle Time: 1150, I2C Errors: 0

# 
SergDoc

Беда с автоопределением, я подцепился к первому регистру (он единственный с ненулевыми показаниями) - определился, но что бы аксель заработал, этот регистр программировать надо, а так как я его щас запрограммировал, аксель уже не определяется, бядааа… 😦

да проверил свою догадку, надо искать другой способ автоопределения…

придумал, оси всегда включены, значит надо вычитать, только три младших байта из регистра, они будут всегда постоянны, вопрос как это сделать?

вычитать регистр, сместить <<5 получим число E0 его и примем за сигнатуру?

Можно ли так записать?


ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A << 5, 1, &sig);
rual

Что то у вас всё сложно. В чём смысл идентификации акселя? В том чтобы не заточенную под железо прошиву определить при старте?
Умолчательное значение 00000111b

bool ack = false;
    uint8_t sig = 0;

    ack = i2cRead(ADXL345_ADDRESS, 0x20, 1, &sig); // если я правильно понимаю параметры функции читаем аксель по адресу 0x20

    if (!ack || sig != 0x07) // тут либо NACK, либо  считанное занчение не равно 7
        return false;  

вот вроде так
ps точнее так
ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A, 1, &sig);
сдвигать внутренний адрес акселя не нужно!

SergDoc

Решил проблему так:


bool LSM330ACCDetect(sensor_t *acc)
{
    bool ack = false;
    uint8_t sig = 0;

    ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
	  ack = ack <<5;
	  sig = sig <<5;
    if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
        return false;

    acc->init = LSM330ACCInit;
    acc->read = LSM330ACCRead;
    acc->align = LSM330ACCAlign;
    return true;
}

Я просто потом перезаписываю регистр как мне надо, и всё приплыли нет аксела на следующем старте, сейчас всё заработало 😃

Сгирой постораюсь обойтись проще, типа есть такой аксель значит и гира такая же…

rual:

В чём смысл идентификации акселя? В том чтобы не заточенную под железо прошиву определить при старте?

у Таймкопа автоопределение датчиков написано - типа какие установлены, так вот я туда lsm-ку и пристраиваю

rual

у переменной ack булевый тип, некрасиво его сдигать )

SergDoc

зато работает 😃 определяется аксель без проблем 😃

а в булеву переменную, всякую бяку засовывать, типа чип id, то ж некрасиво

rual
SergDoc:

а в булеву переменную, всякую бяку засовывать, типа чип id, то ж некрасиво

нее, не так. в ack функция выгружает наличие/отсутсвие ответа от ведмого устройства. Т.е. если ack = true, то устройство ответило, если false что ответа не было.

SergDoc
SergDoc:

if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
return false;

тогда вот это загадка…

в таком случае надо


bool LSM330ACCDetect(sensor_t *acc)
{
    bool ack = false;
    uint8_t sig = 0;

    ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
	  sig = sig <<5;
    if ( sig != LSM330ACC_DEVICE_SIGNATURE)
        return false;

    acc->init = LSM330ACCInit;
    acc->read = LSM330ACCRead;
    acc->align = LSM330ACCAlign;
    return true;
}