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

RaJa
mahowik:

да без проблем! теребят то в основном по фигне всякой, а тут приятный мужской разговор 😃

У меня AIOP 1.0 контроллер с mpu6050 на борту… наверное последняя… а их было несколько версий?

Да, у меня, например AIOP v2

SergDoc:


ещё пищалка, MicroSD, батарейка…

Этот GPS не очень хорош. Он быстрый, но не очень точный. Если начал плавать - то плавает довольно сильно. У меня есть два GPS модуля на этом чипе. uBlox получше, хоть и не такой быстрый. даже NEO-6M

rual
SergDoc:

секретная инфа

Под 100ногий корпус? У них свой радиоканал предполагается?

SergDoc

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

RaJa:

Этот GPS не очень хорош.

зато дёшево и сердито, и он у меня есть, а так никто не мешает подвесить и другой модуль, нижняя плата полностью самодостаточна.

При желании входа радио 5,6 можно превратить в can, 7,8 - i2c1 ну и т.д. для боловства, мне кажется, плата получилась неплохая (ой чёт самопиаром занялся, надо прекращать 😃 )

Probelzaelo
rual:

Я вот в этом форуме ни одной буквы своей не написал, всё либо кирилица, либо латиница

А это ничего, что цифры арабские? )

rual
Probelzaelo:

А это ничего, что цифры арабские? )

Ё моЁ 😃! Сплошной плагиат!

DVE

Может кому интересно, выложены исходники очередного 😃 контроллера: github.com/EvaPilot/Eva
Processor: AT91RM9200
Gyroscope: Uses two chips: LPR430AL (For X and Y axis), LY330ALH (For Z axis).
Accelerometer: ADXL335

Самое тут интересное, по слухам заявлена совместимостьс YS-X4.

Razek
DVE:

Может кому интересно, выложены исходники очередного контроллера

Что-то исходники жесть, сплошной партянкой идут

oleg70

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

Gapey
oleg70:

Кто нибудь MPX4115 “мучал” ??

ну так с него все и начиналосЪ …
оно стояло у немцев еще назаре коптеростроения … и на русокоптере … оцифровывалосЪ ADS1100 …

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, может кто найдёт ошибку

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