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

sisadm
native18:

Ага, за 5 часов сделал сопряжение с акселерометрами, написал программное обеспечение и обкатал на нескольких видах коптеров. 😁

А можно поподробнее. как это получилось сделать?

native18
sisadm:

А можно поподробнее. как это получилось сделать?

Вы это серьезно? 😃 Я же поставил в конце смеющийся смайлик.
Я пошутил, за такой короткий срок это невозможно. Вы наверное никогда не сталкивались с электроникой на уровне разработки и написания софта. И уж тем более ее обкатки.

С сопряжением на базе даташита еще кое-как можно быстро разобраться. А вот засунуть в чужой код подпрограммы обработки с последующей коррекцией на этапе отладки, это обычно очень длительный процесс.
Недаром за полгода на КК-контроллер вышло несколько десятков подверсий программного обеспечения и продолжают выходить дальше.

Если у Сергея выйдет что-то рабочее меньше чем за месяц, я буду первый орать “браво” и выклянчивать у него софт.
Извините, если ввел в заблуждение, но подумал, что это очевидно.

SergDoc

И так мысли в слух, имеется KKmulticontroller v.5.5 “Blackboard” www.kkmulticopter.com/index.php?option=com_content… собственного исполнения на Atmega 168 и акселерометр LIS35DE, любезно выдернутый из китайской NOKIA N71 знакомыми паяльниками.

Здесь описание и исходники под модуль на этом акселерометре.

имеется две проблемы, но их никак не избежать, наверно, без переделки КУКа
в первом случае если подключатся через I2C то нужно её освободить, а во втором если через порт программатора то нужно освободить порт SS иллюстрацию прилагаю, может в чём не прав поправте…

Блин картинка не ахти получилась

1- перенести подстроечники с выводов 27 28 на 19 22 соответственно ну и конечно переназначить порты

2 - перенести Motor1 с вывода 14 на вывод 2 ну тоже с доработкой программного

хотя если я правильно понял то порт SS используется только для переключения режимов I2C и SPI так для SPI замкнуть вывод СS акселерометра на корпус и всё никакой переделки КУКа?

Ну конечно надо избежать каким то образом генераторы прерываний INT1 и INT2

примерное подключение

Акселерометр – Атмега
13 – 15
12 – 16
14 – 17

SergDoc

Накидал платку акселерометра, естественно под разъём платы привёдённой выше - прошу критиковать:)

Акселерометр получается точно по центру платы

Теперь самое страшное - научить КУК общатся с ним.

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

native18
SergDoc:

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

При отдельном модуле придется обрабатывать параллельно два потока данных. Проще, наверное, написать отдельную процедуру обработки данных с акселей и корректировки гироскопов. И вызывать ее из основного тела программы до или после каждого цикла обработки данных с гироскопов.
Правда увеличится общее время обработки, и возможно из-за недостаточной скорости контроллера уменьшиться общая скорость опроса. Но в этом случае работа модулей будет последовательной во времени.
Как-то так.

SergDoc

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

RW9UAO

подскажу. сделайте для начала _аппаратный_ выход РРМ. мега у вас мелкая, ног мало, поэтому поставьте еще микросхему счетчика-декодера как на аналоговых приемниках. тем самым сильно разгрузите время процессора. можете этот кусок когда подглядеть в кодере фокус/MSV. в КК формирование сигнала РРМ сделано по идиотски. захват РРМ сигнала у вас итак аппаратный. гироскопы вы опрашиваете по аналоговым входам. в КК опрос идет поллингом. сделайте нормальный обработчик прерывания такого вида:

вход в прерывание АЦП
запись значения текущего канала в переменную
ADMUX = новый_канал | ADC_VREF_TYPE;
запуск замера
выход из прерывания

только на этом вы сэкономите 10 мСек на каждый канал.
идем дальше. акселерометр у вас на I2C? либо делайте аппаратно, либо цепляйте к аналоговым входам. их у вас 8.
в основном цикле только отработка математики. Калман - х.з. а вот ФНЧ надо обязательно. ну и ПИДы само собой.

SergDoc
RW9UAO:

акселерометр у вас на I2C?

Вообще-то я его планирую по SPI впихнуть дабы не переделывать кук

Примерно так

SergDoc

Ладно нужно срочно откапывать в себе талант программиста и переделывать всё таки софтину

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

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