Специальные цены   новые товары
+ Ответить в теме
Страница 47 из 165 ПерваяПервая ... 37 45 46 47 48 49 57 ... ПоследняяПоследняя
Показано с 1,841 по 1,880 из 6569

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

Тема раздела Квадрокоптеры. Общие вопросы в категории Квадрокоптеры и мультироторы; Сообщение от oleg70 Кто нибудь "сырые" данные с LSM303DLHC смотрел ? Вот РусИНС1.0>АП.ИНС.АКСЕЛЬ.ДАННЫЕ:Acc:-0.012,-0.012,1.058 raw:-16,-16,1376 Acc:0.000,0.000,1.058 raw:0,0,1376 Acc:0.025,-0.012,1.071 raw:32,-16,1392 Acc:0.000,0.012,1.034 raw:0,16,1344 ...

  1. #1841

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от oleg70 Посмотреть сообщение
    Кто нибудь "сырые" данные с LSM303DLHC смотрел ?
    Вот
    РусИНС1.0>АП.ИНС.АКСЕЛЬ.ДАННЫЕ:Acc:-0.012,-0.012,1.058 raw:-16,-16,1376
    Acc:0.000,0.000,1.058 raw:0,0,1376
    Acc:0.025,-0.012,1.071 raw:32,-16,1392
    Acc:0.000,0.012,1.034 raw:0,16,1344
    Acc:0.000,-0.012,1.083 raw:0,-16,1408
    Acc:0.000,-0.049,1.058 raw:0,-64,1376
    Acc:0.000,0.000,1.058 raw:0,0,1376
    Acc:0.172,0.025,1.034 raw:224,32,1344
    Acc:0.000,-0.037,1.046 raw:0,-48,1360
    Acc:-0.012,-0.012,1.071 raw:-16,-16,1392
    Acc:-0.025,-0.025,1.034 raw:-32,-32,1344
    Acc:0.025,0.049,1.132 raw:32,64,1472
    Acc:0.012,0.037,1.083 raw:16,48,1408
    Acc:-0.012,0.025,1.046 raw:-16,32,1360
    Acc:0.012,0.037,1.046 raw:16,48,1360
    Acc:-0.012,0.000,1.034 raw:-16,0,1344
    Acc:0.025,0.000,1.058 raw:32,0,1376
    Acc:0.025,0.000,1.083 raw:32,0,1408
    Acc:0.025,0.000,1.058 raw:32,0,1376
    Acc:0.012,0.000,1.034 raw:16,0,1344
    Acc:0.025,0.000,1.058 raw:32,0,1376
    Acc:0.025,-0.025,1.108 raw:32,-32,1440
    Acc:-0.025,0.025,1.083 raw:-32,32,1408
    Acc:-0.025,0.025,1.058 raw:-32,32,1376
    Acc:0.000,-0.012,1.058 raw:0,-16,1376
    Acc:0.012,-0.012,1.046 raw:16,-16,1360
    Acc:0.025,0.012,1.046 raw:32,16,1360
    Acc:-0.025,0.025,1.108 raw:-32,32,1440
    Acc:0.000,-0.025,1.034 raw:0,-32,1344
    Acc:0.000,0.025,1.058 raw:0,32,1376
    Acc:0.000,0.000,1.071 raw:0,0,1392
    Acc:-0.012,0.000,1.009 raw:-16,0,1312
    Acc:0.012,0.012,1.071 raw:16,16,1392
    Acc:0.000,0.000,1.034 raw:0,0,1344
    Acc:0.000,0.000,1.034 raw:0,0,1344
    Acc:-0.049,-0.025,1.034 raw:-64,-32,1344
    Acc:0.025,0.000,1.009 raw:32,0,1312
    Acc:0.025,0.000,1.034 raw:32,0,1344
    Acc:-0.025,0.025,1.034 raw:-32,32,1344
    Acc:-0.012,0.012,1.034 raw:-16,16,1344
    Acc:0.000,0.012,1.071 raw:0,16,1392
    Acc:0.000,0.000,1.071 raw:0,0,1392
    Acc:-0.037,0.025,1.058 raw:-48,32,1376
    Acc:0.000,0.025,1.058 raw:0,32,1376
    Acc:-0.025,0.000,1.108 raw:-32,0,1440
    Acc:0.000,0.000,1.034 raw:0,0,1344
    Acc:0.000,0.000,1.083 raw:0,0,1408
    Acc:0.025,0.074,1.058 raw:32,96,1376
    Acc:0.025,0.012,1.058 raw:32,16,1376
    Acc:0.000,0.012,1.058 raw:0,16,1376
    Acc:0.025,0.012,1.071 raw:32,16,1392
    Acc:-0.012,0.012,1.058 raw:-16,16,1376
    Acc:-0.025,0.000,1.058 raw:-32,0,1376
    Acc:0.025,0.000,1.034 raw:32,0,1344
    Acc:0.000,0.000,1.108 raw:0,0,1440
    Acc:0.000,0.000,1.083 raw:0,0,1408
    Acc:0.000,-0.012,1.058 raw:0,-16,1376
    Acc:-0.012,0.025,1.058 raw:-16,32,1376
    Acc:0.000,0.000,1.058 raw:0,0,1376
    Acc:0.000,0.000,1.034 raw:0,0,1344
    Acc:-0.025,0.012,1.046 raw:-32,16,1360
    Acc:-0.012,0.000,1.058 raw:-16,0,1376
    Acc:0.000,0.000,1.071 raw:0,0,1392
    Acc:0.049,0.000,1.009 raw:64,0,1312
    Acc:0.000,0.000,1.009 raw:0,0,1312
    Acc:0.000,0.025,1.058 raw:0,32,1376
    Acc:-0.025,-0.025,1.058 raw:-32,-32,1376
    Цитата Сообщение от oleg70 Посмотреть сообщение
    Что то у меня он "зверски" шумит (именно аксель, магнетометр приемлемо), буквально данные скачут +/- 16, 32, 64 мл.разр. при любой уст. чувствительности.....
    У меня аксель стоит на 16Г, так что это вполне нормально, шум примерно 2 тысячных

  2.  
  3. #1842

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

  4. #1843

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от SergDoc Посмотреть сообщение
    покатился, то-ли белый-белый совсем горячий, то-ли какая-то из форм шизофрении
    "абсолютно здоровых людей нет, есть недообследованные".
    Цитата Сообщение от SergDoc Посмотреть сообщение
    дрель свою сегодня забирал у него, жена его помогала ибо он вообще отрешен от деяния сего был
    Проявилось только в этом?
    Если да, то может просто устал (весна, авитоминоз, недосып)? Если характер системный, то это кризис наверное, нелады в семье, человек "с тонкой душевной организацией", "движется по жизни" туда куда не хочет, а куда, где и как свернуть не знает, разочаровался в чем-то важном для него и т.п. Тут "вывод из запоя по фотографии" не возможен, нужно как-то поговорить с человеком. При чём не начинать с распросов и проблем, а организовать (если есть немного времени и денег) выход на природу с шашлыком, на рыбалку, если проблемы не в семье, то семьями, детьми. Главное выдернуть человека из "каши" в которой он "варится".
    Ну а если это
    Цитата Сообщение от SergDoc Посмотреть сообщение
    то-ли белый-белый совсем горячий, то-ли какая-то из форм шизофрении
    , то только к специалистам.

  5. #1844

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Осилил "Free IMU" (расчет положения ~12 мк./сек !!! - STM --мооощьь) , только вот данные по углам наблюдаю в терминалке...
    Господа подскажите наиболее простой 3D GUI (в этом полный "ноль"), чтоб я мог радоваться дальше, если можно с рецептом установки и связи по COMport-у...

  6.  
  7. #1845

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

  8. #1846

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от oleg70 Посмотреть сообщение
    подскажите наиболее простой 3D GUI

    Цитата Сообщение от HikeR Посмотреть сообщение
    у polulu стырьте програмку для компа
    Та же прога только дополненная, максимальный протокол,
    printf("!ANG:%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,",
    ToDeg(vI.x),
    ToDeg(vI.y),
    ToDeg(vI.z),
    ToDeg(vU.x),
    ToDeg(vU.y),
    ToDeg(vU.z),
    va.x,va.y,va.z, vm.x,vm.y,vm.z
    );
    printf("%.2f,%.2f,%.2f\r\n",vv.x,vv.y,vv.z);
    vI - углы вокруг осей в градусах синий самолётик, vU - углы вокруг осей в градусах красный самолётик, дальше 3 координаты 3х векторов (второй набор углов и вектора можно неуказывать, отбражаться не будут).
    Вложения

  9. #1847

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Все настроил, но самолетики не движутся, у меня углы в переменных типа "int16_t", как грамотно printf() подправить или тип данных для него ?

  10.  
  11. #1848

    Регистрация
    11.05.2008
    Адрес
    Великий Новгород
    Возраст
    38
    Сообщений
    3,939
    Записей в дневнике
    22

  12. #1849

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

    !ANG:-0.50,1.05,-69.99,0.00,-0.00,-85.50,-0.08,0.01,0.98,0.42,-0.00,-0.91,-0.00,0.01,-0.00
    !ANG:-0.48,1.06,-70.00,0.00,-0.00,-85.50,-0.03,0.02,0.98,0.42,-0.01,-0.91,-0.01,0.01,-0.01
    !ANG:-0.47,1.08,-70.01,0.00,-0.00,-85.50,-0.02,0.00,1.02,0.42,-0.00,-0.91,-0.01,0.02,0.00
    !ANG:-0.48,1.06,-70.01,0.00,-0.00,-85.50,0.01,-0.02,1.03,0.43,0.01,-0.90,-0.01,0.01,0.01
    !ANG:-0.50,1.05,-70.01,0.00,-0.00,-85.50,0.05,-0.02,1.02,0.43,-0.00,-0.91,0.00,0.01,0.01
    !ANG:-0.50,1.05,-70.00,0.00,-0.00,-85.50,-0.01,-0.01,0.98,0.42,-0.00,-0.91,-0.00,0.00,0.01
    Либо вот такое в минимальном формате
    !ANG:-0.50,1.05,-69.99
    !ANG:-0.48,1.06,-70.00
    !ANG:-0.47,1.08,-70.01
    Ещё нужно прописать свой ком-порт и скорость
    ser = serial.Serial(port='COM5',baudrate=57600, timeout=1)
    И ещё момент, в конце строки ЧЕРЕЗ запятую ставь символ ">"? т.к. у меня по началу проверяется ответ контроллера

  13. #1850

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Таймкоп что-то раздобрел. 6000?
    ибо 6050 странно?

    дийдроносы хотят Wii пересадить на PX4 http://diydrones.com/forum/topics/px4-multiwii
    а вот колдовство afrowii, MPU6000 + hmc5883
    Код:
    #if defined(MPU6000SPI)
    static uint8_t mpuInitialized = 0;
    #define MPU_OFF            GPIO_WriteHigh(GPIOB, GPIO_PIN_2);
    #define MPU_ON             GPIO_WriteLow(GPIOB, GPIO_PIN_2);
    
    #define MPUREG_WHOAMI               0x75
    #define MPUREG_SMPLRT_DIV           0x19
    #define MPUREG_CONFIG               0x1A
    #define MPUREG_GYRO_CONFIG          0x1B
    #define MPUREG_ACCEL_CONFIG         0x1C
    #define MPUREG_I2C_MST_CTRL         0x24
    #define MPUREG_I2C_SLV0_ADDR        0x25
    #define MPUREG_I2C_SLV0_REG         0x26
    #define MPUREG_I2C_SLV0_CTRL        0x27
    #define MPUREG_I2C_SLV4_ADDR        0x31
    #define MPUREG_I2C_SLV4_REG         0x32
    #define MPUREG_I2C_SLV4_DO          0x33
    #define MPUREG_I2C_SLV4_CTRL        0x34
    #define MPUREG_I2C_SLV4_DI          0x35
    #define MPUREG_I2C_MST_STATUS       0x36
    #define MPUREG_INT_PIN_CFG          0x37
    #define MPUREG_INT_ENABLE           0x38
    #define MPUREG_ACCEL_XOUT_H         0x3B
    #define MPUREG_ACCEL_XOUT_L         0x3C
    #define MPUREG_ACCEL_YOUT_H         0x3D
    #define MPUREG_ACCEL_YOUT_L         0x3E
    #define MPUREG_ACCEL_ZOUT_H         0x3F
    #define MPUREG_ACCEL_ZOUT_L         0x40
    #define MPUREG_TEMP_OUT_H           0x41
    #define MPUREG_TEMP_OUT_L           0x42
    #define MPUREG_GYRO_XOUT_H          0x43
    #define MPUREG_GYRO_XOUT_L          0x44
    #define MPUREG_GYRO_YOUT_H          0x45
    #define MPUREG_GYRO_YOUT_L          0x46
    #define MPUREG_GYRO_ZOUT_H          0x47
    #define MPUREG_GYRO_ZOUT_L          0x48
    #define MPUREG_EXT_SENS_DATA_00     0x49 // Registers 0x49 to 0x60 - External Sensor Data
    #define MPUREG_I2C_SLV0_DO          0x63 // This register holds the output data written into Slave 0 when Slave 0 is set to write mode.
    #define MPUREG_I2C_MST_DELAY_CTRL   0x67 // I2C Master Delay Control
    #define MPUREG_USER_CTRL            0x6A
    #define MPUREG_PWR_MGMT_1           0x6B
    #define MPUREG_PWR_MGMT_2           0x6C
    
    // Configuration bits MPU 6000
    #define BIT_SLEEP                   0x40
    #define BIT_H_RESET                 0x80
    #define BITS_CLKSEL                 0x07
    #define MPU_CLK_SEL_PLLGYROX        0x01
    #define MPU_CLK_SEL_PLLGYROZ        0x03
    #define MPU_EXT_SYNC_GYROX          0x02
    #define BITS_AFS_2G                 0x00
    #define BITS_AFS_4G                 0x08
    #define BITS_AFS_8G                 0x10
    #define BITS_AFS_16G                0x18
    #define BITS_FS_250DPS              0x00
    #define BITS_FS_500DPS              0x08
    #define BITS_FS_1000DPS             0x10
    #define BITS_FS_2000DPS             0x18
    #define BITS_FS_MASK                0x18
    #define BITS_DLPF_CFG_256HZ_NOLPF2  0x00
    #define BITS_DLPF_CFG_188HZ         0x01
    #define BITS_DLPF_CFG_98HZ          0x02
    #define BITS_DLPF_CFG_42HZ          0x03
    #define BITS_DLPF_CFG_20HZ          0x04
    #define BITS_DLPF_CFG_10HZ          0x05
    #define BITS_DLPF_CFG_5HZ           0x06
    #define BITS_DLPF_CFG_2100HZ_NOLPF  0x07
    #define BITS_DLPF_CFG_MASK          0x07
    #define BIT_INT_ANYRD_2CLEAR        0x10
    #define BIT_RAW_RDY_EN              0x01
    #define BIT_I2C_IF_DIS              0x10
    #define BIT_I2C_SLV0_EN             0x80
    
    static uint8_t MPU6000_Buffer[14 + 6];   // Sensor data ACCXYZ|TEMP|GYROXYZ | Magnetometer data
    
    static uint8_t MPU6000_ReadReg(uint8_t Address)
    {
        uint8_t rv;
        MPU_ON;
        spi_writeByte(Address | 0x80); // Address with high bit set = Read operation
        rv = spi_readByte();
        MPU_OFF;
        return rv;
    }
    
    static void MPU6000_getSixRawADC(void)
    {
        uint8_t i;
        MPU_ON;
        spi_writeByte(MPUREG_ACCEL_XOUT_H | 0x80); // Address with high bit set = Read operation
        // ACC X, Y, Z, TEMP, GYRO X, Y, Z, MagData[6]
        for (i = 0; i < 14 + 6; i++)
            MPU6000_Buffer[i] = spi_readByte();
        MPU_OFF;
    }
    
    static void MPU6000_WriteReg(uint8_t Address, uint8_t Data)
    {
        MPU_ON;
        spi_writeByte(Address);
        spi_writeByte(Data);
        MPU_OFF;
        delay(1);
    }
    
    void MPU6000_init(void)
    {
        // SPI ChipSelect for MPU-6000
        GPIO_Init(GPIOB, GPIO_PIN_2, GPIO_MODE_OUT_PP_HIGH_FAST);
        MPU_OFF;
    
        // MPU-6000 input tied to interrupt (TODO). Input-only for now.
        GPIO_Init(GPIOB, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);
    
        MPU6000_WriteReg(MPUREG_PWR_MGMT_1, BIT_H_RESET);
        delay(100);
        MPU6000_WriteReg(MPUREG_PWR_MGMT_1, MPU_CLK_SEL_PLLGYROZ);      // Set PLL source to gyro output
        MPU6000_WriteReg(MPUREG_USER_CTRL, 0b00110000);                 // I2C_MST_EN
        // MPU6000_WriteReg(MPUREG_USER_CTRL, BIT_I2C_IF_DIS);             // Disable I2C bus
        MPU6000_WriteReg(MPUREG_SMPLRT_DIV, 0x04);                      // Sample rate = 200Hz    Fsample = 1Khz / (4 + 1) = 200Hz  
        MPU6000_WriteReg(MPUREG_CONFIG, 0); // BITS_DLPF_CFG_42HZ);            // Fs & DLPF Fs = 1kHz, DLPF = 42Hz (low pass filter)
        MPU6000_WriteReg(MPUREG_GYRO_CONFIG, BITS_FS_2000DPS);          // Gyro scale 2000?/s
        MPU6000_WriteReg(MPUREG_ACCEL_CONFIG, BITS_AFS_4G);             // Accel scale 4G
        MPU6000_WriteReg(MPUREG_INT_ENABLE, BIT_RAW_RDY_EN);            // INT: Raw data ready
        MPU6000_WriteReg(MPUREG_INT_PIN_CFG, BIT_INT_ANYRD_2CLEAR);     // INT: Clear on any read
    
        mpuInitialized = 1;
    }
    
    void ACC_init()
    {
        if (!mpuInitialized)
            MPU6000_init();
           
        acc_1G = 256;
    }
    
    void ACC_getADC()
    {
        MPU6000_getSixRawADC();
        ACC_ORIENTATION(-(MPU6000_Buffer[0] << 8 | MPU6000_Buffer[1]) / 16, -(MPU6000_Buffer[2] << 8 | MPU6000_Buffer[3]) / 16, (MPU6000_Buffer[4] << 8 | MPU6000_Buffer[5]) / 16);
        ACC_Common();
    }
    
    void Gyro_init(void)
    {
        if (!mpuInitialized)
            MPU6000_init();
    }
    
    void Gyro_getADC(void)
    {
        // range: +/- 8192; +/- 2000 deg/sec
        MPU6000_getSixRawADC();
        GYRO_ORIENTATION((((MPU6000_Buffer[10] << 8) | MPU6000_Buffer[11]) / 4), -(((MPU6000_Buffer[8] << 8) | MPU6000_Buffer[9]) / 4), -(((MPU6000_Buffer[12] << 8) | MPU6000_Buffer[13]) / 4));
        GYRO_Common();
    }
    
    #define HMC5883L_I2C_ADDRESS        0x1e
    #define HMC5883L_ID_REG_A           0x0a
    #define HMC5883L_ID_REG_B           0x0b
    #define HMC5883L_ID_REG_C           0x0c
    #define HMC5883L_MODE_REG           0x02
    #define HMC5883L_DATA_OUTPUT_X      0x03
    
    void Mag_init(void)
    {
        volatile uint8_t i, temp;
       
        // Initialize compass for continous measurement mode
        MPU6000_WriteReg(MPUREG_I2C_MST_CTRL, 0b01000000 | 13); // WAIT_FOR_ES=1, I2C Master Clock Speed 400kHz
        MPU6000_WriteReg(MPUREG_I2C_SLV4_ADDR, HMC5883L_I2C_ADDRESS); // Write to 5883
        MPU6000_WriteReg(MPUREG_I2C_SLV4_REG, HMC5883L_MODE_REG);
        MPU6000_WriteReg(MPUREG_I2C_SLV4_DO, 0x00); // Mode register  --  value: Continuous-Conversion Mode
        MPU6000_WriteReg(MPUREG_I2C_SLV4_CTRL, 0b11000000); // I2C_SLV4_EN | I2C_SLV4_INT_EN
        delay(1);
    
        // temp = MPU6000_ReadReg(MPUREG_I2C_MST_STATUS);
        // temp = MPU6000_ReadReg(MPUREG_I2C_SLV4_DI);
    
        // Prepare I2C Slave 0 for reading out mag data
        MPU6000_WriteReg(MPUREG_I2C_SLV0_ADDR, 0x80 | HMC5883L_I2C_ADDRESS); // Read from 5883
        MPU6000_WriteReg(MPUREG_I2C_SLV0_REG, HMC5883L_DATA_OUTPUT_X);
        MPU6000_WriteReg(MPUREG_I2C_SLV0_CTRL, 0b10000110); // I2C_SLV0_EN | 6 bytes from mag
        delay(1);
    }
    
    void Device_Mag_getADC(void)
    {
        MAG_ORIENTATION( ((MPU6000_Buffer[18] << 8) | MPU6000_Buffer[19]),  ((MPU6000_Buffer[14] << 8) | MPU6000_Buffer[15]),   ((MPU6000_Buffer[16] << 8) | MPU6000_Buffer[17])    );
    }
    #endif /* MPU6000SPI */
    теперь есть над чем поразмыслить, возможна следующая реинкарнация платы с магнитометром подцепленным к MPU... полный отказ от i2c - барометр по spi, 64-лапый проц(я под него рисовал на бумажке разводку -влазит всё) - следствие (т.к. есть возможность 4 слоя делать) уменьшение размеров? ещё бы где раздобыть драйвер от рук кривых (программировать научится), ладно надо со своей ещё разобраться, а то пришел час Х - кухню начал делать - как следствие, моё рабочее место кончилось.....
    Последний раз редактировалось SergDoc; 16.04.2013 в 12:58.

  14. #1851

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от SergDoc Посмотреть сообщение
    полный отказ от i2c - барометр по spi, 64-лапый проц(я под него рисовал на бумажке разводку -влазит всё)
    Сергей, разве с одной и2ц не влезет, с чем конфликтует?
    ШИМ-входов/выходов 8/8 можно тоже отказаться, достаточно 6/6.

  15. #1852

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    не её можно оставить свободной но датчики то быстрее читать без неё... я прикидывал 64-х лапый проц, входов -выходов хватает (а можно вход ppm только оставить), два spi, i2c, ацп только по моему один вход остаётся (на той что сейчас v1.2, 1 батарея+4 свободны и выведены)...

  16. #1853

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от SergDoc Посмотреть сообщение
    не её можно оставить свободной но датчики то быстрее читать без неё...

    Дык я только ЗА!
    Цитата Сообщение от SergDoc Посмотреть сообщение
    два spi, i2c, ацп только по моему один вход остаётся
    Это плохо, лучше было бы 2 вывода оставить (напруга+ток), остальные вообщем и не нужны.

    Ты, кстати, родную прошивку через УСБ проверял ?

  17. #1854

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

  18. #1855

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от rual Посмотреть сообщение
    Контроллер должен вываливать вот такое
    День убил, - не хочет работать, причем похоже тупо виснет Phiton при выводе графики (с виндой 7 чтоль конфликт)..
    В простой версии MiniImu данные с порта бегут в окне "Shell", но нет изображения 3D кубика.
    В версии по Вашей ссылке есть картинка стрелок (статическая) но нет данных в окне "Shell"...
    Невезуха ..

  19. #1856

    Регистрация
    13.03.2011
    Адрес
    Montreal, Canada
    Возраст
    38
    Сообщений
    2,291
    Записей в дневнике
    19
    Цитата Сообщение от SergDoc Посмотреть сообщение
    дийдроносы хотят Wii пересадить на PX4 http://diydrones.com/forum/topics/px4-multiwii
    Уже как то проскакивал порт вия на F4 https://code.google.com/p/multiwii/s...2FMultiWii_2_1

  20. #1857

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    сейчас спрошу глупость: когда читаю, я засылаю что-то типа 0Xff обратно получаю данные, когда записываю - шлю данные - получаю обратно данные -1?..

  21. #1858

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от SergDoc Посмотреть сообщение
    когда читаю, я засылаю что-то типа 0Xff обратно получаю данные, когда записываю - шлю данные - получаю обратно данные -1?.
    Где получаешь? Через printf? Если так, то тег %x даст 0xff, а тег %d даст -1.

    2mahowik Александр, прочитал аннотацию к твоей прошивке. Ты пишешь про двойное интегрирование акселя и комплементарный фильтр 99/1. Боковые ускорения тоже как то учитываешь для горизонтальной стабилизации? Как ведёт себя коптер при вибрациях?

    Про себя пока сказать нечего, сочиняю более сложную матмодель ИНС (как сказал?!), т.к. интегрировать в аксель по простому не получается. Три попытки повисеть на дальномерах дома обернулись царапинами на дверях, жаль не заснял ранее пролёт по коридору. Щас вышел на работу, попробую снова в коридоре.
    Последний раз редактировалось rual; 17.04.2013 в 13:18.

  22. #1859

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

  23. #1860

    Регистрация
    13.03.2011
    Адрес
    Montreal, Canada
    Возраст
    38
    Сообщений
    2,291
    Записей в дневнике
    19
    Цитата Сообщение от rual Посмотреть сообщение
    Ты пишешь про двойное интегрирование акселя и комплементарный фильтр 99/1. Боковые ускорения тоже как то учитываешь для горизонтальной стабилизации? Как ведёт себя коптер при вибрациях?
    двойной интегралл по акселю получился стабильным (не без хитростей конечно), но в связке аксель+баро... а по гпс пока не выходит аленький цветочек, либо ошибка где то, либо с коэф. оптимальными не разобрался пока, т.к. мало тестов было из за погоды... если интересуют наработки, пиши в личку...

  24. #1861

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от mahowik Посмотреть сообщение
    если интересуют наработки, пиши в личку...
    Не буду (пока ) тебе морочить голову в личке, я думаю таких без меня полно
    Вот хочу сравнить ЛСМку с МПУшкой, у тебя ведь последняя? Можешь дать лог сырых данных акселя с висящего коптера, в этом ведь ничего секретного нет, отсчётов 100?

  25. #1862

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Как правильно под spi переделать:
    Код:
    ack = i2cRead(MPU6050_ADDRESS, MPU_RA_WHO_AM_I, 1, &sig);
    if (!ack)
            return false;
    if (sig != (MPU6050_ADDRESS & 0x7e))
            return false;
    
        // determine product ID and accel revision
        i2cRead(MPU6050_ADDRESS, MPU_RA_XA_OFFS_H, 6, tmp);
        rev = ((tmp[5] & 0x01) << 2) | ((tmp[3] & 0x01) << 1) | (tmp[1] & 0x01);
        if (rev) {
            /* Congrats, these parts are better. */
            if (rev == 1) {
                mpuAccelHalf = 1;
            } else if (rev == 2) {
                mpuAccelHalf = 0;
            } else {
                failureMode(5);
            }
        } else {
            i2cRead(MPU6050_ADDRESS, MPU_RA_PRODUCT_ID, 1, &sig);
            rev = sig & 0x0F;
            if (!rev) {
                failureMode(5);
            } else if (rev == 4) {
                mpuAccelHalf = 1;
            } else {
                mpuAccelHalf = 0;
            }
    - оно надо, ибо это и автодетект, и определение ревизии акселя (потом для настройки нужно).... остался только этот кусочек и можно пробовать с mpu общатся....

  26. #1863

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

  27. #1864

    Регистрация
    13.03.2011
    Адрес
    Montreal, Canada
    Возраст
    38
    Сообщений
    2,291
    Записей в дневнике
    19
    Цитата Сообщение от rual Посмотреть сообщение
    Не буду (пока ) тебе морочить голову в личке, я думаю таких без меня полно
    да без проблем! теребят то в основном по фигне всякой, а тут приятный мужской разговор
    Цитата Сообщение от rual Посмотреть сообщение
    Вот хочу сравнить ЛСМку с МПУшкой, у тебя ведь последняя? Можешь дать лог сырых данных акселя с висящего коптера, в этом ведь ничего секретного нет, отсчётов 100?
    У меня AIOP 1.0 контроллер с mpu6050 на борту... наверное последняя... а их было несколько версий?
    с логами сложнее... я в основном в рантайме на графики смотрю в ГУях, но вроде как андроид прилага EZ-GUI позволяет писать... посмотрю...

  28. #1865

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от mahowik Посмотреть сообщение
    а их было несколько версий?
    Я имел ввиду что у тебя МПУшка, а не другой датчик.

    Цитата Сообщение от mahowik Посмотреть сообщение
    EZ-GUI позволяет писать... посмотрю...
    Хорошо, жду... Если можно побольше отсчётов, а то боюсь для статистики не хватит.

    Цитата Сообщение от SergDoc Посмотреть сообщение
    Как правильно под spi переделать
    ДОстаточно заменить все функции i2cRead(MPU6050_ADDRESS, MPU_RA_XA_OFFS_H, 6, tmp) аналогичной для СПИ.

  29. #1866

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Цитата Сообщение от rual Посмотреть сообщение
    тебя МПУшка, а не другой датчик
    их несколько ревизий было с разными акселями, а единственное, я так понял, что-бы узнать ревизию надо читать регистры MPU_RA_WHO_AM_I и MPU_RA_PRODUCT_ID, а там ревизий 5+6 в зависимости от модификации какой-то....

  30. #1867

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Ну вот наконец-то нижняя плата в сборе, не утерпел - мелкоплата лишилась барометра - теперь обратной дороги нет, надеюсь за два-то года хоть что-то стоящее получилось
    Миниатюры Миниатюры Нажмите на изображение для увеличения
Название: DSCN0358.jpg‎
Просмотров: 1146
Размер:	79.8 Кб
ID:	782336  

  31. #1868

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Сергей, когда планируешь прошивку доделать? Разъем ПРОГ это усарт1?

  32. #1869

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Цитата Сообщение от rual Посмотреть сообщение
    Разъем ПРОГ это усарт1?
    да, это первый телеметрия второй, gps - 3-й выведен сверху на верхнюю плату, а с прошивкой чувствую ещё долго телепаться буду по крайней мере детект мпу не прокатил, буду смотреть отладчиком как время будет... сейчас работают только светодиоды - инициализация, ну и ошибка при детекте - перемигиваемся и всё....

  33. #1870

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от SergDoc Посмотреть сообщение
    gps - 3-й выведен сверху на верхнюю плату
    т.е. на 2м этаже у тебя свой ГПС будет?

  34. #1871

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

    ещё пищалка, MicroSD, батарейка.....

  35. #1872

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от SergDoc Посмотреть сообщение
    Ну вот наконец-то нижняя плата в сборе
    Я сейчас изучаю углы, рассчитанные IMU со своей самоделки, и вдруг задумался (!): а правильно ли я разместил относительно друг друга гиру и аксель+маг на плате ? Одноименные оси (по даташиту) получились совмещены в одном направлении... правильно?
    Есть ли правило или методика их установки, а то похоже что у мня присутствует взаимное влияние X на Y...

  36. #1873

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    вообще-то без разницы, потом просто оси переназначить программно и всё
    типа:
    Код:
    static void mpu6050AccAlign(int16_t *accData)
    {
        int16_t temp[2];
        temp[0] = accData[0];
        temp[1] = accData[1];
    
    
        // official direction is RPY
        accData[0] = temp[1];
        accData[1] = -temp[0];
        accData[2] = accData[2];
    }

  37. #1874

    Регистрация
    26.11.2012
    Адрес
    Tambov
    Возраст
    46
    Сообщений
    777
    Цитата Сообщение от SergDoc Посмотреть сообщение
    просто оси переназначить
    Так вот и вопрос, то КАК,.. по идее ось "X" гиро. и ось "Х" акселя должны быть в одном направлении, а с другой стороны вращение (и угловая скорость) у гиры не вдоль оси "Х" а перпедикулярно.... что то я совсем запутался.

  38. #1875

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

  39. #1876

    Регистрация
    19.04.2010
    Адрес
    Ханты
    Возраст
    40
    Сообщений
    1,471
    Цитата Сообщение от oleg70 Посмотреть сообщение
    а правильно ли я разместил относительно друг друга гиру и аксель+маг на плате
    Я так проверял: сначала отключаешь коррекцию по аксу и магу, смотришь как ведет себя интегрированный гироскоп, если не так исправляешь знаки, меняешь местами координаты. Потом вколючаем коррекцию по акселю, крутим в руках, проблема проявляется как медленный завал в сторону, либо при резком движении положение меняется правильно, потом медленно переползает в противоположную сторону,если неправильный знак у оси акселя. Аналогично маг.

  40. #1877

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    я что-то с spi начудил, в отладчике вижу, что порты настроены на af5- т.е. всё правильно - spi, где глядеть cs-переключается или нет? не прочитал я регистр (значение0х00 осталось), вот автодетект и стопорнул всё....
    да cs криво настроил, теперь получил - ну не то что хотел, ковыряю дальше....
    Последний раз редактировалось SergDoc; 19.04.2013 в 01:12.

  41. #1878

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

  42. #1879

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

    Переделал и перезалил в git так же продублирую сюда
    Последний раз редактировалось SergDoc; 19.04.2013 в 22:11.

  43. #1880

    Регистрация
    01.11.2010
    Адрес
    Belarus Slonim
    Возраст
    36
    Сообщений
    4,462
    Записей в дневнике
    8
    Так, у меня несколько новостей, больше наверно плохих, uart с dma я победил, у меня работает cli и gui коннектится, но не работает i2c (возможно из-за барометра) и нет показаний с гироакселя, хотя плата на наклоны реагирует (подмигивает).... оторвал проводок от jtag в потёмках явно не запаяю, отложу пока, ибо без отладчика делать нечего дальше....
    уарт - пробы и ошибки не удалял просто коментировал, может кому пригодится:
    Код:
    #include "board.h"
    
    /*
        DMA UART routines idea lifted from AutoQuad
        Copyright © 2011  Bill Nesbitt
    */
    #define UART_BUFFER_SIZE    256
    
    // Receive buffer, circular DMA
    volatile uint8_t rxBuffer[UART_BUFFER_SIZE];
    uint32_t rxDMAPos = 0;
    volatile uint8_t txBuffer[UART_BUFFER_SIZE];
    uint32_t txBufferTail = 0;
    uint32_t txBufferHead = 0;
    
    static void uartTxDMA(void)
    {
    	DMA2_Stream7->M0AR = (uint32_t)&txBuffer[txBufferTail];
        if (txBufferHead > txBufferTail) {
        	DMA2_Stream7->NDTR = txBufferHead - txBufferTail;
            txBufferTail = txBufferHead;
        } else {
        	DMA2_Stream7->NDTR = UART_BUFFER_SIZE - txBufferTail;
            txBufferTail = 0;
        }
    
        DMA_Cmd(DMA2_Stream7, ENABLE);
    }
    
    void DMA2_Stream7_IRQHandler(void)
    {
        DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);
        DMA_Cmd(DMA2_Stream7, DISABLE);
    
        if (txBufferHead != txBufferTail)
            uartTxDMA();
    }
    
    void uartInit(uint32_t speed)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
    
        // USART1_TX    PA9
        // USART1_RX    PA10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
        /*GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_USART1);
    		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOA, &GPIO_InitStructure);*/
     
      /* Connect USART pins to AF */
      GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
      GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
    
        // DMA TX Interrupt
        NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    
        USART_InitStructure.USART_BaudRate = speed;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStructure);
    
    
    
        // Receive DMA into a circular buffer
        DMA_DeInit(DMA2_Stream5);
        DMA_InitStructure.DMA_Channel = DMA_Channel_4;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
        DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)rxBuffer;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_BufferSize = UART_BUFFER_SIZE;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    		DMA_Init(DMA2_Stream5, &DMA_InitStructure);
        DMA_Cmd(DMA2_Stream5, ENABLE);
        /* Enable the USART Rx DMA request */
      USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
     
      /* Enable DMA Stream Half Transfer and Transfer Complete interrupt */
     // DMA_ITConfig(DMA2_Stream5, DMA_IT_TC, ENABLE);
     // DMA_ITConfig(DMA2_Stream5, DMA_IT_HT, ENABLE);
     
      /* Enable the DMA RX Stream */
        //USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
       rxDMAPos = DMA_GetCurrDataCounter(DMA2_Stream5);
        
    		
    		
    		
        // Transmit DMA
        DMA_DeInit(DMA2_Stream7);
        DMA_InitStructure.DMA_Channel = DMA_Channel_4;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    		DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    		DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_Init(DMA2_Stream7, &DMA_InitStructure);
       
    	 
    	
    	DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);
    	//DMA_ITConfig(DMA2_Stream7, DMA_IT_HT, ENABLE);
       
    	 DMA2_Stream7->NDTR = 0;
      USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);//DMA_Cmd(DMA2_Stream7, ENABLE);
      USART_Cmd(USART1, ENABLE);
    }
    
    uint16_t uartAvailable(void)
    {
        return (DMA_GetCurrDataCounter(DMA2_Stream5) != rxDMAPos) ? true : false;
    }
    
    bool uartTransmitEmpty(void)
    {
        return (txBufferTail == txBufferHead);
    }
    
    uint8_t uartRead(void)
    {
        uint8_t ch;
    
        ch = rxBuffer[UART_BUFFER_SIZE - rxDMAPos];
        // go back around the buffer
        if (--rxDMAPos == 0)
            rxDMAPos = UART_BUFFER_SIZE;
    
        return ch;
    }
    
    uint8_t uartReadPoll(void)
    {
        while (!uartAvailable()); // wait for some bytes
        return uartRead();
    }
    
    void uartWrite(uint8_t ch)
    {
        txBuffer[txBufferHead] = ch;
        txBufferHead = (txBufferHead + 1) % UART_BUFFER_SIZE;
    
        // if DMA wasn't enabled, fire it up
        if (!(DMA2_Stream7->CR & 1))
            uartTxDMA();
    }
    
    void uartPrint(char *str)
    {
        while (*str)
            uartWrite(*(str++));
    }
    
    /* -------------------------- UART2  ----------------------------- */
    uartReceiveCallbackPtr uart2Callback = NULL;
    #define UART2_BUFFER_SIZE    128
    
    volatile uint8_t tx2Buffer[UART2_BUFFER_SIZE];
    uint32_t tx2BufferTail = 0;
    uint32_t tx2BufferHead = 0;
    bool uart2RxOnly = false;
    
    static void uart2Open(uint32_t speed)
    {
        USART_InitTypeDef USART_InitStructure;
    
        USART_StructInit(&USART_InitStructure);
        USART_InitStructure.USART_BaudRate = speed;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | (uart2RxOnly ? 0 : USART_Mode_Tx);
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_Init(USART2, &USART_InitStructure);
        USART_Cmd(USART2, ENABLE);
    
    
    }
    
    void uart2Init(uint32_t speed, uartReceiveCallbackPtr func, bool rxOnly)
    {
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
    
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    
        uart2RxOnly = rxOnly;
    
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    
        // USART2_TX    PD5
        // USART2_RX    PD6
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        if (!rxOnly)
            GPIO_Init(GPIOD, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
    
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource6,GPIO_AF_USART2);
    
        uart2Open(speed);
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
        if (!rxOnly)
            USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
        USART_Cmd(USART2, ENABLE);
    		uart2Callback = func;
    }
    
    void uart2ChangeBaud(uint32_t speed)
    {
        uart2Open(speed);
    }
    
    void uart2Write(uint8_t ch)
    {
        if (uart2RxOnly)
            return;
    
        tx2Buffer[tx2BufferHead] = ch;
        tx2BufferHead = (tx2BufferHead + 1) % UART2_BUFFER_SIZE;
    
        USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
    }
    
    bool uart2TransmitEmpty(void)
    {
        return tx2BufferTail == tx2BufferHead;
    }
    
    void USART2_IRQHandler(void)
    {
        uint16_t SR = USART2->SR;
    
        if (SR & USART_IT_RXNE) {
            if (uart2Callback)
                uart2Callback(USART_ReceiveData(USART2));
        }
        if (SR & USART_FLAG_TXE) {
            if (tx2BufferTail != tx2BufferHead) {
                USART2->DR = tx2Buffer[tx2BufferTail];
                tx2BufferTail = (tx2BufferTail + 1) % UART2_BUFFER_SIZE;
            } else {
                USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
            }
        }
    }
    
    /* -------------------------- UART3  ----------------------------- */
    uartReceiveCallbackPtr uart3Callback = NULL;
    #define UART3_BUFFER_SIZE    128
    
    volatile uint8_t tx3Buffer[UART3_BUFFER_SIZE];
    uint32_t tx3BufferTail = 0;
    uint32_t tx3BufferHead = 0;
    bool uart3RxOnly = false;
    
    static void uart3Open(uint32_t speed)
    {
        USART_InitTypeDef USART_InitStructure;
    
        USART_StructInit(&USART_InitStructure);
        USART_InitStructure.USART_BaudRate = speed;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | (uart3RxOnly ? 0 : USART_Mode_Tx);
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_Init(USART3, &USART_InitStructure);
        USART_Cmd(USART3, ENABLE);
    }
    
    void uart3Init(uint32_t speed, uartReceiveCallbackPtr func, bool rxOnly)
    {
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
    
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    
        uart3RxOnly = rxOnly;
    
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    
        // USART2_TX    PD8
        // USART2_RX    PD9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        if (!rxOnly)
            GPIO_Init(GPIOD, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
    
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_USART2);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource9,GPIO_AF_USART2);
    
        uart3Open(speed);
        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
        if (!rxOnly)
            USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
        USART_Cmd(USART3, ENABLE);
    		uart3Callback = func;
    }
    
    void uart3ChangeBaud(uint32_t speed)
    {
        uart3Open(speed);
    }
    
    void uart3Write(uint8_t ch)
    {
        if (uart3RxOnly)
            return;
    
        tx3Buffer[tx3BufferHead] = ch;
        tx3BufferHead = (tx3BufferHead + 1) % UART3_BUFFER_SIZE;
    
        USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
    }
    
    bool uart3TransmitEmpty(void)
    {
        return tx3BufferTail == tx3BufferHead;
    }
    
    void USART3_IRQHandler(void)
    {
        uint16_t SR = USART3->SR;
    
        if (SR & USART_IT_RXNE) {
            if (uart3Callback)
                uart3Callback(USART_ReceiveData(USART3));
        }
        if (SR & USART_FLAG_TXE) {
            if (tx3BufferTail != tx3BufferHead) {
                USART3->DR = tx3Buffer[tx3BufferTail];
                tx3BufferTail = (tx3BufferTail + 1) % UART3_BUFFER_SIZE;
            } else {
                USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
            }
        }
    }
    а может ещё где ошибка есть....
    Последний раз редактировалось SergDoc; 20.04.2013 в 00:42.

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

Похожие темы

  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

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

Ваши права

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