Создание собственной системы стабилизации
Может кому интересно, выложены исходники очередного 😃 контроллера: github.com/EvaPilot/Eva
Processor: AT91RM9200
Gyroscope: Uses two chips: LPR430AL (For X and Y axis), LY330ALH (For Z axis).
Accelerometer: ADXL335
Самое тут интересное, по слухам заявлена совместимостьс YS-X4.
Может кому интересно, выложены исходники очередного контроллера
Что-то исходники жесть, сплошной партянкой идут
Кто нибудь MPX4115 “мучал” ??
Размышляю щас как с ним быть: отдельный АЦП?, аналоговый усилитель?, хотелось бы разрешения побольше, а то еще и с сонаром связываться неохота (и так все законы физики и математики на одной плате:))…
Кто нибудь MPX4115 “мучал” ??
ну так с него все и начиналосЪ …
оно стояло у немцев еще назаре коптеростроения … и на русокоптере … оцифровывалосЪ ADS1100 …
Кто нибудь MPX4115 “мучал” ??
Размышляю щас как с ним быть: отдельный АЦП?, аналоговый усилитель?, хотелось бы разрешения побольше, а то еще и с сонаром связываться неохота (и так все законы физики и математики на одной плате:))…
А что с ним не так? У стма на борту 10-разрядный АЦП , берем и меряем 😃
А что с ним не так?
Все хорошо, но по самым оптимистическим подсчетам разрешение (по моим подсчетам…) +/- 2 метра выходит, для самолета за глаза, а для коптера как то некрасиво будет выглядеть в режиме удержания позиции…
отдельный АЦП?
Да - да отдельный АЦП бита так 24 по SPI и датчики остальные тоже аналоговые - моя мечта (autoqad Билла Несбита не предлогать у меня денег нет 😃 )
У стма на борту 10-разрядный АЦП , берем и меряем
чёй-та мне казалось 12 или я что-то путаю? это у атмег 10-битный…
У меня две проблемы, злосчастный затыкающйся UART и i2c - видит зараза только одно устройство (на мелкоплате так-же сидело 4 устройства) видит барометр, магнитометр не признаёт, выпаивал барометр - видит магнитометр, отключаю баро (программно) не видит магнитометр, что-то в программном, ибо схему перепроверил уже не один раз, адреса устройств естественно разные 😦
не видит магнитометр
Судя по Вашему посту, не меняя кода (а только при выпаивании) у Вас “видится” одно из устройств, вывод - дело не в коде, i2c иногда капризничает, обратите внимание на номинал подтягивающих резисторов, можно ставить от 10 до 4.7 кОМ…
чёй-та мне казалось 12 или я что-то путаю? это у атмег 10-битный…
Да, 12 бит , чейто попутал 😃
i2c - видит зараза только одно устройство (на мелкоплате так-же сидело 4 устройства) видит барометр, магнитометр не признаёт, выпаивал барометр - видит магнитометр, отключаю баро (программно) не видит магнитометр,
Странно, такое впечатление что либо неправильно настроены и2ц выводы контроллера, либо серьёзный косяк в разводке шины.
либо серьёзный косяк в разводке шины
не я склоняюсь к какому-то глобальному косяку i2c работает без проблем - ошибок нет и уарт должен работать, как буд-то забывает что-то или с прерываниями косяк или ещё что, надо пересматривать весь проект…
можно ставить от 10 до 4.7 кОМ…
на 5 вольтах, на 3.3 надо попробовать 1кОм влепить, на мелкоплате 4.7 на этой тоже…
Всё нормально i2c запущена в полном объёме - сопля была мелкая помиж лап проца на пару килоом, а в баро не надо читать ничего точнее вычитать 0х00 - что с успехом и делалось, остался уарт, эта зараза на вход работает, а на выходе каша и вешается 😦 ну ещё одно усилие - побороть его и с песней к новым глюкам 😃
Ради эксперимента залил Wii на f4 , т.к. UART сделан также, хотелось проверить - работает зараза, а у меня нет, значит проблема где-то в другом месте 😦 , а не в uarte и dma …
Злосчастный 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-г на мелкоплате работает, тактирование периферии и портов включено зарание…
как и обещал… схема контроллера gfile.ru/av2Z
не до конца правда поправлена + есть мелкие но не критичные недочеты…
также начал потихоньку паять платку… правда полностью готова будет не скоро - пока нет мелочевки 0605, разъемов и еще мелочи разной…
Злосчастный UART+DMA, может кто найдёт ошибку
В приведённом коде ошибки не нашел, что отладчик говорит? Попробуй в начале программы сделать цикл с посылкой сисмвола в порт.
Блин сегодня приснилось - где ошибка и почему так происходит, но проснулся и забыл начисто 😦 надо кодятник пересмотреть может вспомню…
Попробуй в начале программы сделать цикл с посылкой сисмвола в порт.
после инициализации порта зациклить хрень типа «Hello, world!» - попробую как время будет…
интересно если в serial ткнуть точку останова, тормознёт или нет - чёт мне подсказывает что проскочит…
после инициализации порта зациклить хрень типа «Hello, world!» - попробую как время будет…
Да, это покажет работу порта на передачу.
интересно если в serial ткнуть точку останова, тормознёт или нет - чёт мне подсказывает что проскочит…
тормознёт.
ну тогда хоть увижу что оно пихает в порт…
Доброго времени суток, небольшой вопрос к Сергею (SergDoc) - А почему для создания собственной системы стабилизации Вы выбрали ARM?
Сам сейчас так же с нуля пишу систему стабилизации на AVR (не подсматривая в готовые), и взвешиваю ЗА и ПРОТИВ разных платформ.
У ARM конечно потенциально возможностей больше, ибо фактически компьютер, но вот задач под эти возможности не вижу.
А с AVR - наоборот. Взять готовую МЕГУ2560, там места хватит подо всё.
В моём понимании коптер - жесткий автомат:
- Стабилизация.(уже сделано в любом, самом дешевом.)
- Определение местоположения.(так же, разве что в КуКе нет.)
- Блокировка ошибочных действий оператора. (вывод из падений, запрет превышения скоростей и.т.д.) - пока готовых не видел, но вполне решаемо.
- Логгирование полёта.
- Передача телеметрии.
------- Всё указанное спокойно решается AVR.
А вот задачи под ARM - распознавание препятствий по видео? - На ползающих не научились ещё массово это делать, что уж говорить про летающие.
Лучше радар поставить (AVR опять же) больше будет работоспособности.
Поиск горизонта?
Работа по алгоритму?
Нейронное обучение?
Как ни ломал голову себе, задач под ARM не нашел. Вот и интересно Ваши мотивы. Если это не тайна конечно.