Sida 3 av 5

Re: µQuad (Liten quadrokopter)

Postat: 20 juni 2013, 14:08:15
av Icecap
NULL: Kv-värdet anger det värde där motorn rullar så snabbt att den genererade spänning motsvarar inkommande varför den inte driver något alls. Man kan säga att motorn aldrig kan komma att köra snabbare än detta varvtal.

Verkliga RPM-värde beror såklart på belastning osv.

Re: µQuad (Liten quadrokopter)

Postat: 20 juni 2013, 20:31:53
av Korken
victor_passe:
Anledningen att göra så är att estimeringen inte kan hinna divergera under snabba rörelser och desto mindre quad desto snabbare kan den röra sig.
Sedan kör man bara regleringen så fort som det behövs för att styra systemet och 10-20 ggr snabbare än den högsta frekvensen i systemet brukar va bra riktmärke.

Re: µQuad (Liten quadrokopter)

Postat: 14 juli 2013, 16:00:51
av victor_passe
Har jobbat lite mer nu på quaden, har gett upp med nrf modulen, den vill bara inte.
Monterade på en liten BT modul som funkar perfekt.
CIMG0752.JPG
CIMG0751.JPG
CIMG0753.JPG
Har implementerat ett komplementär filter:
(bara plottar och skit)
(virtuell horisont)

Det funkar bra men jag måste höja min brytfrekvens för antiuppbygningsfiltret på den integrerade gyro datan.
Och kanske sänka brytfrekvensen för komplementär filtret.

Re: µQuad (Liten quadrokopter)

Postat: 14 juli 2013, 16:27:07
av Korken
Snyggt! :tumupp:

När det kommer till estimeringen så skulle jag rekommendera ett enkelt linjärt KF (typ som det LHelge designade för länge sedan) då du ändå har en ganska kraftig processor.
För sättet du kompenserar bias på skulle jag personligen kanske inte lita på till 100%, men en integrator på de viset introducerar man negativ fasförskjutning i estimeringsloopen vilken kan ställa till det.
Man kan skapa en komplementär estimering av bias genom att kolla på vinkelerrorn och integrera den väldigt sakta, men har sätt få filter som gör det.
Gradient Descent algoritmer är mer populära för komplementär estimering från vad jag har sätt, har du kollat något på detta?

Och keep up the good work! :D

Re: µQuad (Liten quadrokopter)

Postat: 14 juli 2013, 16:50:37
av blueint
Hur mycket väger µQuad:en? vilken lyftkraft har den (newton) ?
Drifttid? effekt?

Re: µQuad (Liten quadrokopter)

Postat: 15 juli 2013, 07:31:48
av Greve Hamilton
Vad hade du för problem med nordic-kretsen? Fick du ingen kontakt med den alls eller fungerade inte radiodelen?

Re: µQuad (Liten quadrokopter)

Postat: 15 juli 2013, 09:00:57
av victor_passe
Jag fick in den i TX läge, den biasade utgångssteget i någon ms så jag antar att den även skickade.
Jag satte samma adress och samam frekvens på den andra kretsen, fick in den i RX läge men kunde inte få över någon data.


Så jag slog på carrier send på enhet 1 som ska sända bärvåg hela tiden.
Och tittade på carrier detect på enhet 2, den blev aldrig 1.

Jag provade med antenerna 1mm till 1m ifrån varandra, fick aldrig över någon data.

Hade jag haft en enhet som jag vet funkar skulle det vara lättare att felsöka, då skulle jag kunna se om det var RX eller TX som krånglade, men nu vet jag inte vilken det är eller om det är båda.

Kanske försöker igen med det senare.
Men nästa steg nu är PID.

Korken:
Jag är inte så bra på regler så jag testar med sådant som jag förstår.
Men om inte detta funkar så ska jag prova att implementera ett enkelt KF.

Re: µQuad (Liten quadrokopter)

Postat: 15 juli 2013, 12:37:14
av lizerdboy
victor_passe: åå vart har du köpt ST blåtandsmodul, ser att det är den du använt.
Jag har inte hittat vart jag kan köpa den.
Gissar att det är SPBT2632C2A som du använt.

Så jag har fått sampla den för att få tag på den till ett av mina projekt.

Re: µQuad (Liten quadrokopter)

Postat: 15 juli 2013, 13:01:46
av victor_passe
samplade jag med.

Re: µQuad (Liten quadrokopter)

Postat: 15 juli 2013, 13:41:28
av lizerdboy
haha oki, hur många fick du ?

Re: µQuad (Liten quadrokopter)

Postat: 15 juli 2013, 15:10:56
av victor_passe
samplade bara 1, visst är nog frakten dyrare än modulen men det känns inte korrekt att ta fler än jag behöver.
De finns på mouser för runt 13$.

Dock ska det vara en liknande µC i BT modulen som på quaden, jag har letat efter källkoden till BT modulen så man kan få in allt på BT module, det skulle vara ballt.
Men jag har inte hittat något, man får nog öppna plånboken skulle jag chansa på.

Re: µQuad (Liten quadrokopter)

Postat: 15 juli 2013, 17:16:20
av lizerdboy
yeep dom finns på mouser och på många andra ställen med.
Problemet är att Mouser och dom jag pratade med inte får sälja till Sverige då modulen innehåller krypterings funktioner.
Och det skapar problem då dom inte får exportera utrustning med krypterings teknik om dom inte har avtal för det, vilket inte mouser hade.

Så jag pratade med ST och fick 2st extra moduler, jag fick bara en från sampling och behöver en till för mitt bevattnings projekt.

Hehe de skulle vara ballt, dock så är det lite snålt med pinnar på BT modulen, dom har en till med flera IO, sen om den funkar de har jag ingen aning om.

Re: µQuad (Liten quadrokopter)

Postat: 15 juli 2013, 19:29:32
av Greve Hamilton
victor_passe skrev:Jag fick in den i TX läge, den biasade utgångssteget i någon ms så jag antar att den även skickade.
Jag satte samma adress och samam frekvens på den andra kretsen, fick in den i RX läge men kunde inte få över någon data.

Så jag slog på carrier send på enhet 1 som ska sända bärvåg hela tiden.
Och tittade på carrier detect på enhet 2, den blev aldrig 1.

Jag provade med antenerna 1mm till 1m ifrån varandra, fick aldrig över någon data.

Hade jag haft en enhet som jag vet funkar skulle det vara lättare att felsöka, då skulle jag kunna se om det var RX eller TX som krånglade, men nu vet jag inte vilken det är eller om det är båda.
Hmm, tråkigt att höra. Har just ritat och beställt ett kort där det ska sitta en Nordic radio på och jag nojar lite över att min layout inte är helt ok; halvkass skärmning kring radiodelen. Speciellt om det skulle vara så att det är just den som är problemet för dig (vilket vi iofs inte har en susning om) och med tanke på att din ser klart bättre ut än min. Jag har dock två moduler som det inte vara några större problem att få fart på, så felsökningen blir ju lättare för mig. ;)

Men det vore verkligen roligt om du hade kunnat göra quaden ännu mindre som du nämner i videon. Tror inte att jag har sett någon som är mindre än denna storlek, samma storleksordning som Crazyflie.

Re: µQuad (Liten quadrokopter)

Postat: 15 juli 2013, 19:38:35
av Korken
Greve Hamilton & victor_passe:
Jag har arbetat mycket med den kretsen, har gjort allt från trådlös CAN, SPI, I2C oc hUART med den (och en MCU till) och jag har aldrig haft problem med den.
Kan nu lägga upp designen så ska jag ta en titt och se om jag hittar något fel. :) För det är sjukt underbara kretsar när man väl har fått dom att fungera.

Re: µQuad (Liten quadrokopter)

Postat: 15 juli 2013, 19:44:44
av victor_passe
nrf_spi.c

Kod: Markera allt

#include "stm32f10x_rcc.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_gpio.h"
#include "misc.h"
#include "nrf_spi.h"
#include "cBuffer.h"
#include "led.h"


static CBUFFER nrfTxBuffer, nrfRxBuffer;
static unsigned char nrfRawTxBuffer[64], nrfRawTxBufferElementsLeft=0;
static unsigned char nrfRawRxBuffer[64], nrfRawRxBufferWritePointer=0,nrfRawRxBufferElementsToRead=0;

static unsigned char nrfBusy=0;
static unsigned char nrfIsInTxMode=0;
static unsigned char nrfStatusRegister=0;

void nrfInit()
{

	//Init buffers
	CBufferNew(&nrfRxBuffer, sizeof(RADIO_PKG_TYPE), NRF_BUFFER_LENGTH);
	CBufferNew(&nrfTxBuffer, sizeof(RADIO_PKG_TYPE), NRF_BUFFER_LENGTH);


	//Start clocks
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

	//Init I/O
	GPIO_InitTypeDef GPIO_InitStruct;

	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);

	nrfSetCSN();
	nrfSetCE();

	//Init SPI
	SPI_InitTypeDef SPI_InitStruct;
	SPI_StructInit(&SPI_InitStruct);
	SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
	SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
	SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;
	SPI_Init(SPI1,&SPI_InitStruct);
	SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE,ENABLE);
	SPI_Cmd(SPI1,ENABLE);

	//Init interrupts
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel=SPI1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=7;//Semi low priority, this is not timing critical
    NVIC_InitStruct.NVIC_IRQChannelSubPriority=7;
    NVIC_Init(&NVIC_InitStruct);


    nrfSendCommand(NRF_WRITE_MASK | 0, &((unsigned char){0b00111111}), 1);//Enable
    while(nrfBusy);
    nrfSendCommand(NRF_WRITE_MASK | 1, &((unsigned char){0}), 1);//No autoack
    while(nrfBusy);
    nrfSendCommand(NRF_WRITE_MASK | 2, &((unsigned char){1}), 1);//Datapipe 0
    while(nrfBusy);
    nrfSendCommand(NRF_WRITE_MASK | 3, &((unsigned char){3}), 1);//3Byte addr
    while(nrfBusy);
    nrfSendCommand(NRF_WRITE_MASK | 4, &((unsigned char){0}), 1);//No Retransmit
    while(nrfBusy);
    nrfSendCommand(NRF_WRITE_MASK | 5, &((unsigned char){0x7F}), 1);//Highest frequency
    while(nrfBusy);
    nrfSendCommand(NRF_WRITE_MASK | 6, &((unsigned char){0b00100110}), 1);//Max power minimum speed
    while(nrfBusy);
    nrfSendCommand(NRF_WRITE_MASK | 17, &((unsigned char){sizeof(RADIO_PKG_TYPE)}), 1);//5Bytes in each package
    while(nrfBusy);
}

unsigned char nrfPendingRxPackage()
{
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4))
		return 0;
	return 1;
}

void nrfSendCommand(unsigned char addr, unsigned char *data, unsigned char length)
{
	if(nrfRawTxBufferElementsLeft)
		return;
	nrfRawTxBufferElementsLeft=length+1;
	nrfRawRxBufferElementsToRead=length+1;
	nrfRawRxBufferWritePointer=0;
	nrfRawTxBuffer[length]=addr;
	while(length--)
		nrfRawTxBuffer[length]=*data++;
	SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_TXE,ENABLE);
}

void nrfSendPackage(unsigned char addr, unsigned char valueAddr, unsigned short value)
{
	RADIO_PKG_TYPE package;
	package.readRequest=0;
	package.unitAddr=NRF_MY_ADDR;
	package.value=value;
	package.valueAddr=valueAddr;
	CBufferPush(&nrfTxBuffer,&package);
}

RADIO_PKG_TYPE nrfReadPackage()
{
	RADIO_PKG_TYPE package;
	package.readRequest=0;
	package.unitAddr=0;
	package.value=0;
	package.valueAddr=0;
	if(!CBufferUsed(&nrfRxBuffer))
		return package;
	CBufferPull(&nrfRxBuffer,&package);
	return package;
}

void nrfSetCE()
{
	GPIO_SetBits(GPIOB,GPIO_Pin_1);
}

void nrfResetCE()
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_1);
}

void nrfSetCSN()
{
	GPIO_SetBits(GPIOB,GPIO_Pin_0);
}

void nrfResetCSN()
{
	GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}

void nrfParseRxBuffer()
{
	nrfStatusRegister=nrfRawRxBuffer[0];
}

void SPI1_IRQHandler()
{
	if(SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE))
	{
		unsigned char data;
		data=SPI_I2S_ReceiveData(SPI1);

		if(nrfRawRxBufferElementsToRead)
		{
			nrfRawRxBuffer[nrfRawRxBufferWritePointer++]=data;
			nrfRawRxBufferElementsToRead--;
		}

		if(!nrfRawRxBufferElementsToRead)//All done here
		{
			nrfParseRxBuffer();
			nrfSetCSN();
			nrfBusy=0;
		}
		//SPI_I2S_ClearITPendingBit(SPI1,SPI_I2S_IT_RXNE);
	}
	if(SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_TXE))
	{
		if(nrfRawTxBufferElementsLeft)
		{
			nrfBusy=1;
			nrfResetCSN();
			while(SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_TXE) && nrfRawTxBufferElementsLeft)
				SPI_I2S_SendData(SPI1,nrfRawTxBuffer[--nrfRawTxBufferElementsLeft]);

			if(!nrfRawTxBufferElementsLeft)
				SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_TXE,DISABLE);
		}
		//SPI_I2S_ClearITPendingBit(SPI1,SPI_I2S_IT_TXE);
	}

}

//Here we want to move packages from tx buffer to raw tx buffer
void nrfProcess1000Hz()
{
	static unsigned char state=0;
	if(!nrfBusy && !nrfRawTxBufferElementsLeft && CBufferUsed(&nrfTxBuffer))//If we can send data and have data to send
	{
		if(state==2)
		{
			RADIO_PKG_TYPE package;
			CBufferPull(&nrfTxBuffer,&package);
			nrfSendCommand(0xA0, (unsigned char*)(&package), sizeof(RADIO_PKG_TYPE));//Send data
			state=0;
			nrfSetCE();
		}
		else if(state==1)
		{
			nrfSendCommand(0xE1, 0, 0);//Flush Buffer
			nrfIsInTxMode=1;
			state=2;
		}
		else if(state==0)
		{
			nrfResetCE();
			nrfSendCommand(NRF_WRITE_MASK | 0, &((unsigned char){0b00111110}), 1);//Enter TX mode
			nrfIsInTxMode=1;
			state=1;
		}
	}
	else if(nrfIsInTxMode)
	{
		nrfSendCommand(NRF_WRITE_MASK | 0, &((unsigned char){0b00111111}), 1);//Enter RX mode
		nrfIsInTxMode=0;
		state=0;
	}

}
nrfspi.h

Kod: Markera allt

#ifndef __NRF_SPI_H_
#define __NRF_SPI_H_

/*The RADIO_CMD_TYPE works as following
 * unitAddr is a unique addr for each unit
 * readRequest is 1 when the package is a read request, otherwise it is 0
 * valueAddr is the addr of the value that is to be read or is present in the package
 * value is the value, this value is irrelevant for readRequest=1
 */


typedef struct {
	unsigned char unitAddr;
	unsigned char readRequest;
	unsigned char valueAddr;
	unsigned short value;
} RADIO_PKG_TYPE;

#define NRF_BUFFER_LENGTH	32
#define NRF_MY_ADDR	15


#define NRF_WRITE_MASK	0b00100000


void nrfSendCommand(unsigned char , unsigned char *, unsigned char );
void nrfInit();
void nrfSetCE();
void nrfResetCE();
void nrfSetCSN();
void nrfResetCSN();
void nrfProcess1000Hz();
unsigned char nrfPendingRxPackage();
void nrfSendPackage(unsigned char, unsigned char, unsigned short);
#endif
Pic koden skickar samma saker fast annan kod givetvis.
Jag tror att felet ligger antigen i configurationen, alltså värderna jag sätter allt till i uppstart eller att jag missförstår state diagrammen och inte kommer in i lägena korrekt

Men som sagt så tror jag att den skickar då jag ser att den lägger på ca 1.8V på VDD_PA under 1ms.
Om felet skulle vara antenn desigen så kan jag köpa att räckvidden skulle vara kort, men den är <1mm i så fall.
Och jag har exakt samma komponent värden som i referens desigen i databladet och väldigt korta ledare.