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

Razek
SergDoc:

как буд-то плата криво стоит…

Может в процедуре калибровки, какой косяк? Биасы неправильно подсчитываются. Есть возможность видео записать с гуев с симптомами?

mataor
SergDoc:

выключен…

при включенном проверьте - тогда код макс приближен к виевскому

SergDoc

Выкинул в дебаг сырые данные с акселя по осям, и что 1g 3950 в среднем(за 4000 не заходит), а не 4096 как по правильному Wii-ному да у меня дома аномалия😵😃

SergDoc

Не могу разобраться:

void baroKalmanfilterStepUnstable(int32_t *baro)
{
        static int32_t _lastTime = 0;
        float pressure = *baro; // float приравниваем к int ?
        uint32_t currentTime = micros();
        float dt = (currentTime - _lastTime) * 1e-6;  // тут тоже всегда целочисленное получится
        _lastTime = currentTime;

        static int _init = 0;
        if (!_init)
        {
                _init = 1;
                est[0] = pressure;

                return pressure; // вернуть float в int ?
        }

компилятор ругается что не может вернуть значение?

mataor

хм… насколько помню ф-я в С должна быть того же типа, что и возвращаемое значение, а тут у вас функция неопределенного типа void

SergDoc

у чувака компилятор какой-то интересный

SergDoc:

static int _init = 0;

в цыкле переваривает, и по ходу всё остальное тоже…

SergDoc:

float dt = (currentTime - _lastTime) * 1e-6;

а тут всегда ноль (ну если значение currentTime - _lastTime не с 6-ю нолями в конце получается) если моим компилятором пользоваться ибо обе переменные целочисленные, и таких бяк очень много, (и с акселем) по этому и не летит нормально наверно, но ДУСы то работают отменно…

ага
eclipse

таак надо как-то всё переносить?

SergDoc

Может правда обозвать эти все файлы (с Калманом которые) .срр ?

rual
SergDoc:

Может правда обозвать эти все файлы (с Калманом которые) .срр ?

Обзови, проблема с внутренним объявлением переменных решится. А насчёт функции в void bla_bla(){
//должон быть просто
return;
// без переменной
}

Razek

А у первоисточника, под какой компилятор? Сталкивался, что из-за того, что не аккуратно используют типы в коде, разные версии одного и того же компилятора приводят к непредсказуемым результатам.

SergDoc
rual:

Обзови, проблема с внутренним объявлением переменных решится. А насчёт функции в void bla_bla(){
//должон быть просто
return;
// без переменной
}

да тут уже разобрался, видно у него компилятор пропускает это мимо ушей…

Razek:

А у первоисточника, под какой компилятор?

похоже эклипс…

да у него до вчерашнего дня магнитометр не работал, я хотел написать об этом но сегодня смотрю уже исправил…
code.google.com/p/afrodevices/source/detail?r=274

rual
SergDoc:

похоже эклипс…

Эклипс эта среда, компилятор ГЦЦ (поддерживает вольный стиль:))

SergDoc

У кого есть возможность AIO или какой Wii с MPU6050 ну или NAZE32 выкинте в дебаги сырые данные с акселя, хотелось бы глянуть…
в NAZE32 в драйвере нужно добавить
#include “mw.h”

debug[0]=accData[0];
debug[1]=accData[1];
debug[2]=accData[2];

они там ещё без калибровки…

oleg70

Люди добрые! Дайте совет что и где почитать про структуру создания проекта для использования CMSIS. Не скажу что я программист, но опыт кое какой есть (для AVR сделал и OSD и GPS и ИМУ - все собственное без плагиата), а тут ну ни как не могу “вкурить” эту новую идеологию.
Поставил себе Coocox, взял плату DiscoveryF3, файлы CMSIS под F303 вроде скачал, вроде уложил куда надо… начинаю “Build”- дает ошибки о необъявленных типах и т.п.
Выручайте ссылкой или советом на инфу (можно с азов) ведь сами то когда то начинали как то… (не ругать, если отвлекаю от дела)

mataor
SergDoc:

выкинте в дебаги сырые данные с акселя

zalil.ru/34280435 тут данные саавсем сырые:

void ACC_getADC () {
i2c_getSixRawADC(MPU6050_ADDRESS, 0x3B-);
ACC_ORIENTATION( ((rawADC[0]<<8) | rawADC[1])/8 ,
((rawADC[2]<<8) | rawADC[3])/8 ,
((rawADC[4]<<8) | rawADC[5])/8 );
debug[0]=accADC[0];
debug[1]=accADC[1];
debug[2]=accADC[2];
ACC_Common();
}

в логе 2 оборота по питчу (туда-обратно), потом по роллу, потом вверх/вниз несколько раз

DVE
oleg70:

Поставил себе Coocox, взял плату DiscoveryF3, файлы CMSIS под F303 вроде скачал, вроде уложил куда надо… начинаю “Build”- дает ошибки о необъявленных типах и т.п.

У меня тоже Coocox, выложите архив проекта.

Если в общем - смотрите на что ругается, находите папку где лежат h-файлы для Вашего проца (например stm32f10x_gpio.h), ищете в них нужную функцию, вставляете include.

SergDoc
mataor:

в логе 2 оборота по питчу (туда-обратно), потом по роллу, потом вверх/вниз несколько раз

1g=512?
То есть таже песня что я наблюдаю и с ЛСМ-ки, значит у меня руки - крюки, пойду допиливать 😃

mataor

угу 512…
проверьте инициализацию акселя в МПУ:

void ACC_init () {
	i2c_writeReg(MPU6050_ADDRESS, 0x1C, 0x10);             //ACCEL_CONFIG  -- AFS_SEL=2 (Full Scale = +/-8G)  ; ACCELL_HPF=0   //note something is wrong in the spec.
	//note: something seems to be wrong in the spec here. With AFS=2 1G = 4096 but according to my measurement: 1G=2048 (and 2048/8 = 256)
	//confirmed here: 
	#if defined(FREEIMUv04)
	acc_1G = 255;
	#else
	acc_1G = 512;
	#endif

	#if defined(MPU6050_I2C_AUX_MASTER)
	//at this stage, the MAG is configured via the original MAG init function in I2C bypass mode
	//now we configure MPU as a I2C Master device to handle the MAG via the I2C AUX port (done here for HMC5883)
	i2c_writeReg(MPU6050_ADDRESS, 0x6A, 0b00100000);       //USER_CTRL     -- DMP_EN=0 ; FIFO_EN=0 ; I2C_MST_EN=1 (I2C master mode) ; I2C_IF_DIS=0 ; FIFO_RESET=0 ; I2C_MST_RESET=0 ; SIG_COND_RESET=0
	i2c_writeReg(MPU6050_ADDRESS, 0x37, 0x00);             //INT_PIN_CFG   -- INT_LEVEL=0 ; INT_OPEN=0 ; LATCH_INT_EN=0 ; INT_RD_CLEAR=0 ; FSYNC_INT_LEVEL=0 ; FSYNC_INT_EN=0 ; I2C_BYPASS_EN=0 ; CLKOUT_EN=0
	i2c_writeReg(MPU6050_ADDRESS, 0x24, 0x0D);             //I2C_MST_CTRL  -- MULT_MST_EN=0 ; WAIT_FOR_ES=0 ; SLV_3_FIFO_EN=0 ; I2C_MST_P_NSR=0 ; I2C_MST_CLK=13 (I2C slave speed bus = 400kHz)
	i2c_writeReg(MPU6050_ADDRESS, 0x25, 0x80|MAG_ADDRESS);//I2C_SLV0_ADDR -- I2C_SLV4_RW=1 (read operation) ; I2C_SLV4_ADDR=MAG_ADDRESS
	i2c_writeReg(MPU6050_ADDRESS, 0x26, MAG_DATA_REGISTER);//I2C_SLV0_REG  -- 6 data bytes of MAG are stored in 6 registers. First register address is MAG_DATA_REGISTER
	i2c_writeReg(MPU6050_ADDRESS, 0x27, 0x86);             //I2C_SLV0_CTRL -- I2C_SLV0_EN=1 ; I2C_SLV0_BYTE_SW=0 ; I2C_SLV0_REG_DIS=0 ; I2C_SLV0_GRP=0 ; I2C_SLV0_LEN=3 (3x2 bytes)
	#endif
}
rual
oleg70:

Поставил себе Coocox, взял плату DiscoveryF3, файлы CMSIS под F303 вроде скачал, вроде уложил куда надо… начинаю “Build”- дает ошибки о необъявленных типах и т.п.

Кокос вроде как 303й ещё не знает, посему и не видит типы. Возможно это как-то настраивается, но я с ним не работал. Для начала возмите кейл или иар (или то с чем работали), возмите демо-проект, настройте библиотеки и откомпильте.
фирменная дока и необходимые файлы на Ф3:
www.st.com/web/catalog/mmc/FM141/…/PF253447#
общая статья на Русском языке по структуре проектов, настройке сред для дискавери, верно для любых демо плат :
www.terraelectronica.ru/…/NE_2011_2_13-22.pdf

вот ещё для иар we.easyelectronics.ru/…/stm32-vldiscovery-moy-vari…

SergDoc
mataor:

проверьте инициализацию акселя в МПУ:

у меня ЛСМ, а интересовали шумы и разница в показаниях с МПУ, а так как разницы не увидел особой, значит не датчик виноват, а я что-то неправильно делаю…

SergDoc

Обьясню немного мои претензии к акселю, на прошлом контроллере дискретность расчёта по гирам была 2.6 градуса, и естественно летать можно было только с акселем (ADXL345) что тоже не ахти, но аппарат (светлая ему память) горизонт держал отменно - по руддеру немного крутило, что не удивительно, а теперь у меня картина в точности до на оборот 😦

rual
SergDoc:

летать можно было только с акселем (ADXL345)

а ты попробуй АДХЛЬ сбоку на платке прикрути, вот тут всё станет ясно.