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

SergDoc

Сразу предупреждаю я не программист, вот исходник с которым я воюю:

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

{
asm volatile (“NOP”); asm volatile (“NOP”);
asm volatile (“NOP”); asm volatile (“NOP”);
asm volatile (“NOP”); asm volatile (“NOP”);
asm volatile (“NOP”);
}
это цикл ожидания прервываний я так понимаю ?

SergDoc

пишут одно а на самом деле другое там флешка по ISP подключена

SergDoc

Я это уже читал они кстати взаимозаменяемые, проблем у меня несколько, 1 когда его читать 2 нужен ли порт CS 3 вообще как привязатся к полученным значениям, Кальман - тогда полное написания софтины с нуля.
Была мысль использовать один из генераторов прерываний - повесить на свободный порт, есть изменения -> читать, вообщем буду пробовать разные варианты всё равно ещё застой не меньше месяца может чё и придумаю, сначала окуратно для себя разложу полностью прошивку корейца по полочкам, а там уже буду менять…

SergDoc

Чёт создаётся впечатление что у программеров с которыми я общаюсь (вне форума) понятия о программировании даже ниже моих, неужели это так сложно?

RW9UAO:

гироскопы вы опрашиваете по аналоговым входам. в КК опрос идет поллингом.

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

RW9UAO

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

SergDoc
RW9UAO:

ищите процедуру read_adc(). смотрите в нее, там указание канала и ожидание готовности.

А слона то я и не приметил, а теперь для тех кто с бронепоезда - если я вклинюсь в эти процедуры считаю акселерометр воткну филтр Кальмана www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=125320229… и верну полученное значение вместо данных с гироскопа? а дальше пущай полетает?

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

RW9UAO

вот смотрите, читается состояние гироскопов

	//--- Read gyros ---
	ReadGyros(false);
//вот тут можно сунуть опрос акселерометра

потом идет математика.

	//--- Start mixing by setting collective to motor input 1,2,3 and 4 ---
	//--- Calculate roll gyro output ---
	//--- (Add)Adjust roll gyro output to motors

и вместо простой пропорции вы можете поставить псевдоКалмана с вашей ссылки и ПИДЫ.
сигнал CS акселерометра вы повесьте на свободную ногу контроллера. мега поймет, что она мастер если выставить правильный бит при инициализации.

#include <iom128v.h>
#include <macros.h>
#include "main.h"
#include "tx_xemix.h"

//==============================================================================
//SPI initialize
void spi_init(void){
 //SPCR = 0x57; //setup SPI
 //SPCR = 0x57 | BIT(3); //setup SPI
 //SPCR = BIT(6) | BIT(4) |BIT(3) | 3;// SPE, MSTR, CPOL, fosc /128
 SPCR = BIT(6) | BIT(4) |BIT(3) | BIT(2) | 3;// SPE, MSTR, CPOL, CPHA, fosc /128
 //SPCR = BIT(6) | BIT(4) |BIT(3) | BIT(2) | 1;// SPE, MSTR, CPOL, CPHA, fosc /16
 SPSR = 0x00; //setup SPI
}
//==============================================================================
unsigned char spi(unsigned char x){
	SPDR = x;
	while(!(SPSR & (1<<SPIF)));
	return SPDR;
}
//==============================================================================
void read_ADIS(void){
unsigned char s;

	PORTB &= ~BIT(ADIS_CS);//set CS
	//spi(0x80 | );// WR
	spi(0x00 | 0x03);// next - Power supply output data
	spi(0x00);
	PORTB |= BIT(ADIS_CS);	//clear CS

	for(s = 0; s < 100; s++){NOP();}

	PORTB &= ~BIT(ADIS_CS);	//set CS
	SUPPLY_OUT = spi(0x05);// next - X-Axis Acceleration Data
	SUPPLY_OUT = SUPPLY_OUT << 8;
	SUPPLY_OUT |= spi(0x00);
	SUPPLY_OUT &= 0x3FFF;
	PORTB |= BIT(ADIS_CS);	//clear CS

	for(s = 0; s < 100; s++){NOP();}

	PORTB &= ~BIT(ADIS_CS);	//set CS
	XACCL_OUT = spi(0x07);// next - Y-Axis Acceleration Data
	XACCL_OUT = XACCL_OUT << 8;
	XACCL_OUT |= spi(0x00);
	XACCL_OUT &= 0x3FFF;
	PORTB |= BIT(ADIS_CS);	//clear CS

	for(s = 0; s < 100; s++){NOP();}

	PORTB &= ~BIT(ADIS_CS);	//set CS
	YACCL_OUT = spi(0x0D);// next - X-Axis Inclination Data
	YACCL_OUT = YACCL_OUT << 8;
	YACCL_OUT |= spi(0x00);
	YACCL_OUT &= 0x3FFF;
	PORTB |= BIT(ADIS_CS);	//clear CS

	for(s = 0; s < 100; s++){NOP();}

	PORTB &= ~BIT(ADIS_CS);	//set CS
	XINCL_OUT = spi(0x0F);// next - Y-Axis Inclination Data
	XINCL_OUT = XINCL_OUT << 8;
	XINCL_OUT |= spi(0x00);
	XINCL_OUT &= 0xFFF;
	PORTB |= BIT(ADIS_CS);	//clear CS

	for(s = 0; s < 100; s++){NOP();}

	PORTB &= ~BIT(ADIS_CS);	//set CS
	YINCL_OUT = spi(0x0B);// next - Sensor Temperature Data
	YINCL_OUT = YINCL_OUT << 8;
	YINCL_OUT |= spi(0x00);
	YINCL_OUT &= 0xFFF;
	PORTB |= BIT(ADIS_CS);	//clear CS

	for(s = 0; s < 100; s++){NOP();}

	PORTB &= ~BIT(ADIS_CS);	//set CS
	TEMP_OUT = spi(0x03);// next - Power Supply Data
	TEMP_OUT = TEMP_OUT << 8;
	TEMP_OUT |= spi(0x00);
	TEMP_OUT &= 0x3FFF;
	PORTB |= BIT(ADIS_CS);	//clear CS
}
//==============================================================================

а вообще такая мысль. берите хрюдуино на меге и побалуйтесь с мультивии проектом. вы и так к нему идете =)

SergDoc

Огромное спасибо, с портом вроде подружился, щас какие-то цифирки считаю,

RW9UAO:

а вообще такая мысль. берите хрюдуино на меге и побалуйтесь с мультивии проектом. вы и так к нему идете =)

а зачем брать склепать платку три в одном атмега+асель поI2C + гироскопы - что-то на подобии мультивия и получится ну USB для полного счастья заливай прошивку и вперёд на мины 😁 двухслойки у меня получаются

SergDoc

Даже название придумал KUii или KUrdunio😁

7 days later
SergDoc

Первые наброски: може ещё чё поменяю

SergDoc

Блин? а картинка вроде ничего была, ладно всё равно переделываю, платку почти развёл новую, совместима с Arduino Nano, через пару дней выкину, пока дтальки подбираю помельче, от виртуального USB/RS 232 отказался комы и дома и на работе имеются, железки старые в крайнем случае есть переходник, так что повесил обычный макс и разъём от телефона (евро) акселерометр LIS35DE (по I2C) гироскопы мутара из HK401 две управляемые кренки 1117 на 3.3V и 1.65V так что собираю из того что есть под руками, атмега 168 или 328 - что привезут сегодня платка размерами как КУК 52Х52…

SergDoc:

атмега 168 или 328

Из кука не хочу выпаивать, и так уже два раза выдирал, пока платки всякие делал, а кук портить не хочется, мало ли…

SergDoc

Выставляю схемку и платку на суд:

SergDoc

Кстати от КУКа с акселем я не отказался, просто я в программном как свинья в апельсинах, для начала посмотрю что получится, по крайней мера к ардуино больше инфы есть, а там вернусь (если всё получится) к КУКу и SPI…

native18

Каков размер платы? Все будет на одной плате или еще будут какие платы подсоединяться?

SergDoc

платка 52X52мм больше ничего всё в одном (макс, атмега, гироскопы, аксель и стабилизаторы), я налепил квадратиков лишних хлорное железо кончалось - экономил…

По поводу гироскопов два выпаяны третий вместе с платкой своей как в куке стояком

Свёрлышки только после выходных привезут так что дальше делать буду только на следующей неделе

native18

Сергей, таким коротким сообщением Вы не отвертитесь. 😉 Нужны характеристики, ну или хотя бы пробные испытания, а еще лучше летные. Хоть внешний вид покажите для начала.