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

mataor

кстати такой вопрос…
а в чем глобальный смысл использовать ДМА для уарта?
разницу в использовании процессора наврятли заметим - уарт работает без участия ЦПУ, а по времени засунуть байт в уарт или в ДМА -> уарт думаю что разницы не будет.

единственная разница будет в том случае, если ДМА будем передавать весь буфер целиком.

так что без переработки этого участка плюсов в ДМА не вижу.

rual
mataor:

а в чем глобальный смысл использовать ДМА для уарта?

правильный вопрос! объем данных и частота передачи не высокие. Кольцевой буфер на прерываниях никак не замедлит проц.

okan_vitaliy:

Короче без кольцевого тут не обойтись.

это оптимальное решение.

SergDoc

легко проверить - перенаправить всё во 2-й уарт (он без ДМА) если всё канает то и убирать ДМА к чертям, получается Ф4 пихает в UART столько, что тот не может пережевать, и увеличение буфера да и кольцевой тут не помогут - всё равно рано или позно наступит переполнение.
во всех файлах где есть uart1 заменить на 2, остальное вроде идентично - третий по умолчанию gps…
а если при переполнении буфера его тупо очищать - потеря нескольких пакетов ну как-то вообще ничего не испортит?
у меня сейчас есть некоторые затруднения - сам проверить ничего не могу 😦

Sir_Alex

ИМХО, в данной ситуации, надо дропать пакеты. Протокол ессесно должен уметь это переваривать (ну т.е. ничего страшного не должно произойти если что то не дойдет до адресата).

SergDoc

будет писать в счётчик ошибок пакетов в гуи - только и всего…

вот это работает, только не знаю с ДМА или без, просто прошивку заливал себе проверить порт: code.google.com/p/uavp-mods/

void InitSerialPort(uint8 s) {
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	DMA_InitTypeDef DMA_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	SerialPortDef * u;

	u = &SerialPorts[s];

	if (u->Used) {

		GPIO_StructInit(&GPIO_InitStructure);
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
#ifdef STM32F1
		GPIO_InitStructure.GPIO_Pin = u->TxPin;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
		GPIO_Init(u->Port, &GPIO_InitStructure);

		GPIO_InitStructure.GPIO_Pin = u->RxPin;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
		GPIO_Init(u->Port, &GPIO_InitStructure);
#else
		GPIO_StructInit(&GPIO_InitStructure);
		GPIO_InitStructure.GPIO_Pin = u->TxPin | u->RxPin;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
		//GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
		GPIO_Init(u->Port, &GPIO_InitStructure);

		GPIO_PinAFConfig(u->Port, u->TxPinSource, u->USART_AF);
		GPIO_PinAFConfig(u->Port, u->RxPinSource, u->USART_AF);
#endif
		USART_StructInit(&USART_InitStructure);
		//USART_InitStruct->USART_Parity = USART_Parity_No;
		USART_InitStructure.USART_BaudRate = u->Baud;
		USART_Init(u->USART, &USART_InitStructure);

		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

		TxQTail[s] = TxQHead[s] = TxQNewHead[s] = 0;

		if (u->DMAUsed) {
			// Common
			DMA_StructInit(&DMA_InitStructure);
			DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
			DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
			DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32) &u->USART->DR;
			DMA_InitStructure.DMA_BufferSize = SERIAL_BUFFER_SIZE;

			// Receive DMA
			DMA_DeInit(u->RxDMAStream);

			DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32) &u->USART->DR;
			DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
#ifdef STM32F1
			DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
			DMA_InitStructure.DMA_MemoryBaseAddr = (uint32) RxQ[s];
#else
			while (DMA_GetCmdStatus(u->RxDMAStream) != DISABLE) {
			};
			DMA_InitStructure.DMA_Channel = u->DMAChannel;
			DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
			DMA_InitStructure.DMA_Memory0BaseAddr = (uint32) RxQ[s];
#endif
			DMA_Init(u->RxDMAStream, &DMA_InitStructure);
			DMA_Cmd(u->RxDMAStream, ENABLE);
			USART_DMACmd(u->USART, USART_DMAReq_Rx, ENABLE);

			RxQTail[s] = RxQHead[s] = SERIAL_BUFFER_SIZE
					- DMA_GetCurrDataCounter(u->RxDMAStream);

			// Transmit DMA
			NVIC_InitStructure.NVIC_IRQChannel = u->TxDMAISR;
			NVIC_Init(&NVIC_InitStructure);

			DMA_DeInit(u->TxDMAStream);
#ifdef STM32F1
			DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
#else
			while (DMA_GetCmdStatus(u->TxDMAStream) != DISABLE) {
			};
			DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
			//	DMA_InitStructure.DMA_Memory0BaseAddr = (uint32) TxQ[s];
#endif
			DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
			DMA_Init(u->TxDMAStream, &DMA_InitStructure);

			DMA_SetCurrDataCounter(u->TxDMAStream, 0);
			DMA_ITConfig(u->TxDMAStream, DMA_IT_TC, ENABLE);

			USART_DMACmd(u->USART, USART_DMAReq_Tx, ENABLE);
		} else if (u->InterruptsUsed) {
			RxQTail[s] = RxQHead[s] = 0;
			NVIC_InitStructure.NVIC_IRQChannel = u->ISR;
			NVIC_Init(&NVIC_InitStructure);

			USART_ITConfig(u->USART, USART_IT_RXNE, ENABLE);
		}
		USART_Cmd(u->USART, ENABLE);
	}

} // InitSerialPort
oleg70
okan_vitaliy:

Короче мне так кажется - нужно loop садить куда нибудь в прерывание.

Да, алгоритм стабилизации в первую очередь…, и других прерываний как можно меньше стараться делать тогда время цикла стабильно.
Тем более все успевает обработаться включая ПИД даже на моих 72Мгц (не говоря уж 168)…

rual
oleg70:

все успевает обработаться включая ПИД даже на моих 72Мгц (не говоря уж 168)…

У меня на Ф1 без аппаратной плавучки всё успевало работать в прерываниях.

Coreglider

Приём по юсарту я использую в прерываниях, передачу - через DMA.

dmaInitStr.DMA_BufferSize=4; //неважно
dmaInitStr.DMA_DIR=DMA_DIR_PeripheralDST;
dmaInitStr.DMA_M2M=DMA_M2M_Disable;
dmaInitStr.DMA_MemoryBaseAddr=(u32)commTxBuffer;
dmaInitStr.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
dmaInitStr.DMA_MemoryInc=DMA_MemoryInc_Enable;
dmaInitStr.DMA_Mode=DMA_Mode_Normal;
dmaInitStr.DMA_PeripheralBaseAddr=(uint32_t) &(COMM_USART->DR);
dmaInitStr.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
dmaInitStr.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
dmaInitStr.DMA_Priority=DMA_Priority_Medium;
DMA_Init(COMM_DMA_CHANNEL,&dmaInitStr);
void sendCommInterface(unsigned short num)
{
if(DMA_GetCurrDataCounter(COMM_DMA_CHANNEL) ==0){
DMA_SetCurrDataCounter(COMM_DMA_CHANNEL,num);
DMA_Cmd(COMM_DMA_CHANNEL,ENABLE); }
}

Но, после отправки посылки через дма надо проверять флаг USART_SR_TC
чтобы удостовериться что данные точно ушли, ибо конец передачи дма не означает конец передачи данных, и запись новых данных приводит к потерям.

Sir_Alex

Очередная реклама 10DOF свалилась на почту, мот кому то будет интересно:

Dear Aleksey,
Wanted to take the opportunity to introduce Sensoplex’s 10 axis Motion Tracking Sensor + Bluetooth Low Energy Module.

It includes the latest Invensense 9 axis MPU9250 (accel+gyro+compass) + a pressure sensor, CPU + 128K Flash + RF link (BTLE). It also includes a micro USB for Li-ion Battery charging and a connector for embedded applications. The internal DMP (digital motion processor) and on board CPU perform sensor fusion and provide the raw or fused data through the connector or RF link to the rest of the system.

The module can be viewed as a technology platform or a stand-alone product which can be custom modified to your requirements.
Different software loads can enable simple motion tracking or customized applications.
It is offered in several standard flavors including 10/9/7 and 6 axis initially (pressure sense optional).

Samples and Evaluation boards available Aug 14th2013.
Single quantity pricing is $99.00 (100K < $20.00)
Development kits options are

  • $649 (full version – 3 modules + 2 adapter cards + cable and software)
  • $399 (2 modules, 1 adapter board + cable and software)
    Let us know if we can assist you.

Подробнее можно узнать у них на сайте. ИМХО, Dev кит должны чуть ли не бесплатно отдавать…

SergDoc

вот злосчастный кодятник: github.com/SergDoc/…/drv_uart.c
и точно не знаю, то-ли буфер переполняется, то-ли ещё что, сейчас проверить не могу 😦
работает с затычкой:

void uartWrite( uint8_t ch)
{
	  while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE) { // тормозилка :(
			};
    txBuffer[txBufferHead] = ch;


    txBufferHead = (txBufferHead + 1) % UART_BUFFER_SIZE;




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

естественно с тормозом 😦

Sir_Alex:

Подробнее можно узнать у них на сайте

А хде ? что за контора?

mataor

блин таки решил занятся SD карточкой… начал ковырятся и встал перед такой дилемой: портануть библиотечки от обычных мег или воспользоватся готовой от атмел 😃
первый вариант удобен в кол-ве файлов, а второй в функционале, но минус в баальшой куче файлов из которых большинство ненужно…

SergDoc
Sir_Alex:

Дык написано жеж, Sensoplex:

а мне по названию одни матрасы сыпапались 😃

Gapey
Sir_Alex:

Дык написано жеж, Sensoplex: www.sensoplex.com

неслабо ребятки хотят , 500% прибыли … а главное зачто ???
к блютузному процу прицепили MPU и BARO … и все … математики как я понял пока нет …
да и плат на 9250 пока нет … те платы что на фото датчик стоит LGA24 , а должен быть LGA16 , и барометра невидно …
такчто на фото скорее всего SP-6BN а не SP-10BN , а вот SP-10B вполне реально существует , только там MPU6xxx + компас + baro скорее всего bmp180 …
с учетом того что с плат кроме USB и блютуза ничего не выведено оно неочень интересно для коптерной тематики …

SergDoc
mataor:

блин таки решил занятся SD карточкой…

ну мне ещё верхняя плата не приехала, так что и даже ещё не заморачивался с карточкой…

Gapey:

оно неочень интересно для коптерной тематики …

я пдф-ки посмотрел - хрень какая-то 😦

Gapey
SergDoc:

я пдф-ки посмотрел - хрень какая-то

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

Sir_Alex
Gapey:

да и плат на 9250 пока нет … те платы что на фото датчик стоит LGA24 , а должен быть LGA16 , и барометра невидно …

Так в прессрелизе и написано, что в продажу поступи тока 14 августа.
Да, я то же согласен, что для нас неудачная девайсина. Все таки сейчас рулят готовые контроллеры, а не Arduino + IMU

mataor

так, натолкнулся случайно, думаю есть смылс оставить ссылку тут
(PDF) Preface
что это такое - здоровенный (325 стр.) талмут с теорией, реализацией и практикой ИНС гиро+аксель+компас+баро+ЖПС с кучей соответствующих расчетов, графиками и кодом.
кстати с калманом.

SergDoc

тоска заела - хочется собрать обратно свою старую добрую трёху, за одно 8-й таймер потестить(сервы), а то только на столе проверял, да и складная она у меня, но блин и квадрик разбирать не хочу - вот и маюсь 😦

okan_vitaliy
SergDoc:

тоска заела - хочется собрать обратно свою старую добрую трёху, за одно 8-й таймер потестить(сервы), а то только на столе проверял, да и складная она у меня, но блин и квадрик разбирать не хочу - вот и маюсь 😦

Надо действовать Сергей, а то китайцы нас сделают.