Создание собственной системы стабилизации
Ладно нужно срочно откапывать в себе талант программиста и переделывать всё таки софтину
Сразу предупреждаю я не программист, вот исходник с которым я воюю:
не могу понять где происходит определение изменения показаний гироскопов, была мысль читать данные из акселерометра после каждого изменения?
{
asm volatile (“NOP”); asm volatile (“NOP”);
asm volatile (“NOP”); asm volatile (“NOP”);
asm volatile (“NOP”); asm volatile (“NOP”);
asm volatile (“NOP”);
}
это цикл ожидания прервываний я так понимаю ?
Нарыл подобное подключение на Aruino physics.csuchico.edu/…/micrologger.pde.html
www.rlocman.ru/shem/schematics.html?di=70957 здесь само подключение
пишут одно а на самом деле другое там флешка по ISP подключена
Сергей, нашел пару ресурсов. Подключение по SPI, либо I2C.
В первом есть исходный текст софта:
Подключение 3х осевого акселерометра LIS302DL
Во втором прилагается схема, монтажная плата и софт.
Цифровой акселерометр LIS302DL
Надеюсь чем-то поможет.
Я это уже читал они кстати взаимозаменяемые, проблем у меня несколько, 1 когда его читать 2 нужен ли порт CS 3 вообще как привязатся к полученным значениям, Кальман - тогда полное написания софтины с нуля.
Была мысль использовать один из генераторов прерываний - повесить на свободный порт, есть изменения -> читать, вообщем буду пробовать разные варианты всё равно ещё застой не меньше месяца может чё и придумаю, сначала окуратно для себя разложу полностью прошивку корейца по полочкам, а там уже буду менять…
Чёт создаётся впечатление что у программеров с которыми я общаюсь (вне форума) понятия о программировании даже ниже моих, неужели это так сложно?
гироскопы вы опрашиваете по аналоговым входам. в КК опрос идет поллингом.
Сергей, честное слово не могу понять где они опрашиваются (в коде)?
ищите процедуру read_adc(). смотрите в нее, там указание канала и ожидание готовности. и по коду разбросаны вызовы этой функции. речь веду о Сишном коде. ассемблерный ковырять и переписывать желания не было.
ищите процедуру read_adc(). смотрите в нее, там указание канала и ожидание готовности.
А слона то я и не приметил, а теперь для тех кто с бронепоезда - если я вклинюсь в эти процедуры считаю акселерометр воткну филтр Кальмана www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=125320229… и верну полученное значение вместо данных с гироскопа? а дальше пущай полетает?
Кстати порт CS можно всё таки прижать к земле навечно а) акселерометр работать будет б) как пишут всё равно его дёргать программно надо, а значит атмега должна понять что она мастером стоит.
вот смотрите, читается состояние гироскопов
//--- 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
}
//==============================================================================
а вообще такая мысль. берите хрюдуино на меге и побалуйтесь с мультивии проектом. вы и так к нему идете =)
Огромное спасибо, с портом вроде подружился, щас какие-то цифирки считаю,
а вообще такая мысль. берите хрюдуино на меге и побалуйтесь с мультивии проектом. вы и так к нему идете =)
а зачем брать склепать платку три в одном атмега+асель поI2C + гироскопы - что-то на подобии мультивия и получится ну USB для полного счастья заливай прошивку и вперёд на мины 😁 двухслойки у меня получаются
Даже название придумал KUii или KUrdunio😁
мелко, ни видно нифига.
Блин? а картинка вроде ничего была, ладно всё равно переделываю, платку почти развёл новую, совместима с Arduino Nano, через пару дней выкину, пока дтальки подбираю помельче, от виртуального USB/RS 232 отказался комы и дома и на работе имеются, железки старые в крайнем случае есть переходник, так что повесил обычный макс и разъём от телефона (евро) акселерометр LIS35DE (по I2C) гироскопы мутара из HK401 две управляемые кренки 1117 на 3.3V и 1.65V так что собираю из того что есть под руками, атмега 168 или 328 - что привезут сегодня платка размерами как КУК 52Х52…
атмега 168 или 328
Из кука не хочу выпаивать, и так уже два раза выдирал, пока платки всякие делал, а кук портить не хочется, мало ли…
Выставляю схемку и платку на суд:
Кстати от КУКа с акселем я не отказался, просто я в программном как свинья в апельсинах, для начала посмотрю что получится, по крайней мера к ардуино больше инфы есть, а там вернусь (если всё получится) к КУКу и SPI…
Каков размер платы? Все будет на одной плате или еще будут какие платы подсоединяться?
платка 52X52мм больше ничего всё в одном (макс, атмега, гироскопы, аксель и стабилизаторы), я налепил квадратиков лишних хлорное железо кончалось - экономил…
По поводу гироскопов два выпаяны третий вместе с платкой своей как в куке стояком
Свёрлышки только после выходных привезут так что дальше делать буду только на следующей неделе