Создание собственной системы стабилизации
мдя… подключил по и2с - все шикарно… вернул на спи - та же хрень…
Сергей, покажи драйвер, а то непонятно о чём разговор 😦
Вот и я к тому же… (просто разный дискрет выборок), дешево, надежно, и примитивно… очень похоже на правду.
При влючении фильтра в MPU частота дискритизации действительно уменьшается (без фильтра 8 кГц, а с фильтром 1 кГц)
INTERNAL CLOCK SOURCE CLK_SEL=0,1,2,3
Gyroscope Sample Rate, Fast DLPFCFG=0
SAMPLERATEDIV = 0
8 kHz
Gyroscope Sample Rate, Slow DLPFCFG=1,2,3,4,5, or 6
SAMPLERATEDIV = 0
1 kHz
Accelerometer Sample Rate 1 kHz
фильтр все равно там есть и используется скорее всего БИХ фильтр.
Почему уменьшается частота дискретизации: видно процессор в MPU не справляется при общете фильтра с большим потоком данных вот и уменьшили Sample Rate.
да тут наврятли в самом драйвере дело… там все просто и понятно
* \param spi The SPI_Master_t struct instance.
* \param TXdata Data to transmit to slave.
*
* \return Data received from slave.
*/
uint8_t SPI_MasterTransceiveByte(SPI_Master_t *spi, uint8_t TXdata)
{
/* Send pattern. */
spi->module->DATA = TXdata;
/* Wait for transmission complete. */
while(!(spi->module->STATUS & SPI_IF_bm)) {
}
/* Read received data. */
uint8_t result = spi->module->DATA;
return(result);
}
вызов
spi_getSixRawADC(GYRO_PIN, 0x80 + 0x28);
void spi_getSixRawADC(uint8_t pinMask, uint8_t reg) {
SPI_MasterSSLow(&PORTE, pinMask);
SPI_MasterTransceiveByte(&spiMasterE, 0x40 | reg);
for (uint8_t i=0; i<6; i++) {
rawADC[i]=SPI_MasterTransceiveByte(&spiMasterE, 0xFF);
}
SPI_MasterSSHigh(&PORTE, pinMask);
}
самое обидное именно в том что если вывожу в уарт так
if (GYRO) Gyro_init();
if (ACC) {ACC_init();acc_25deg = acc_1G * 0.423;}
while (1) {
SerialPrint(2, "GYRO X = ");
spi_getSixRawADC(GYRO_PIN, 0x80 | 0x28);
put_hex_int((uint16_t)(rawADC[1]<<8)|rawADC[0]);
delay(10);
SerialPrint(2, "; Y = ");
put_hex_int((uint16_t)(rawADC[3]<<8)|rawADC[2]);
delay(10);
SerialPrint(2, "; Z = ");
put_hex_int((uint16_t)(rawADC[5]<<8)|rawADC[4]);
SerialPrint(2, ";\n");
delay(100);
}
то все отлично… все данные корректны
стоит закомментировать и получаем вот что
на и2с с теми же настройками все отлично
кстати есть тут кто кто делал из 4-й дискавери логический анализатор по статье на хабре?
просто как раз пробовал им посмотреть что творится - выдает тоже фиг знает что
да тут наврятли в самом драйвере дело… там все просто и понятно
Код не смотрел (пока не силен в STM32), но по описанию, очевидно что у вас неправильно идет работа с SPI.
это не СТМ а atxmega
если неправильно то почему тогда в одном случае все отлично, а в другом - фиг пойми что/
наверное попробую снова все это дело на прерываниях сделать
пробуй через счётчик все разом как я показывал с MPU:
static void mpu6000AccRead(int16_t *accData) {
uint8_t buf[6];
uint8_t i;
MPU_ON;// прижал
spi_writeByte(MPU_RA_ACCEL_XOUT_H | 0x80); // говорит что читать отсюда и до забора (6-в данном случае)
for (i = 0; i < 6; i++)
buf[i] = spi_readByte();
MPU_OFF;//отпустил
accData[0] = (int16_t)((buf[0] << 8) | buf[1]) / 8;
accData[1] = (int16_t)((buf[2] << 8) | buf[3]) / 8;
accData[2] = (int16_t)((buf[4] << 8) | buf[5]) / 8; }
MPU_RA_ACCEL_XOUT_H - адрес первого регистра
0x80 - цыфирка что читать надо несколько…
В atxmega CS аппаратный? какая частота SPI? Вообще такие вещи надо бы осцилом смотреть что на ногах творится
пробуй через счётчик все разом
у меня вообще то именно так все и сделано
0х80 у ст-шных - это чтение, а все разом - это 0х40
В atxmega CS аппаратный?
если 1 слейв - то да, если несколько - то сам указываеш/управляеш
осцилл к сожалению под рукой только портативный ЮСБ-шный одноканальный… им все что больше 50-100кГц бесполезно смотреть
частоту пробовал и 8МГц, и 2… надо попробовать будет 500кГц
spi_getSixRawADC(GYRO_PIN, 0x80 | 0x28);
здесь должно происходить :
прижал лапу
write_bute - забор|обед
счётчик шагов от забора до обеда
read_bute (все шаги) складываем в rawADC
отпустил лапу
SPI_MasterSSLow(&PORTE, pinMask);
SPI_MasterTransceiveByte(&spiMasterE, 0x40 | reg);
for (uint8_t i=0; i<6; i++) {
rawADC[i]=SPI_MasterTransceiveByte(&spiMasterE, 0xFF);
}
SPI_MasterSSHigh(&PORTE, pinMask);
здесь должно происходить :
прижал лапу
write_bute - забор-обед
счётчик шагов от забора до обеда
read_bute (все шаги)
отпустил лапу
блин… я ж это все привел.
uint8_t result = spi->module->DATA; // result - правильная переменная?
>SPI_MasterTransceiveByte(&spiMasterE, 0xFF);
Не бейте ногами, а зачем присваивать в начале 0xFF?
а зачем присваивать в начале 0xFF?
там вообщет можно все что угодно… главное 1-й байт говорит что будем читать далее и с инкрементом адреса, а что в следующих посылаеш - не учитывается
правильная переменная?
этот драйвер из апноута Атмел
SPI_MasterTransceiveByte(&spiMasterE, 0xFF);
в SPI чтобы что-то прочитать, надо туда заслать чё-нить…
этот драйвер из апноута Атмел
не я конечно в программировании не силён, но не останется ли переменная только в этой процедуре? т.е. доступ другим к ней будет?
не я конечно в программировании не силён, но не останется ли переменная только в этой процедуре? т.е. доступ другим к ней будет?
Останется, но перед выходом из процедуры, она присваивается резалту
return(result)
Поделитесь обработчиком под STM32 (аппаратным желательно) кодирования/декодирования сигнала ppmsum, а также обработчик приема обычных данных с приемника.
тут и входы и выходы…
Sir Alex и tusik, к вам будет просьба. Как только платы приедут - по возможности побыстрее сделать кино полёта…
Я пока не смогу этого сделать в полном объёме 😦 в моей плате проблемный баро и gps у меня глючит - блин сапожник без сапог 😦
В платах залита староватая версия 3.1… посмотрю точнее скажу - но я на ней летал (т.е. проверенная)
Конфигурация X моторы (нумерация) как в APM !
Для запуска Арду обязательна SD-карточка… у меня прекрасно живёт 2-х гиговая noname
Первый запуск - просто включить с карточкой
Далее на карточке создастся директория APM (там логи будут хранится)
Для запуска моторов в эту директорию надо положить пустой файл
AUXPWM.en регистр букв обязателен.
Вход радио пока работает один PPM, подписан 4-й
Я пока не смогу этого сделать в полном объёме в моей плате проблемный баро и gps у меня глючит - блин сапожник без сапог
Я ж тебе написал, пришли мне без баро, я выковыряю из своих запасов контроллеров.
Не, это не красиво будет - я купил новый себе, приедет переставлю…
теперь аксель калибруется с кнопки в планнере в терминал лезть ненадо, на старой плате калибровался только через терминал… на новых на всех просто с кнопки калибруется 😃
да ещё я не пробовал через терминал виртуальную еепром стирать…
если надо стереть в консоли NuttX
вынимаем SD (если с пищалкой запустить будет пиликать SOS)
подключаем к 1 усарту через ftdi (или через что есть) любой терминалкой (патти, геркулес…)
скорость 57600
набираем
mtd start
mtd erase
reboot
вставляем SD запускаемся калибруемся…