|
沉寂了挺久,積攢了一些東東,今天分享給大家!狝NO Tech 匿名四軸
最近真的是被忙壞了,吸取前兩次套件的經(jīng)驗(yàn),做出了這次算是已經(jīng)硬件定型的微型四軸。PCB進(jìn)行優(yōu)化,更“瘦小”,更簡(jiǎn)潔。而且為了對(duì)所選材料進(jìn)行甄別,還特意買了小電子稱和轉(zhuǎn)速儀,這次挑選的電機(jī)為7*16空心杯,但在同等電壓下同7*20空心杯轉(zhuǎn)速相差無(wú)幾(轉(zhuǎn)速儀測(cè)試),但重量減輕好多(7*20:3.3g,我們的7*16:2.3g),電池更換為400mah25C動(dòng)力電池,重量為11.1g,整體重量由之前的44.2g減少到現(xiàn)在的34.2g,所以飛機(jī)的機(jī)動(dòng)性更高,飛起來(lái)更“暴力”。
1307271220de923983d8efa43e.jpg (60.71 KB, 下載次數(shù): 87)
下載附件
2016-10-21 00:19 上傳
1307271220dec913ccedf994b2.jpg (59.4 KB, 下載次數(shù): 77)
下載附件
2016-10-21 00:19 上傳
1307271221a2133b2c6798093e.jpg (115.81 KB, 下載次數(shù): 98)
下載附件
2016-10-21 00:19 上傳
1307271221789d7a71ac7fcd84.jpg (115.76 KB, 下載次數(shù): 106)
下載附件
2016-10-21 00:19 上傳
無(wú)線仍然采用NRF24L01,不同的是在飛機(jī)上和遙控板上都增加了PA芯片,增加無(wú)線功率,電感電容全部采用進(jìn)口村田,而且遙控板采用增益天線,飛機(jī)也舍棄原來(lái)的PCB天線,采用外接超輕的2.4G天線,信號(hào)更好。無(wú)線的穩(wěn)定性和距離都提高很多,完全滿足小四軸需要。(經(jīng)驗(yàn):大家在無(wú)線相關(guān)設(shè)計(jì)時(shí),還是不要考慮成本,選用高精度的材料吧。別不舍得。。)
完善各個(gè)模塊的代碼,特別是上位機(jī),相比以前增加了很多功能,根據(jù)網(wǎng)友的要求,加入了波形保存、讀取等功能。。。
隨著新套件的完成,編寫了一系列針對(duì)新套件的程序,可以直接下載運(yùn)行,廢話少說(shuō),上程序。本工程測(cè)試LED,下載后飛控板上電,可看到飛控中心板四周4個(gè)LED不停閃動(dòng).
0.png (61.09 KB, 下載次數(shù): 119)
下載附件
2016-10-21 00:31 上傳
源程序.zip
(405.39 KB, 下載次數(shù): 70)
2016-10-21 00:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1.1_LED_TEST.zip
此工程為套件基本LED閃動(dòng)演示
2.2_UART_TEST.zip
此工程為套件串口演示
3.3_SPI_NRF_TEST.zip
此工程為套件SPI和NRF24L01相關(guān)功能測(cè)試
4.4_TIMER_TEST.zip
次工程為套件定時(shí)器演示
5.5_IIC_6050_TEST.zip
此工程為套件IIC和6050相關(guān)演示,其中IIC為硬件IIC,下面有IIC庫(kù)提供給大家
6.6_WAVE_3D_TEST.zip
此工程為測(cè)試上位機(jī)通過(guò)無(wú)線接收飛控?cái)?shù)據(jù),并3D顯示姿態(tài),畫傳感器數(shù)據(jù)曲線圖的相關(guān)演示
7.7_HIGH_SPEED_TEST.zip
此工程為套件高速通信測(cè)試,串口工作在500K,1ms向上位機(jī)發(fā)送32字節(jié)傳感器數(shù)據(jù),上位機(jī)分析數(shù)據(jù)并實(shí)時(shí)畫出曲線
8.8_DMP_TEST.zip
此工程是為本套件移植好的DMP工程,使用的是官方庫(kù)
9.綜合測(cè)試
此工程為套件的綜合測(cè)試,包括無(wú)線通信、無(wú)線調(diào)整PID、無(wú)線調(diào)整傳感器零點(diǎn)、數(shù)據(jù)FLASH區(qū)保存、波形顯示、3D姿態(tài)顯示、鍵盤鼠標(biāo)控制、飛控解鎖、飛控鎖定、電機(jī)PWM顯示、電壓監(jiān)控等功能
10. PPM采集
此工程為套件遙控板采集PPM信號(hào)的工程
下面給大家分享我自己寫的硬件IIC驅(qū)動(dòng),使用硬件中斷模式,至今運(yùn)行一直正常。
因?yàn)槌绦蛱?還請(qǐng)大家移步下載,地址在上位機(jī)里有.
因?yàn)楹芏嗳嘶A(chǔ)不同,所以演示工程弄得詳細(xì)了一點(diǎn),高手請(qǐng)略過(guò)。四軸用到的相關(guān)模塊相關(guān)程序可以說(shuō)以上工程里都包含了。
以上工程中,NRF24L01都采用ACK With payload 模式實(shí)現(xiàn)雙向數(shù)據(jù)通信,不用手動(dòng)切換收發(fā)狀態(tài),NRF24L01自動(dòng)完成收發(fā)切換。
下面給大家分享我自己寫的硬件IIC驅(qū)動(dòng),使用硬件中斷模式,至今運(yùn)行一直正常。
下面是相關(guān)資料和原理圖:
115508qazpc653s337czs7.jpg.thumb.jpg (13.76 KB, 下載次數(shù): 89)
下載附件
2016-10-21 00:19 上傳
不思--相關(guān)芯片資料及SWD_gerber文件.zip
(6.61 MB, 下載次數(shù): 40)
2016-10-21 00:17 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
下面是最新的上位機(jī),相比以前發(fā)布的功能完善很多,波形顯示,3D姿態(tài)顯示,遙控?cái)?shù)據(jù)顯示,電機(jī)PWM顯示,電壓監(jiān)控,PID無(wú)線調(diào)整,零偏無(wú)線調(diào)整等等,就不具體講用法了,相關(guān)功能請(qǐng)打開(kāi)上位機(jī)按F12查看幫助文件,如果有問(wèn)題請(qǐng)聯(lián)系我
上位機(jī)界面:
1307271220827c32cea80b6d8b.jpg (93.18 KB, 下載次數(shù): 88)
下載附件
2016-10-21 00:19 上傳
13072712201ce398eb208eb977.jpg (95.1 KB, 下載次數(shù): 75)
下載附件
2016-10-21 00:19 上傳
1307271220f6919b9589660616.jpg (160.45 KB, 下載次數(shù): 113)
下載附件
2016-10-21 00:19 上傳
1307271220fb16309f5f5000be.jpg (150.51 KB, 下載次數(shù): 109)
下載附件
2016-10-21 00:19 上傳
13072712203f77a24b7b8981ef.jpg (153.48 KB, 下載次數(shù): 84)
下載附件
2016-10-21 00:19 上傳
13072712204ccf358d49381313.jpg (76.12 KB, 下載次數(shù): 94)
下載附件
2016-10-21 00:19 上傳
13072712200c3a5379bbf4a1ce.jpg (116.21 KB, 下載次數(shù): 91)
下載附件
2016-10-21 00:19 上傳
下載:
::::::::
ANO_Tech匿名四軸上位機(jī)_v2.3.zip
(1.57 MB, 下載次數(shù): 90)
2016-10-21 00:16 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
新舊對(duì)比:
13072712211d62a7885f9b70a2.jpg (74.93 KB, 下載次數(shù): 73)
下載附件
2016-10-21 00:19 上傳
新飛機(jī):
1307271221597b3509a980bc31.jpg (97.12 KB, 下載次數(shù): 78)
下載附件
2016-10-21 00:19 上傳
13072712210da1e80d2e43c61b.jpg (51.15 KB, 下載次數(shù): 85)
下載附件
2016-10-21 00:19 上傳
遙控板:
130727122150cd56ec0a8d5b35.jpg (83.7 KB, 下載次數(shù): 98)
下載附件
2016-10-21 00:19 上傳
swd調(diào)試器:
130727122127e83f5ecf5e3497.jpg (93.03 KB, 下載次數(shù): 108)
下載附件
2016-10-21 00:19 上傳
PS:我在這里開(kāi)源所有的資料,是希望大家一起來(lái)玩,方便大家,可是有些人。。。拿我開(kāi)源的資料去賣錢,唉。。。
115507cy1nnyzy36gxdd6y.jpg.thumb.jpg (18.84 KB, 下載次數(shù): 96)
下載附件
2016-10-21 00:19 上傳
大家在淘寶搜 四軸 資料,有好幾個(gè),里面的資料都是我以前開(kāi)源的,連介紹都是copy我的。。。。無(wú)語(yǔ)了
不過(guò),咱的創(chuàng)意和想法他們copy不走的!
硬件弄好了,以后就要專心調(diào)試軟件了,目前姿態(tài)已經(jīng)算穩(wěn)定了,就差一個(gè)好用的PID了,不少人也要拿到套件了,大家在這里多多交流軟件和調(diào)試經(jīng)驗(yàn),爭(zhēng)取早日飛穩(wěn)了。
- #include "MPU6050.h"
- #include "ANO_Tech_STM32F10x_I2C.h"
- #include "tim.h"
- u8 mpu6050_buffer[14]; //iic讀取后存放數(shù)據(jù)
- S_INT16_XYZ GYRO_OFFSET,ACC_OFFSET; //零漂
- u8 GYRO_OFFSET_OK = 1;
- u8 ACC_OFFSET_OK = 1;
- S_INT16_XYZ MPU6050_ACC_LAST,MPU6050_GYRO_LAST; //最新一次讀取值
- void Delay_ms_mpu(u16 nms)
- {
- u8 delay_cnt = TIM3_IRQCNT;
- while((delay_cnt+(nms*2)) > TIM3_IRQCNT);
- }
- /**************************實(shí)現(xiàn)函數(shù)********************************************
- //將iic讀取到得數(shù)據(jù)分拆,放入相應(yīng)寄存器
- *******************************************************************************/
- void MPU6050_Dataanl(void)
- {
- MPU6050_ACC_LAST.X=((((int16_t)mpu6050_buffer[0]) << 8) | mpu6050_buffer[1]) - ACC_OFFSET.X;
- MPU6050_ACC_LAST.Y=((((int16_t)mpu6050_buffer[2]) << 8) | mpu6050_buffer[3]) - ACC_OFFSET.Y;
- MPU6050_ACC_LAST.Z=((((int16_t)mpu6050_buffer[4]) << 8) | mpu6050_buffer[5]) - ACC_OFFSET.Z;
- //跳過(guò)溫度ADC
- MPU6050_GYRO_LAST.X=((((int16_t)mpu6050_buffer[8]) << 8) | mpu6050_buffer[9]) - GYRO_OFFSET.X;
- MPU6050_GYRO_LAST.Y=((((int16_t)mpu6050_buffer[10]) << 8) | mpu6050_buffer[11]) - GYRO_OFFSET.Y;
- MPU6050_GYRO_LAST.Z=((((int16_t)mpu6050_buffer[12]) << 8) | mpu6050_buffer[13]) - GYRO_OFFSET.Z;
-
- if(!GYRO_OFFSET_OK)
- {
- static int32_t tempgx=0,tempgy=0,tempgz=0;
- static uint8_t cnt_g=0;
- // LED1_ON;
- if(cnt_g==0)
- {
- GYRO_OFFSET.X=0;
- GYRO_OFFSET.Y=0;
- GYRO_OFFSET.Z=0;
- tempgx = 0;
- tempgy = 0;
- tempgz = 0;
- cnt_g = 1;
- return;
- }
- tempgx+= MPU6050_GYRO_LAST.X;
- tempgy+= MPU6050_GYRO_LAST.Y;
- tempgz+= MPU6050_GYRO_LAST.Z;
- if(cnt_g==200)
- {
- GYRO_OFFSET.X=tempgx/cnt_g;
- GYRO_OFFSET.Y=tempgy/cnt_g;
- GYRO_OFFSET.Z=tempgz/cnt_g;
- cnt_g = 0;
- GYRO_OFFSET_OK = 1;
- // EE_SAVE_GYRO_OFFSET();//保存數(shù)據(jù)
- return;
- }
- cnt_g++;
- }
- if(!ACC_OFFSET_OK)
- {
- static int32_t tempax=0,tempay=0,tempaz=0;
- static uint8_t cnt_a=0;
- // LED1_ON;
- if(cnt_a==0)
- {
- ACC_OFFSET.X = 0;
- ACC_OFFSET.Y = 0;
- ACC_OFFSET.Z = 0;
- tempax = 0;
- tempay = 0;
- tempaz = 0;
- cnt_a = 1;
- return;
- }
- tempax+= MPU6050_ACC_LAST.X;
- tempay+= MPU6050_ACC_LAST.Y;
- //tempaz+= MPU6050_ACC_LAST.Z;
- if(cnt_a==200)
- {
- ACC_OFFSET.X=tempax/cnt_a;
- ACC_OFFSET.Y=tempay/cnt_a;
- ACC_OFFSET.Z=tempaz/cnt_a;
- cnt_a = 0;
- ACC_OFFSET_OK = 1;
- // EE_SAVE_ACC_OFFSET();//保存數(shù)據(jù)
- return;
- }
- cnt_a++;
- }
- }
- /**************************實(shí)現(xiàn)函數(shù)********************************************
- //將iic讀取到得數(shù)據(jù)分拆,放入相應(yīng)寄存器,更新MPU6050_Last
- *******************************************************************************/
- void MPU6050_Read(void)
- {
- ANO_Tech_I2C1_Read_Int(devAddr,MPU6050_RA_ACCEL_XOUT_H,14,mpu6050_buffer);
- }
- /**************************實(shí)現(xiàn)函數(shù)********************************************
- *函數(shù)原型: u8 IICwriteBit(u8 dev, u8 reg, u8 bitNum, u8 data)
- *功 能: 讀 修改 寫 指定設(shè)備 指定寄存器一個(gè)字節(jié) 中的1個(gè)位
- 輸入 dev 目標(biāo)設(shè)備地址
- reg 寄存器地址
- bitNum 要修改目標(biāo)字節(jié)的bitNum位
- data 為0 時(shí),目標(biāo)位將被清0 否則將被置位
- 返回 成功 為1
- 失敗為0
- *******************************************************************************/
- void IICwriteBit(u8 dev, u8 reg, u8 bitNum, u8 data){
- u8 b;
- ANO_Tech_I2C1_Read_Buf(dev, reg, 1, &b);
- b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));
- ANO_Tech_I2C1_Write_1Byte(dev, reg, b);
- }
- /**************************實(shí)現(xiàn)函數(shù)********************************************
- *函數(shù)原型: u8 IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data)
- *功 能: 讀 修改 寫 指定設(shè)備 指定寄存器一個(gè)字節(jié) 中的多個(gè)位
- 輸入 dev 目標(biāo)設(shè)備地址
- reg 寄存器地址
- bitStart 目標(biāo)字節(jié)的起始位
- length 位長(zhǎng)度
- data 存放改變目標(biāo)字節(jié)位的值
- 返回 成功 為1
- 失敗為0
- *******************************************************************************/
- void IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data)
- {
-
- u8 b,mask;
- ANO_Tech_I2C1_Read_Buf(dev, reg, 1, &b);
- mask = (0xFF << (bitStart + 1)) | 0xFF >> ((8 - bitStart) + length - 1);
- data <<= (8 - length);
- data >>= (7 - bitStart);
- b &= mask;
- b |= data;
- ANO_Tech_I2C1_Write_1Byte(dev, reg, b);
- }
- /**************************實(shí)現(xiàn)函數(shù)********************************************
- *函數(shù)原型: void MPU6050_setClockSource(uint8_t source)
- *功 能: 設(shè)置 MPU6050 的時(shí)鐘源
- * CLK_SEL | Clock Source
- * --------+--------------------------------------
- * 0 | Internal oscillator
- * 1 | PLL with X Gyro reference
- * 2 | PLL with Y Gyro reference
- * 3 | PLL with Z Gyro reference
- * 4 | PLL with external 32.768kHz reference
- * 5 | PLL with external 19.2MHz reference
- * 6 | Reserved
- * 7 | Stops the clock and keeps the timing generator in reset
- *******************************************************************************/
- void MPU6050_setClockSource(uint8_t source){
- IICwriteBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, source);
-
- }
- /** Set full-scale gyroscope range.
- * @param range New full-scale gyroscope range value
- * @see getFullScaleRange()
- * @see MPU6050_GYRO_FS_250
- * @see MPU6050_RA_GYRO_CONFIG
- * @see MPU6050_GCONFIG_FS_SEL_BIT
- * @see MPU6050_GCONFIG_FS_SEL_LENGTH
- */
- void MPU6050_setFullScaleGyroRange(uint8_t range) {
- IICwriteBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range);
- }
- /**************************實(shí)現(xiàn)函數(shù)********************************************
- *函數(shù)原型: void MPU6050_setFullScaleAccelRange(uint8_t range)
- *功 能: 設(shè)置 MPU6050 加速度計(jì)的最大量程
- *******************************************************************************/
- void MPU6050_setFullScaleAccelRange(uint8_t range) {
- IICwriteBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range);
- }
- /**************************實(shí)現(xiàn)函數(shù)********************************************
- *函數(shù)原型: void MPU6050_setSleepEnabled(uint8_t enabled)
- *功 能: 設(shè)置 MPU6050 是否進(jìn)入睡眠模式
- enabled =1 睡覺(jué)
- enabled =0 工作
- *******************************************************************************/
- void MPU6050_setSleepEnabled(uint8_t enabled) {
- IICwriteBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled);
- }
- /**************************實(shí)現(xiàn)函數(shù)********************************************
- *函數(shù)原型: void MPU6050_setI2CMasterModeEnabled(uint8_t enabled)
- *功 能: 設(shè)置 MPU6050 是否為AUX I2C線的主機(jī)
- *******************************************************************************/
- void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) {
- IICwriteBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled);
- }
- /**************************實(shí)現(xiàn)函數(shù)********************************************
- *函數(shù)原型: void MPU6050_setI2CBypassEnabled(uint8_t enabled)
- *功 能: 設(shè)置 MPU6050 是否為AUX I2C線的主機(jī)
- *******************************************************************************/
- void MPU6050_setI2CBypassEnabled(uint8_t enabled) {
- IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled);
- }
- void MPU6050_setDLPF(uint8_t mode)
- {
- IICwriteBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, mode);
- }
- /**************************實(shí)現(xiàn)函數(shù)********************************************
- *函數(shù)原型: void MPU6050_initialize(void)
- *功 能: 初始化 MPU6050 以進(jìn)入可用狀態(tài)。
- *******************************************************************************/
- void MPU6050_Init(void)
- {
- ANO_Tech_I2C1_Write_1Byte(0xd2,0x19,0x07);//1khz
- ANO_Tech_I2C1_Write_1Byte(0xd2,0x1a,0x03);//44hz濾波
- ANO_Tech_I2C1_Write_1Byte(0xd2,0x1b,0x00);//gyro 250du/s
- ANO_Tech_I2C1_Write_1Byte(0xd2,0x1c,0x08);//acc +-4g
- ANO_Tech_I2C1_Write_1Byte(0xd2,0x24,13);//400khz
- ANO_Tech_I2C1_Write_1Byte(0xd2,0x6a,0x00);//mst_en=0
- ANO_Tech_I2C1_Write_1Byte(0xd2,0x6b,0x00);//sleep=0
- // MPU6050_setSleepEnabled(0); //進(jìn)入工作狀態(tài)
- // Delay_ms_mpu(200);
- // MPU6050_setClockSource(MPU6050_CLOCK_PLL_XGYRO); //設(shè)置時(shí)鐘 0x6b 0x01
- // Delay_ms_mpu(50);
- // MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_500);//陀螺儀最大量程 +-500度每秒
- // Delay_ms_mpu(50);
- // MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_4); //加速度度最大量程 +-4G
- // Delay_ms_mpu(50);
- // MPU6050_setDLPF(MPU6050_DLPF_BW_42);
- // Delay_ms_mpu(50);
- // MPU6050_setI2CMasterModeEnabled(0); //不讓MPU6050 控制AUXI2C
- // Delay_ms_mpu(50);
- // MPU6050_setI2CBypassEnabled(1); //主控制器的I2C與 MPU6050的AUXI2C 直通?刂破骺梢灾苯釉L問(wèn)HMC5883L
- // Delay_ms_mpu(50);
- }
復(fù)制代碼
|
|