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

SergDoc

готовность только по прерыванию, ибо если читать регистр готовности - пройдёт вечность…

oleg70
SergDoc:

вот петля:

Здесь везде привязка к currentTime = micros();, а мне хочется от нее избавиться

SergDoc:

готовность только по прерыванию

Вот здесь то и самое интересное… Например у LSM сигнал DRDY не зависит от установленного DATArate и всегда 250 Гц (?), а L3GD20 просто выставляет “1” на ноге когда можно прочитать данные и ждет пока их не прочитаешь (?)
Тут есть над чем поразмыслить…

rual
SergDoc:

чёт опять туплю, это ссылки на адреса памяти?

Да, там расположен уникальный номер проца. Для Ф4 надоть уточнить адрес.
Кста, это при работе УСБ активно используется при создании соединения. Разные дискавери у меня на разные виртуальные компорты садятся.

oleg70:

Например у LSM сигнал DRDY не зависит от установленного DATArate и всегда 250 Гц (?),

Нет, соответствует выставленной частоте отсчётов.

oleg70:

а L3GD20 просто выставляет “1” на ноге когда можно прочитать данные и ждет пока их не прочитаешь (?)

Да, после чтения снимает до очередной готовности (так все СТшные датчики работают и ХМЦ5883 тожа).

SergDoc
rual:

Да, там расположен уникальный номер проца. Для Ф4 надоть уточнить адрес.

я уже выковырял 😃 rcopen.com/forum/f134/topic224458/2240
на картинках что выше Unique devise ID в правом нижнем углу 😃

SergDoc

Может кто найдёт ошибку github.com/SergDoc/…/drv_pwm.c
восьмой таймер не запускается, первый такой-же, на нём у меня моторы - работает, а восьмой хоть застрелись…
тактирование таймеров и портов включено отдельно

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 | RCC_APB1Periph_TIM5 | RCC_APB1Periph_I2C2 | RCC_APB1Periph_SPI2 | RCC_APB1Periph_USART2 | RCC_APB1Periph_USART3 , ENABLE);
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1 | RCC_APB2Periph_TIM8 | RCC_APB2Periph_ADC1 | RCC_APB2Periph_USART1 | RCC_APB2Periph_SPI1, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_DMA2, ENABLE);
    RCC_ClearFlag();
SergDoc

затык у меня наверно здесь:

 setup = hardwareMaps[i];

    for (i = 0; i < MAX_PORTS; i++) {
        uint8_t port = setup[i] & 0x0F;
        uint8_t mask = setup[i] & 0xF0;

        if (setup[i] == 0xFF) // terminator
            break;

как этого избежать?

если так?

 setup = hardwareMaps[i];

    for (i = 0; i < MAX_PORTS; i++) {
        uint16_t port = setup[i] & 0x00FF;
        uint16_t mask = setup[i] & 0xFF00;

        if (setup[i] == 0xFFFF) // terminator
            break;

запустил все таймеры 😃

SergDoc

Сегодня поймал глюк приёмника, возможно по этой же причине у меня улетел аппарат в прошлом году, т.к. я заводил 8-й таймер, а он у меня предназначен для серв, естественно надо подключить было серву, а по причине того что питания развязаны и регуль не подключал, то самое простое что придумал, взял питание сервы с приёмника, и вот - АРМ кручу платку - серва крутится - хорошо, ага а дизарм то уже тю-тю - в каком положении стики оставил в том и показания остались - получается приёмник подвис из-за питания, т.к. я ещё и серву подцепил…

vatanuki
SergDoc:

приёмник подвис из-за питания

подскажите что за приемник? такой?

SergDoc

Да он самый… но тут получается, что питание от usb через обычный диод т.е. с подключенной сервой ~4.3В получилось, плате то моей не критично у меня всё на 3.3В, а вот приёмнику не понравилось…

oleg70
rual:

так все СТшные датчики работают

Не мог не поделиться…: Решил сделать компенсацию дрейфа “0” гиры от встроенного датчика температуры.
Так вот имеем: при нагреве (t+) “0” гиры смещается в минус и показания датчика температуры тоже (???) уменьшаются…
При комнатной температуре ~24 гр.с. датчик показывает “12” (??) и при нагреве феном уходит в минуса…
Вопрос: это какой то великий замысел или издевательство…(как компенсировать гиру?)

oleg70

Вот “матбаза”: Temperature sensor output change vs.temperature -1 °C/digit
Temperature data (1LSB/deg - 8-bit resolution). The value is expressed as two’s complement.
Пишу в коде: int8_t temper=(int8_t)data[…];
Где ошибка?

SergDoc

смотри как в mpu3050 сделано

static void mpu3050ReadTemp(int16_t *tempData)
{
    uint8_t buf[2];
    i2cRead(MPU3050_ADDRESS, MPU3050_TEMP_OUT, 2, buf);


    *tempData = 35 + ((int32_t)(buf[0] << 8 | buf[1]) + 13200) / 280;
}
oleg70
SergDoc:

char

не помогло… (то же самое)

SergDoc

буду дома покопаюсь может найду чего…

SergDoc

вот что есть по l3g20:

STemp := Read_1B(OUT_TEMP)
  ESTemp := 25 - STemp
  ESTemp := ESTemp + 25 - 4           'Deg C the -4 is my correction yours may be different
  ESTemp := ESTemp * 9 / 5 +32     'Deg F
VitaliyRU
oleg70:

Не мог не поделиться…: Решил сделать компенсацию дрейфа “0” гиры от встроенного датчика температуры.

Меня не покидает ощущение, что гирик лучше всего калибровать по акселю… Причем наверно с тем же периодом адаптации, что и правим интерированный гирик акселем. - что бы врали в ногу, а не в разнобой.

oleg70
SergDoc:

вот что есть

Какой простой выход из положения (спасибо). Вопрос только: о чем думали разработчики чипа вынуждая делать математические “приемы”…

VitaliyRU:

лучше всего калибровать по акселю

по аккселю он калибруется на “выходе” ИМУ и устраняет ошибку угла отклонения, а вот смещение нулевой точки желательно устранять до подачи в ИМУ (даже более важно чем устранение шума)…

VitaliyRU
oleg70:

по аккселю он калибруется на “выходе” ИМУ и устраняет ошибку угла отклонения, а вот смещение нулевой точки желательно устранять до подачи в ИМУ (даже более важно чем устранение шума)…

Я свежее вия 1.9 ничего не курил(но раз речь идет про угол, значит мы все же о разном), может что-то и сделано.
Я именно про ВХод а не ВЫход. Берем два соседних угла от акселя(arctg(z/x) вся фигня), делим на время - получаем угловую скорость от дачика акселерометр - АДОВО щумящую, но это пофиг. Через AB фильтр накапливаем поправку на гирик, гирик всегда читаем с этой поправкой. т.е. Если арктангенс двух соседних ускорений 500 итераций пляшет +3*/-3* поправка=0, если пляшет +3*/-2* значит по акселю мы получаем 1*/сек - пишем это в поправку гирика. врятли понятно, но просто решаем обратную задачу. Правим акселем гирик.

Другими словами, ща все сделано в размерности угол(это выход). Я предлагаю в размерность вход(это скорость). Тогда аксель перестанет догонять гирик(от чего адово унитазит) а жить они будут синхронно.
Или мерим угловую скорость акселем и дружим их на уровне скорости.
сори за сумбурность.