Специальные цены   новые товары
+ Ответить в теме
Страница 13 из 165 ПерваяПервая ... 3 11 12 13 14 15 23 ... ПоследняяПоследняя
Показано с 481 по 520 из 6569

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

Тема раздела Квадрокоптеры. Общие вопросы в категории Квадрокоптеры и мультироторы; Решил проблему так: Код: bool LSM330ACCDetect(sensor_t *acc) { bool ack = false; uint8_t sig = 0; ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A ...

  1. #481

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Решил проблему так:
    Код:
     
    bool LSM330ACCDetect(sensor_t *acc)
    {
        bool ack = false;
        uint8_t sig = 0;
    
        ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
    	  ack = ack <<5;
    	  sig = sig <<5; 
        if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
            return false;
    
        acc->init = LSM330ACCInit;
        acc->read = LSM330ACCRead;
        acc->align = LSM330ACCAlign;
        return true;
    }
    Я просто потом перезаписываю регистр как мне надо, и всё приплыли нет аксела на следующем старте, сейчас всё заработало

    Сгирой постораюсь обойтись проще, типа есть такой аксель значит и гира такая же...

    Цитата Сообщение от rual Посмотреть сообщение
    В чём смысл идентификации акселя? В том чтобы не заточенную под железо прошиву определить при старте?
    у Таймкопа автоопределение датчиков написано - типа какие установлены, так вот я туда lsm-ку и пристраиваю

  2.  
  3. #482

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    у переменной ack булевый тип, некрасиво его сдигать )

  4. #483

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    зато работает определяется аксель без проблем

    а в булеву переменную, всякую бяку засовывать, типа чип id, то ж некрасиво

  5. #484

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от SergDoc Посмотреть сообщение
    а в булеву переменную, всякую бяку засовывать, типа чип id, то ж некрасиво
    нее, не так. в ack функция выгружает наличие/отсутсвие ответа от ведмого устройства. Т.е. если ack = true, то устройство ответило, если false что ответа не было.

  6.  
  7. #485

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Цитата Сообщение от SergDoc Посмотреть сообщение
    if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
    return false;
    тогда вот это загадка....

    в таком случае надо
    Код:
    bool LSM330ACCDetect(sensor_t *acc)
    {
        bool ack = false;
        uint8_t sig = 0;
    
        ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
    	  sig = sig <<5; 
        if ( sig != LSM330ACC_DEVICE_SIGNATURE)
            return false;
    
        acc->init = LSM330ACCInit;
        acc->read = LSM330ACCRead;
        acc->align = LSM330ACCAlign;
        return true;
    }

  8. #486

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Вот что вышло
    Код:
    #include "board.h"
    
    
    
    #define LSM330ACC_ADDRESS  0x19
    
    #define LSM330ACC_DEVICE_SIGNATURE    0xE0
    
    #define LSM330_CTRL_REG1_A		0x20 /* rw */
    #define LSM330_CTRL_REG2_A		0x21 /*rw */
    #define LSM330_CTRL_REG3_A		0x22 /*rw */
    #define LSM330_CTRL_REG4_A		0x23 /*rw */
    #define LSM330_CTRL_REG5_A		0x24 /*rw */
    #define LSM330_CTRL_REG6_A		0x25 /*rw */
    #define LSM330_REF_DCAPTURE_A	0x26 /*rw */
    #define LSM330_STATUS_REG_A		0x27 /*r */
    #define LSM330_OUT_X_L_A		0x28 /*r */
    //#define LSM330_OUT_X_H_A		0x29 /*r */
    //#define LSM330_OUT_Y_L_A		0x2A /*r */
    //#define LSM330_OUT_Y_H_A		0x2B /*r */
    //#define LSM330_OUT_Z_L_A		0x2C /*r */
    //#define LSM330_OUT_Z_H_A		0x2D /*r */
    #define LSM330_FIFO_CTRL_REG_A	0x2E /*rw */
    #define LSM330_FIFO_SRC_REG_A	0x2F /*r */
    #define LSM330_INT1_CFG_A		0x30 /*rw */
    #define LSM330_INT1_SRC_A		0x31 /*r */
    #define LSM330_INT1_THS_A		0x32 /*rw */
    #define LSM330_INT1_DURATION_A	0x33 /*rw */
    #define LSM330_INT2_CFG_A		0x34 /*rw */
    #define LSM330_INT2_SOURCE_A	0x35 /*r */
    #define LSM330_INT2_THS_A		0x36 /*rw */
    #define LSM330_INT2_DURATION_A	0x37 /*rw */
    #define LSM330_CLICK_CFG_A		0x38 /*rw */
    #define LSM330_CLICK_SRC_A		0x39 /*rw */
    #define LSM330_CLICK_THS_A		0x3A /*rw */
    #define LSM330_TIME_LIMIT_A		0x3B /*rw */
    #define LSM330_TIME_LATENCY_A	0x3C /*rw */
    #define LSM330_TIME_WINDOW_A	0x3D /*rw */
    
    
    
    /* LSM330_CTRL_REG1_A */
    #define LSM330_A_ODR_PDN	0x0		/* Power-down mode */
    #define LSM330_A_ODR_1		0x10 	/* Normal / low-power mode (1 Hz) */
    #define LSM330_A_ODR_10		0x20	/* Normal / low-power mode (10 Hz) */
    #define LSM330_A_ODR_25		0x30	/* Normal / low-power mode (25 Hz) */
    #define LSM330_A_ODR_50		0x40	/* Normal / low-power mode (50 Hz) */
    #define LSM330_A_ODR_100	0x50	/* Normal / low-power mode (100 Hz) */
    #define LSM330_A_ODR_200	0x60	/* Normal / low-power mode (200 Hz) */
    #define LSM330_A_ODR_400	0x70	/* Normal / low-power mode (400 Hz) */
    #define LSM330_A_ODR_LP162	0x80 	/* Low-power mode (1.620 kHz) */
    #define LSM330_A_ODR_HI		0x81 	/* Normal (1.344 kHz) / low-power mode (5.376 kHz) */
    #define LSM330_A_Acsis     0X7
    
    
    /* CTRL_REG2_A */
    #define LSM330_A_HPM0		0		/* Normal mode (reset reading HP_RESET_FILTER)*/
    #define LSM330_A_HPM1		0x40	/* Reference signal for filtering */
    #define LSM330_A_HPM2		0x80	/* Normal mode	*/					
    #define LSM330_A_HPM3		0xc0	/* Autoreset on interrupt event */	
    #define LSM330_A_HPCF0		0		/* High-pass filter cutoff frequency selection	*/	
    #define LSM330_A_HPCF1		0x10	/* High-pass filter cutoff frequency selection	*/
    #define LSM330_A_HPCF2		0x20	/* High-pass filter cutoff frequency selection	*/
    #define LSM330_A_HPCF3		0x30	/* High-pass filter cutoff frequency selection	*/
    #define LSM330_A_FDS		0x08	/* Filtered data selection. Default value: 0 (0: internal filter bypassed; 1: data from internal filter sent to output register and FIFO) */
    
    /* CTRL_REG3_A */
    #define LSM330_A_I1_CLICK 	0x80	/* CLICK interrupt on INT1_A. Default value 0. (0: Disable; 1: Enable) */
    #define LSM330_A_I1_AOI1 	0x40 	/* AOI1 interrupt on INT1_A. Default value 0. (0: Disable; 1: Enable) */
    #define LSM330_A_I1_DRDY1 	0x10	/* DRDY1 interrupt on INT1_A. Default value 0.(0: Disable; 1: Enable) */
    #define LSM330_A_I1_DRDY2 	0x08	/* DRDY2 interrupt on INT1_A. Default value 0.(0: Disable; 1: Enable) */
    #define LSM330_A_I1_WTM 	0x04	/* FIFO watermark interrupt on INT1_A. Default value 0.(0: Disable; 1: Enable)*/ 
    #define LSM330_A_I1_OVERRUN 0x02	/* FIFO overrun interrupt on INT1_A. Default value 0. (0: Disable; 1: Enable) */
    
    	/*CTRL_REG4_A */
    #define LSM330_BDU	 		0x80	/* Block data update. Default value: 0(0: continuous update; 1: output registers not updated until MSB and LSB reading) */
    #define LSM330_BLE	 		0x40	/* Big/little endian data selection. Default value 0.(0: Data LSB at lower address; 1: Data MSB at lower address) */
    
    /*FS1-FS0 Full-scale selection. default value: 00 (00: +/- 2G; 01: +/- 4G; 10: +/- 8G; 11: +/- 16G) */
    #define LSM330_A_FS2G		0
    #define LSM330_A_FS4G		0x10
    #define LSM330_A_FS8G		0x20
    #define LSM330_A_FS16G		0x30
    #define LSM330_A_HR 		0x08	/*Normal mode: default value: 0(0: normal mode disable; 1: normal mode enable */
    #define LSM330_SIM 			0x01	/* SPI serial interface mode selection. Default value: 0(0: 4-wire interface; 1: 3-wire interface) */
    
    /* CTRL_REG5_A */
    #define LSM330_A_BOOT 		0x80	/* Reboot memory content. Default value: 0 (0: normal mode; 1: reboot memory content) */
    #define LSM330_A_FIFO_EN	0x40	/* FIFO enable. Default value: 0(0: FIFO disable; 1: FIFO enable) */
    #define LSM330_A_LIR_INT1 	0x08	/* Latch interrupt request on INT1_SRC_A register, with INT1_SRC_A register cleared by reading INT1_SRC_A itself. Default value: 0.(0: interrupt request not latched; 1: interrupt request latched) */
    #define LSM330_A_D4D_INT1 	0x04	/* 4D enable: 4D detection is enabled on INT1_A when 6D bit on INT1_CFG_A is set to 1. */
    
    /* CTRL_REG6_A */
    #define LSM330_A_I2_CLICKen 0x80	/* Click interrupt on INT2_A. Default value 0.	*/
    #define LSM330_A_I2_INT1	0x40	/* Interrupt 1 function enabled on INT2_A. Default 0. */
    #define LSM330_A_BOOT_I2	0x10	/* Boot on INT2_A. */
    #define LSM330_A_H_LACTIVE	0x02	/* 0: interrupt active high; 1: interrupt active low. */
    
    /* STATUS_REG_A */
    #define LSM330_A_ZYXOR		0x80	/* X-, Y- and Z-axis data overwrite. Default value: 0 (0: no overwrite has occurred; 1: a new set of data has overwritten the previous ones) */
    #define LSM330_A_ZOR		0x40	/* Z-axis data overwrite. Default value: 0(0: no overrun has occurred; 1: a new data for the Z-axis has overwritten the previous one) */
    #define LSM330_A_YOR		0x20	/* Y-axis data overwrite. Default value: 0 (0: no overwrite has occurred;1: new data for the Y-axis has overwritten the previous data) */
    #define LSM330_A_XOR		0x10	/* X-axis data overwrite. Default value: 0 (0: no overwrite has occurred;1: new data for the X-axis has overwritten the previous data) */
    #define LSM330_A_ZYXDA		0x08	/* X-, Y- and Z-axis new data available. Default value: 0(0: a new set of data is not yet available; 1: a new set of data is available) */
    #define LSM330_A_ZDA		0x04	/* Z-axis new data available. Default value: 0(0: new data for the Z-axis is not yet available;1: new data for the Z-axis is available) */
    #define LSM330_A_YDA		0x02 	/* Y-axis new data available. Default value: 0 (0: new data for the Y-axis is not yet available;1: new data for the Y-axis is available) */
    #define LSM330_A_XDA		0x01 	/* X-axis new data available. Default value: 0 (0: new data for the X-axis is not yet available;1: new data for the X-axis is available) */
    
    
    extern uint16_t acc_1G;
    
    static void LSM330ACCInit(void);
    static void LSM330ACCRead(int16_t *accelData);
    static void LSM330ACCAlign(int16_t *accelData);
    
    bool LSM330ACCDetect(sensor_t *acc)
    {
        bool ack = false;
        uint8_t sig = 0;
    
        ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
    	  
    	  sig = sig <<5; 
        if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
            return false;
    
        acc->init = LSM330ACCInit;
        acc->read = LSM330ACCRead;
        acc->align = LSM330ACCAlign;
        return true;
    }
    
    static void LSM330ACCInit(void)
    {
    	 
        i2cWrite(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A, LSM330_A_ODR_100 | LSM330_A_Acsis );
    	 
        i2cWrite(LSM330ACC_ADDRESS, LSM330_CTRL_REG4_A, LSM330_A_FS4G  );
        
       
        
        acc_1G = 512;
    }
    
    static void LSM330ACCRead(int16_t *accelData)
    {
        uint8_t buf[6];
    
        i2cRead(LSM330ACC_ADDRESS, LSM330_OUT_X_L_A, 6, buf);
        accelData[0] = (buf[1] << 8) | buf[0];
        accelData[1] = (buf[3] << 8) | buf[2];
        accelData[2] = (buf[5] << 8) | buf[4];
        
        accelData[0] >>= 2;
        accelData[1] >>= 2;
        accelData[2] >>= 2;
    }
    
    static void LSM330ACCAlign(int16_t *accelData)
    {
        int16_t temp[2];
        temp[0] = accelData[0];
        temp[1] = accelData[1];
    
        // official direction is RPY
        accelData[0] = temp[1] / 32;
        accelData[1] = -temp[0] / 32;
        accelData[2] = accelData[2] / 32;
    }
    но бяка полная
    Миниатюры Миниатюры Нажмите на изображение для увеличения
Название: бяка.jpg‎
Просмотров: 128
Размер:	68.7 Кб
ID:	657737  

  9. #487

    Регистрация
    03.12.2006
    Адрес
    Москва
    Возраст
    38
    Сообщений
    1,143
    Цитата Сообщение от SergDoc Посмотреть сообщение
    #define LSM330ACC_ADDRESS 0x19
    А почему именно такой адрес? Вроде,если верить инструкции на чтение либо 0Х30,либо 0Х32 в зависимости от подключения.

  10.  
  11. #488

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Семи биный, не восьми....
    BMP085, Standard address 0x77
    HMC5883L, default address 0x1E
    ADXL345, Alternative address mode 0x53

  12. #489

    Регистрация
    03.12.2006
    Адрес
    Москва
    Возраст
    38
    Сообщений
    1,143
    Цитата Сообщение от SergDoc Посмотреть сообщение
    #define LSM330_A_Acsis 0X7
    А это за что отвечает?

  13. #490

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Код:
    addr = addr_ << 1;
        reg = reg_;
        writing = 1;
        reading = 0;
        write_p = my_data;
        read_p = my_data;
        bytes = len_;
        busy = 1;
    чтение и запись со cдвигом адреса уже прописаны в драйвере i2c

    Цитата Сообщение от soliada Посмотреть сообщение
    А это за что отвечает?
    прописываю включение всех трёх осей...

    ради экперимента можно в первый регистр число послать 0Х57 получится LSM330_A_ODR_100 0x50 /* Normal / low-power mode (100 Hz) */
    + LSM330_A_Acsis 0X7

    тьфу надо писать 0Х07

    завтра попробую обнулить все регистры акселя и ещё раз попробую....
    Последний раз редактировалось SergDoc; 14.06.2012 в 00:52.

  14. #491

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Опять беда, решил гиру нарисовать ииии опа температура то восьмибитная - старая давно забытая проблема как знак не потерять, ладно предположим что можно записать в char, потом придумать делитель ну а дальше опять танцы с бубном....

    меряем от -40 до +85, если -40 будет равно -178 а +85 равно 177

    делитель 2 но надо ещё ноль сместить
    Последний раз редактировалось SergDoc; 14.06.2012 в 11:06.

  15. #492

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Написал драйвер для гиры, на сколько могу судить определяется, так как, в родной паршивке нет такого понятия, пришлось для уверенности, что обращается к драйверу сделать ещё одну проверку акселя, по крайней мере раз аксель проверяет два раза значит цепляет и гиру, но бяка та-же что и с акселем, пока в растерянности.....

  16. #493

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    надоест извращатся прямо в sensor.c пропишу датчики

  17. #494

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Вот драйвер для гиры:
    Код:
    #include "board.h"
    
    
    #define LSM330GYRO_ADDRESS         0x69
    //#define LSM330GYRO_DEVICE_SIGNATURE    0xE0
    
    #define LSM330ACC_ADDRESS  0x19
    #define LSM330ACC_DEVICE_SIGNATURE    0xE0
    #define LSM330_CTRL_REG1_A		0x20 /* rw */
    
    /* адреса регистров гироскопа */
    #define LSM330_CTRL_REG1_G		0x20 /*rw */
    #define LSM330_CTRL_REG2_G		0x21 /*rw */
    #define LSM330_CTRL_REG3_G		0x22 /*rw */
    #define LSM330_CTRL_REG4_G		0x23 /*rw */
    #define LSM330_CTRL_REG5_G		0x24 /*rw */
    #define LSM330_REF_DCAPTURE_G	0x25 /*rw */
    #define LSM330_OUT_TEMP_G		0x26 /*r */
    #define LSM330_STATUS_REG_G		0x27 /*r */
    #define LSM330_OUT_X_L_G		0x28 /*r */
    #define LSM330_OUT_X_H_G		0x29 /*r */
    #define LSM330_OUT_Y_L_G		0x2A /*r */
    #define LSM330_OUT_Y_H_G		0x2B /*r */
    #define LSM330_OUT_Z_L_G		0x2C /*r */
    #define LSM330_OUT_Z_H_G		0x2D /*r */
    #define LSM330_FIFO_CTRL_REG_G	0x2E /*rw */
    #define LSM330_FIFO_SRC_REG_G	0x2F /*r */
    #define LSM330_INT1_CFG_G		0x30 /*rw */
    #define LSM330_INT1_SRC_G		0x31 /*r */
    #define LSM330_INT1_THS_XH_G	0x32 /*rw */
    #define LSM330_INT1_THS_XL_G	0x33 /*rw */
    #define LSM330_INT1_THS_YH_G	0x34 /*rw */
    #define LSM330_INT1_THS_YL_G	0x35 /*rw */
    #define LSM330_INT1_THS_ZH_G	0x36 /*rw */
    #define LSM330_INT1_THS_ZL_G	0x37 /*rw */
    #define LSM330_INT1_DURATION_G	0x38 /*rw */
    
    /* CTRL_REG1_G */
    /* DR and BW configuration setting _ODR [Hz]_cutoff [Hz] */
    #define LSM330_G_DR100BW12_5 	0x00
    #define LSM330_G_DR100BW25		0x30
    #define LSM330_G_DR200BW12_5 	0x40
    #define LSM330_G_DR200BW25		0x50
    #define LSM330_G_DR200BW50		0x60
    #define LSM330_G_DR200BW70		0x70
    #define LSM330_G_DR400BW20		0x80
    #define LSM330_G_DR400BW25		0x90
    #define LSM330_G_DR400BW50		0xA0
    #define LSM330_G_DR400BW110		0xB0
    #define LSM330_G_DR800BW30		0xC0
    #define LSM330_G_DR800BW35		0xD0
    #define LSM330_G_DR800BW50		0xE0
    #define LSM330_G_DR800BW110		0xF0
    #define LSM330_G_PD				0x08	/* Power-down mode enable. Default value: 0	(0: power-down mode, 1: normal mode or sleep mode) */
    
    /* CTRL_REG2_G */
    #define LSM330_G_HPM0		0		/* Normal mode (reset reading HP_RESET_FILTER)*/
    #define LSM330_G_HPM1		0x10	/* Reference signal for filtering */
    #define LSM330_G_HPM2		0x20	/* Normal mode	*/					
    #define LSM330_G_HPM3		0x30	/* Autoreset on interrupt event */ 
    /* High-pass filter cutoff frequency configuration [Hz] */
    /* HPCF3-0 							ODR = 100 Hz 	ODR = 200 Hz	ODR = 400 Hz 	ODR = 800 Hz 	*/
    #define LSM330_G_HPC0		0x00	/* 8 			15 				30 				56				*/
    #define LSM330_G_HPC1		0x01	/* 4 			8 				15 				30				*/
    #define LSM330_G_HPC2		0x02	/* 2 			4 				8 				15				*/
    #define LSM330_G_HPC3		0x03	/* 1 			2 				4 				8				*/
    #define LSM330_G_HPC4		0x04	/* 0.5 			1 				2 				4			440	*/	
    #define LSM330_G_HPC5		0x05	/* 0.2 			0.5 			1 				2			220	*/
    #define LSM330_G_HPC6		0x06	/* 0.1 			0.2 			0.5 			1			110	*/
    #define LSM330_G_HPC7		0x07	/* 0.05 		0.1 			0.2 			0.5		55		*/
    #define LSM330_G_HPC8		0x08	/* 0.02 		0.05 			0.1 			0.2		22		*/
    #define LSM330_G_HPC9		0x09	/* 0.01 		0.02 			0.05 			0.1		11		*/
    
    /* CTRL_REG3_G */
    #define LSM330_G_I1_Int1 	0x80	/* Interrupt enable on INT1_G pin. Default value 0. (0: Disable; 1: Enable)*/
    #define LSM330_G_I1_Boot 	0x40	/* Boot status available on INT1_G. Default value 0. (0: Disable; 1: Enable) */
    #define LSM330_G_H_Lactive 	0x20	/* Interrupt active configuration on INT1_G. Default value 0. (0: High; 1:Low) */
    #define LSM330_G_PP_OD		0x10	/* Push-Pull / Open drain. Default value: 0. (0: Push-Pull; 1: Open drain) */
    #define LSM330_G_I2_DRDY	0x08	/* Date Ready on DRDY_G/INT2_G. Default value 0. (0: Disable; 1: Enable)  */
    #define LSM330_G_I2_WTM		0x04	/* FIFO watermark interrupt on DRDY_G/INT2_G. Default value: 0. (0: Disable; 1: Enable)*/
    #define LSM330_G_I2_ORun	0x02	/* FIFO overrun interrupt on DRDY_G/INT2_G Default value: 0. (0: Disable; 1: Enable) */
    #define LSM330_G_I2_Empty	0x01	/* FIFO empty interrupt on DRDY_G/INT2_G. Default value: 0. (0: Disable; 1: Enable) */
    
    /* CTRL_REG4_G */
    /* FS1-FS0 Full-scale selection. Default value: 00 (00: 250 dps; 01: 500 dps; 10: 2000 dps; 11: 2000 dps)*/
    #define LSM330_G_FS250		0
    #define LSM330_G_FS500		0x10
    #define LSM330_G_FS2000		0x20
    
     /* CTRL_REG5_G */
    #define LSM330_G_BOOT		0x80	/* Reboot memory content. Default value: 0(0: normal mode; 1: reboot memory content) */
    #define LSM330_G_FIFO_EN	0x40	/* FIFO enable. Default value: 0(0: FIFO disable; 1: FIFO Enable) */
    #define LSM330_G_HPen		0x20	/* High-pass filter enable. Default value: 0(0: HPF disabled; 1: HPF enabled  ) */
    /* INT1_Sel1-INT1_Sel0 INT1 selection configuration. Default value: 0 */
    #define LSM330_G_INT1_HPF	0x04	/* High-pass-filtered data are used for interrupt generation */
    #define LSM330_G_INT1_LPF2	0x08	/* High-pass and low-pass-filtered data are used for interrupt generation */
    /* Out selection configuration. Default value: 0 */
    #define LSM330_G_OUT_HPF	0x01	/* Data in DataReg and FIFO are high-passfiltered */
    #define LSM330_G_OUT_LPF2	0x02	/* Data in DataReg and FIFO are low-passfiltered by LPF2 */
    
    /* STATUS_REG_G */
    #define LSM330_G_ZYXOR		0x80	/* X-, Y-, Z-axis data overwrite. Default value: 0
    									(0: no overwrite has occurred; 1: new data has overwritten 
    										the previous data before it wasread) */
    #define LSM330_G_ZOR		0x40	/* Z-axis data overwrite. Default value: 0
    									(0: no overwrite has occurred; 1: new data for the Z-axis 
    									has overwritten the previous data) */
    #define LSM330_G_YOR		0x20	/* Y-axis data overwrite. Default value: 0(0: no overwrite has occurred; 
    									1: new data for the Y-axis has overwritten the previous data) */
    #define LSM330_G_XOR		0x10	/* X-axis data overwrite. Default value: 0 (0: no overwrite has occurred; 
    									1: new data for the X-axis has overwritten the previous data) */
    #define LSM330_G_ZYXDA 		0x08	/*X-, Y-, Z-axis new data available. Default value: 0 (0: a new set of data is not yet available; 
    										1: a new set of data is available) */
    #define LSM330_G_ZDA		0x04	/* Z-axis new data available. Default value: 0 (0: new data for the Z-axis is not yet available; 
    									1: new data for the Z-axis is available) */
    #define LSM330_G_YDA		0x02	/* Y-axis new data available. Default value: 0 (0: new data for the Y-axis is not yet available; 
    									1: new data for the Y-axis is available) */
    #define LSM330_G_XDA		0x01	/* X-axis new data available. Default value: 0	(0: new data for the X-axis is not yet available;
    									 1: new data for the X-axis is available) */
    									 
    static void lsm330gyroInit(void);
    static void lsm330gyroRead(int16_t *gyroData);
    static void lsm330gyroAlign(int16_t *gyroData);
    static uint8_t mpuLowPassFilter = LSM330_G_HPC7;
    
    bool lsm330gyroDetect(sensor_t *gyro)
    {
       bool ack = false;
        uint8_t sig = 0;
    
        ack = i2cRead(LSM330ACC_ADDRESS, LSM330_CTRL_REG1_A , 1, &sig);
    	  
    	  sig = sig <<5; 
        if (!ack || sig != LSM330ACC_DEVICE_SIGNATURE)
            return false;
    
        gyro->init = lsm330gyroInit;
        gyro->read = lsm330gyroRead;
        gyro->align = lsm330gyroAlign;
    
        return true;
    }
    void lsm330gyroConfig(uint16_t lpf)
    {
        switch (lpf) {
            case 256:
                mpuLowPassFilter = LSM330_G_HPC4;
                break;
            case 188:
                mpuLowPassFilter = LSM330_G_HPC5;
                break;
            case 98:
                mpuLowPassFilter = LSM330_G_HPC6;
                break;
            case 42:
                mpuLowPassFilter = LSM330_G_HPC7;
                break;
            case 20:
                mpuLowPassFilter = LSM330_G_HPC8;
                break;
            case 10:
                mpuLowPassFilter = LSM330_G_HPC9;
                break;
        }
        i2cWrite(LSM330GYRO_ADDRESS, LSM330_CTRL_REG4_G, LSM330_G_FS2000);
        i2cWrite(LSM330GYRO_ADDRESS, LSM330_CTRL_REG2_G, mpuLowPassFilter);
    }
    static void lsm330gyroInit(void)
    {
       
        delay(5);
        i2cWrite(LSM330GYRO_ADDRESS, LSM330_CTRL_REG1_G, 0xBF);
       // 
        
    }
    
    static void lsm330gyroAlign(int16_t *gyroData)
    {
        // official direction is RPY
        gyroData[0] = gyroData[0] / 4;
        gyroData[1] = gyroData[1] / 4;
        gyroData[2] = -gyroData[2] / 4;
    }
    
    // Read 3 gyro values into user-provided buffer. No overrun checking is done.
    static void lsm330gyroRead(int16_t *gyroData)
    {
        uint8_t buf[6];
        i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_X_L_G, 6, buf);
        gyroData[0] = (buf[1] << 8) | buf[0];
        gyroData[1] = (buf[3] << 8) | buf[2];
        gyroData[2] = (buf[5] << 8) | buf[4];
    }
    
    /*static int16_t lsm330gyroReadTemp(void)
    {
        char buf[1];
        i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_TEMP_G, 1, buf);
        
        return 35 + ((int32_t)(buf[0]) + 13200) / 280;
    }*/
    результат тотже что и с акселем, устройство обнаружено, а дальше полная бяка в показаниях, значит что-то не так делаю? если кто-то что заметит ткните носом пожалуйста...

  18. #495

    Регистрация
    05.06.2012
    Адрес
    Тольятти
    Возраст
    30
    Сообщений
    48
    Поищите на github'e... Выкладывал кто-то уже ссылку эту: https://github.com/jrowberg/i2cdevli...master/Arduino для i2c много полезной инфы с примерами. Думаю можно много найти полезного. И решение вашей задачи тоже )))

  19. #496

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    нету там, я уже искал

  20. #497

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Уряя всё заработалооо!!!!
    Вот оно колдунство
    По образцу TC
    Код:
    i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_X_L_G, 6, buf);
    неработает ,
    По образцу Дмитрия omegapraim
    Код:
    i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_X_L_G +0x80, 6, buf);
    Заработало!!!!

  21. #498

    Регистрация
    05.06.2012
    Адрес
    Тольятти
    Возраст
    30
    Сообщений
    48
    Видео возвращаемых данных, плиз!!!)) сейчас сам сижу мучаюсь с APC220 )))

  22. #499

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    осталась одна проблема, аппарат то у меня последний кончился, так что только к осени проверю

    Цитата Сообщение от IvanDeft Посмотреть сообщение
    Видео возвращаемых данных, плиз!!!)) сейчас сам сижу мучаюсь с APC220 )))
    немного по позже, на радостях оторвал программатор, и уезжать с утра надо, но щяс паяльник раскачегарю...

  23. #500

    Регистрация
    11.05.2008
    Адрес
    Великий Новгород
    Возраст
    38
    Сообщений
    3,939
    Записей в дневнике
    22
    Цитата Сообщение от SergDoc Посмотреть сообщение
    LSM330_OUT_X_L_G +0x80
    а в чем юмор? вместо даташитного регистра 0x29h вы читатете регистр 0xA8h (29h+80h) которого даже чисто технически нет. может там вместо данных мусор какой, а вы тут радуетесь

  24. #501

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Цитата Сообщение от HikeR Посмотреть сообщение
    а в чем юмор? вместо даташитного регистра 0x29h вы читатете регистр 0xA8h (29h+80h) которого даже чисто технически нет. может там вместо данных мусор какой, а вы тут радуетесь
    В том то и прикол что показания точные, а вот раньше был мусор, сам в шоке - пока непонял почему так, разберусь отпишу...

    вот что пишут
    The I2C embedded inside the LSM330DL behaves like a slave device and the following
    protocol must be adhered to. After the start condition (ST) a slave address is sent, once a
    slave acknowledge (SAK) has been returned, an 8-bit sub-address (SUB ) will be
    transmitted: the 7 LSb represents the actual register address while the MSB enables the
    address auto increment. If the MSb of the SUB field is ‘1’, the SUB (register address) will be
    automatically increased to allow multiple data read/writes.
    для автоматического приращения регистров, а не просто к адресу регистра прибавить число...

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

    Меня сейчас волнует магнитометр, он походу на что-то на плате реагирует, не на баро ли, если так придётся разводить всё по новой, и перепаивать...
    Последний раз редактировалось SergDoc; 19.06.2012 в 01:27.

  25. #502

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    На разъём программатора

  26. #503

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    С магнитометром разобрался, виновник - шнурок от программатора, после замены показания просто супер, остаётся вопрос по барометру, он у меня почему-то показывает -632.22, показания меняются только после запятой, ну изредка -633, в чём может быть беда? совместимость полная с NAZE 32 так что должен работать...

    может просто дохлый?

  27. #504

    Регистрация
    11.05.2008
    Адрес
    Великий Новгород
    Возраст
    38
    Сообщений
    3,939
    Записей в дневнике
    22
    Цитата Сообщение от SergDoc Посмотреть сообщение
    показания просто супер
    что, прям идеальный шар получится если покрутить по всем осям и снять показания?

    я как-то с телефона снял сырые данные с датчиков, по компасу получилось вот так:


    смещение, вогнутость-выпуклость, овальность и прочие гадости.

  28. #505

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Я имею ввиду что платка и компас обычный рядом, показывают одно и тоже , а значит платку переделывать ненадо, кстати TC что-то менял в прошивке относительно магнитометра, а у меня сейчас последняя версия...

    А ещё может это не так критично но у меня время цикла 1100 максимум, а в NAZE32 заявлен 1300...

  29. #506

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Цитата Сообщение от SergDoc Посмотреть сообщение
    может просто дохлый?
    ну уже незнаю что с ним и делать - заказать новый?

  30. #507

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    29
    Сообщений
    1,674
    Записей в дневнике
    6
    у меня с баро (bmp085) такое было (-330) когда стал его прикручивать...
    когда разобрался оказалось все просто - поменять адрес... я по i2c родной либой на хмегу пользуюсь - там адрес 8-ми битный нужен
    так что проверь этот момент и посмотри все ли читается с баро?

  31. #508

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    1. Адрес семь бит
    2. Читается, иначе автодетект бы не сработал
    3. в коде всё правильно - NAZE32 работает
    Возможности две (баро стоял на платке прикручивающейся к СС), либо перегрет, либо в него что-то прописано нехорошее после неудачных экспериментов с шиной i2c в СС...

  32. #509

    Регистрация
    07.04.2012
    Адрес
    Брянск
    Возраст
    29
    Сообщений
    1,674
    Записей в дневнике
    6
    1. ну если используется i2c драйвер со сдвигом чтения/записи то да... 7 бит... у меня же используется 8-ми битный
    2. у меня он тоже не выдавал никаких ошибок, но данные были тоже в минусах... сейчас все норм и т-ру показывает реальную, и высоту 200м, прыгает в пределах полуметра в стабильном состоянии
    это было просто мое предположение... если баро дохлый или еще чего тут уже другой вопрос

  33. #510

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    ГЫ-ГЫ надо драйвер копать тут то у меня баро работал http://forum.rcdesign.ru/f123/thread...ml#post3409611 - это со стандартной прошивкой, значит либо я напартачил, либо у TC исходники с ошибкой выложены, вечером залью стандартную и проверю...

  34. #511

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Непомогло

  35. #512
    Забанен
    Регистрация
    30.11.2011
    Адрес
    Киев
    Возраст
    36
    Сообщений
    373
    Цитата Сообщение от SergDoc Посмотреть сообщение
    Вот драйвер для гиры:
    Попробуйте в адресе по которому начинаете читать данные установить в 1 старший бит.

  36. #513

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Цитата Сообщение от Alexey_1811 Посмотреть сообщение
    Попробуйте в адресе по которому начинаете читать данные установить в 1 старший бит.
    С этим я уже давно разобрался, у меня сейчас баро не работает, при чём на старых прошивках ТС ноль показывает, а на новых -632, вот в чём прикол, и ТС пишет
    Requires latest development version of MultiWiiConf from http://code.google.com/p/multiwii/downloads/list. Firmware shipped after May 7 2012 only works with development version of MultiWiiConf, does not work with 2.0 release (due to serial protocol changes).
    но такой версии я не нашол, может у меня тупо в этом проблема...

  37. #514

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Чёт меня в сторону КУКа потянуло, собрать на аналоговых гирах и акселе, что-нибудь на атмеге, посчитать фильтр, отложенный пока в загашник, вывести крутилки P I, а то чёт я совсем духом упал, после дохлого барометра, да и коптер ещё не скоро соберу, вроде как из двух движков покалеченых один можно собрать - останется один прикупить (в одном колокольчик прогнулся и магниты раскололись, во втором вроде только магнит один) серва на крайняк ещё одна имеется лучи едут

    о кстати вот драйвера к LSM330 если кому надо:

    аксель немного шумит, но можно с фильтрами поизгалятся....

  38. #515

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Крайняя паршивка работает с Mw-WinGUI-2.1RC1 подходит для NAZE32 c MPU6050, с 3050 работать не будет есть так же сомнения на счёт баро

  39. #516

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Поизголялся над фильтрами акселя, теперь +-2 по оси при условии, что 1g = 255 как считаете нормально?
    Надо теперь температурной стабилизацией гир занятся....

  40. #517

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Уряяя температура вроде побеждена, если раньше поднесёшь платку к кулеру, гиры отправлялись в свободное плавание, теперь скачёк и назад в горизонт...

  41. #518

    Регистрация
    17.06.2011
    Адрес
    Минск
    Возраст
    39
    Сообщений
    1,941
    Цитата Сообщение от SergDoc Посмотреть сообщение
    Уряяя температура вроде побеждена
    Сделал температурную коррекцию? Я как то феном пробовал греть, вроде бы аксели уплывали прилично.

  42. #519

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    сколхозил
    Код:
    static void lsm330gyroReadTemp(int16_t *tempData)
    {
        uint8_t buf[1];
        i2cRead(LSM330GYRO_ADDRESS, LSM330_OUT_TEMP_G, 1, buf);
        
        *tempData = 35 + ((int32_t)(buf[0]) + 13200) / 280;
    }
    это в драйвере, а дальше у ТС она есть...

  43. #520

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,459
    Записей в дневнике
    8
    Думаю, всё же надо JTAG программатор собрать, на FT232 какие подводные камни могу встретить?

    Или можно на Silabs?

+ Ответить в теме

Похожие темы

  1. Система стабилизации гиро+акселерометр
    от Фантомас в разделе Полеты по камере, телеметрия
    Ответов: 32
    Последнее сообщение: 25.01.2011, 14:47
  2. Продам Продам Клона Trex 450SEV2 + Аппаратура + Запчасти+ система стабилизации RTF
    от omegapraim в разделе Барахолка. Вертолеты
    Ответов: 1
    Последнее сообщение: 12.01.2011, 18:16
  3. Продам Трёхосевую систему стабилизации Turnigy V-Bar 600
    от avi@tor в разделе Барахолка. Аппаратура
    Ответов: 1
    Последнее сообщение: 08.11.2010, 13:02
  4. Продам Gaui система стабилизации GU365, дёшево.
    от avi@tor в разделе Барахолка. Вертолеты
    Ответов: 3
    Последнее сообщение: 03.08.2010, 11:13
  5. Системы стабилизации
    от max815 в разделе Фото и видеосъемка, системы стабилизации
    Ответов: 16
    Последнее сообщение: 11.03.2010, 03:14

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения