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

rual
oleg70:

Кто нибудь MPX4115 “мучал” ??
Размышляю щас как с ним быть: отдельный АЦП?, аналоговый усилитель?, хотелось бы разрешения побольше, а то еще и с сонаром связываться неохота (и так все законы физики и математики на одной плате:))…

А что с ним не так? У стма на борту 10-разрядный АЦП , берем и меряем 😃

oleg70
rual:

А что с ним не так?

Все хорошо, но по самым оптимистическим подсчетам разрешение (по моим подсчетам…) +/- 2 метра выходит, для самолета за глаза, а для коптера как то некрасиво будет выглядеть в режиме удержания позиции…

SergDoc
oleg70:

отдельный АЦП?

Да - да отдельный АЦП бита так 24 по SPI и датчики остальные тоже аналоговые - моя мечта (autoqad Билла Несбита не предлогать у меня денег нет 😃 )

rual:

У стма на борту 10-разрядный АЦП , берем и меряем

чёй-та мне казалось 12 или я что-то путаю? это у атмег 10-битный…

SergDoc

У меня две проблемы, злосчастный затыкающйся UART и i2c - видит зараза только одно устройство (на мелкоплате так-же сидело 4 устройства) видит барометр, магнитометр не признаёт, выпаивал барометр - видит магнитометр, отключаю баро (программно) не видит магнитометр, что-то в программном, ибо схему перепроверил уже не один раз, адреса устройств естественно разные 😦

oleg70
SergDoc:

не видит магнитометр

Судя по Вашему посту, не меняя кода (а только при выпаивании) у Вас “видится” одно из устройств, вывод - дело не в коде, i2c иногда капризничает, обратите внимание на номинал подтягивающих резисторов, можно ставить от 10 до 4.7 кОМ…

rual
SergDoc:

чёй-та мне казалось 12 или я что-то путаю? это у атмег 10-битный…

Да, 12 бит , чейто попутал 😃

SergDoc:

i2c - видит зараза только одно устройство (на мелкоплате так-же сидело 4 устройства) видит барометр, магнитометр не признаёт, выпаивал барометр - видит магнитометр, отключаю баро (программно) не видит магнитометр,

Странно, такое впечатление что либо неправильно настроены и2ц выводы контроллера, либо серьёзный косяк в разводке шины.

SergDoc
rual:

либо серьёзный косяк в разводке шины

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

oleg70:

можно ставить от 10 до 4.7 кОМ…

на 5 вольтах, на 3.3 надо попробовать 1кОм влепить, на мелкоплате 4.7 на этой тоже…

SergDoc

Всё нормально i2c запущена в полном объёме - сопля была мелкая помиж лап проца на пару килоом, а в баро не надо читать ничего точнее вычитать 0х00 - что с успехом и делалось, остался уарт, эта зараза на вход работает, а на выходе каша и вешается 😦 ну ещё одно усилие - побороть его и с песней к новым глюкам 😃

SergDoc

Ради эксперимента залил Wii на f4 , т.к. UART сделан также, хотелось проверить - работает зараза, а у меня нет, значит проблема где-то в другом месте 😦 , а не в uarte и dma …

SergDoc

Злосчастный UART+DMA, может кто найдёт ошибку:


#include "board.h"

/*
    DMA UART routines idea lifted from AutoQuad
    Copyright © 2011  Bill Nesbitt
*/
#define UART_BUFFER_SIZE    256

// Receive buffer, circular DMA
volatile uint8_t rxBuffer[UART_BUFFER_SIZE];
uint32_t rxDMAPos = 0;
volatile uint8_t txBuffer[UART_BUFFER_SIZE];
uint32_t txBufferTail = 0;
uint32_t txBufferHead = 0;

static void uartTxDMA(void)
{
    DMA2_Stream7->M0AR = (uint32_t)&txBuffer[txBufferTail];
    if (txBufferHead > txBufferTail) {
        DMA2_Stream7->NDTR = txBufferHead - txBufferTail;
        txBufferTail = txBufferHead;
    } else {
        DMA2_Stream7->NDTR = UART_BUFFER_SIZE - txBufferTail;
        txBufferTail = 0;
    }

    DMA_Cmd(DMA2_Stream7, ENABLE);
}

void DMA2_Stream7_IRQHandler(void)
{
    DMA_ClearITPendingBit(DMA2_Stream7,DMA_IT_TCIF7);
    DMA_Cmd(DMA2_Stream7, DISABLE);

    if (txBufferHead != txBufferTail)
        uartTxDMA();
}

void uartInit(uint32_t speed)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // USART1_TX    PA9
    // USART1_RX    PA10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
	  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
	  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

    // DMA TX Interrupt
    NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_InitStructure.USART_BaudRate = speed;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);

    // Receive DMA into a circular buffer
    DMA_DeInit(DMA2_Stream5);
		DMA_InitStructure.DMA_Channel = DMA_Channel_4;
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)rxBuffer;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_BufferSize = UART_BUFFER_SIZE;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_Init(DMA2_Stream5, &DMA_InitStructure);

    DMA_Cmd(DMA2_Stream5, ENABLE);
    USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
    rxDMAPos = DMA_GetCurrDataCounter(DMA2_Stream5);

    // Transmit DMA
    DMA_DeInit(DMA2_Stream7);
		DMA_InitStructure.DMA_Channel = DMA_Channel_4;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_Init(DMA2_Stream7, &DMA_InitStructure);
    DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);
    DMA2_Stream7->NDTR = 0;
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

    USART_Cmd(USART1, ENABLE);
}

uint16_t uartAvailable(void)
{
    return (DMA_GetCurrDataCounter(DMA2_Stream5) != rxDMAPos) ? true : false;
}

bool uartTransmitEmpty(void)
{
    return (txBufferTail == txBufferHead);
}

uint8_t uartRead(void)
{
    uint8_t ch;

    ch = rxBuffer[UART_BUFFER_SIZE - rxDMAPos];
    // go back around the buffer
    if (--rxDMAPos == 0)
        rxDMAPos = UART_BUFFER_SIZE;

    return ch;
}

uint8_t uartReadPoll(void)
{
    while (!uartAvailable()); // wait for some bytes
    return uartRead();
}

void uartWrite(uint8_t ch)
{
    txBuffer[txBufferHead] = ch;
    txBufferHead = (txBufferHead + 1) % UART_BUFFER_SIZE;

    // if DMA wasn't enabled, fire it up
    if (!(DMA2_Stream7->CR & 1))
        uartTxDMA();
}

void uartPrint(char *str)
{
    while (*str)
        uartWrite(*(str++));
}

код переделан со 103-г на мелкоплате работает, тактирование периферии и портов включено зарание…

mataor

как и обещал… схема контроллера gfile.ru/av2Z
не до конца правда поправлена + есть мелкие но не критичные недочеты…
также начал потихоньку паять платку… правда полностью готова будет не скоро - пока нет мелочевки 0605, разъемов и еще мелочи разной…

rual
SergDoc:

Злосчастный UART+DMA, может кто найдёт ошибку

В приведённом коде ошибки не нашел, что отладчик говорит? Попробуй в начале программы сделать цикл с посылкой сисмвола в порт.

SergDoc

Блин сегодня приснилось - где ошибка и почему так происходит, но проснулся и забыл начисто 😦 надо кодятник пересмотреть может вспомню…

rual:

Попробуй в начале программы сделать цикл с посылкой сисмвола в порт.

после инициализации порта зациклить хрень типа «Hello, world!» - попробую как время будет…

SergDoc

интересно если в serial ткнуть точку останова, тормознёт или нет - чёт мне подсказывает что проскочит…

rual
SergDoc:

после инициализации порта зациклить хрень типа «Hello, world!» - попробую как время будет…

Да, это покажет работу порта на передачу.

SergDoc:

интересно если в serial ткнуть точку останова, тормознёт или нет - чёт мне подсказывает что проскочит…

тормознёт.

SergDoc

ну тогда хоть увижу что оно пихает в порт…

Stiger

Доброго времени суток, небольшой вопрос к Сергею (SergDoc) - А почему для создания собственной системы стабилизации Вы выбрали ARM?
Сам сейчас так же с нуля пишу систему стабилизации на AVR (не подсматривая в готовые), и взвешиваю ЗА и ПРОТИВ разных платформ.
У ARM конечно потенциально возможностей больше, ибо фактически компьютер, но вот задач под эти возможности не вижу.
А с AVR - наоборот. Взять готовую МЕГУ2560, там места хватит подо всё.
В моём понимании коптер - жесткий автомат:

  • Стабилизация.(уже сделано в любом, самом дешевом.)
  • Определение местоположения.(так же, разве что в КуКе нет.)
  • Блокировка ошибочных действий оператора. (вывод из падений, запрет превышения скоростей и.т.д.) - пока готовых не видел, но вполне решаемо.
  • Логгирование полёта.
  • Передача телеметрии.
    ------- Всё указанное спокойно решается AVR.

А вот задачи под ARM - распознавание препятствий по видео? - На ползающих не научились ещё массово это делать, что уж говорить про летающие.
Лучше радар поставить (AVR опять же) больше будет работоспособности.
Поиск горизонта?
Работа по алгоритму?
Нейронное обучение?

Как ни ломал голову себе, задач под ARM не нашел. Вот и интересно Ваши мотивы. Если это не тайна конечно.

SergDoc

“Жирная периферия”, “Жирная математика - FPU”, частота, внутрисхемная отладка, дешевле проц (с тойже жирностью 😃 ), ну и т.д.

mataor
Stiger:

Вот и интересно Ваши мотивы. Если это не тайна конечно.

не знаю как именно у моего тезки, но я лично стал делать на другом семействе (хоть и атмел) по нескольким причинам:

  1. интерес (чисто как программер, освоить другую довольно интересную платформу)
  2. возможности (обычных АВР хоть и хватает на текущие задачи, но уже с натягом - например те же ШИМ выхода и таймеры - у АВР их уже тупо не хватает, чтобы сделать все аппаратно)
  3. запланированные доработки (совместно со 2-м пунктом - на обычной меге придется изгаляться)
SergDoc
Stiger:

Как ни ломал голову себе, задач под ARM не нашел. Вот и интересно Ваши мотивы. Если это не тайна конечно.

а это можно и у Syberian или у vis.asta спросить :)‎
ну и от себя, так как я в программировании практически полный ноль, а под STM открытых проектов много - ну и все вытекающие 😃

Stiger:

Нейронное обучение?

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

Razek
Stiger:

Сам сейчас так же с нуля пишу систему стабилизации на AVR (не подсматривая в готовые),

А вот это зря, на текущий момент на решение задачи стабилизации потрачено тысячи человеко часов и по крайней мере стоит для эрудиции хотя бы ознакомится с трудами коллег по цеху. И кстати львиная доля этих трудозатрат связанна со слабой призводительностью AVR. Но в том что ARM является избыточным/overkill для задачи стабилизации тут Вы правы, но избыток ресурсов “сегодня”, это временное явление, а нехватка ресурсв AVR это уже случиось “вчера”.

Тут случайно наткнулся на магнитометр HMC5983 беглое ознакомление с даташитом показало что тоже самое что HMC5883 только есть SPI, температурная компенсация и частота измерений 220 герц. Кто что думает?