久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10584|回復: 6
收起左側

ANO Tech最新四軸全套程序、上位機、原理圖分享!!

[復制鏈接]
ID:140725 發表于 2016-10-21 00:31 | 顯示全部樓層 |閱讀模式
沉寂了挺久,積攢了一些東東,今天分享給大家。————ANO Tech  匿名四軸

最近真的是被忙壞了,吸取前兩次套件的經驗,做出了這次算是已經硬件定型的微型四軸。PCB進行優化,更“瘦小”,更簡潔。而且為了對所選材料進行甄別,還特意買了小電子稱和轉速儀,這次挑選的電機為7*16空心杯,但在同等電壓下同7*20空心杯轉速相差無幾(轉速儀測試),但重量減輕好多(7*20:3.3g,我們的7*16:2.3g),電池更換為400mah25C動力電池,重量為11.1g,整體重量由之前的44.2g減少到現在的34.2g,所以飛機的機動性更高,飛起來更“暴力”。

1307271220de923983d8efa43e.jpg 1307271220dec913ccedf994b2.jpg 1307271221a2133b2c6798093e.jpg 1307271221789d7a71ac7fcd84.jpg



無線仍然采用NRF24L01,不同的是在飛機上和遙控板上都增加了PA芯片,增加無線功率,電感電容全部采用進口村田,而且遙控板采用增益天線,飛機也舍棄原來的PCB天線,采用外接超輕的2.4G天線,信號更好。無線的穩定性和距離都提高很多,完全滿足小四軸需要。(經驗:大家在無線相關設計時,還是不要考慮成本,選用高精度的材料吧。別不舍得。。)

完善各個模塊的代碼,特別是上位機,相比以前增加了很多功能,根據網友的要求,加入了波形保存、讀取等功能。。。
隨著新套件的完成,編寫了一系列針對新套件的程序,可以直接下載運行,廢話少說,上程序。本工程測試LED,下載后飛控板上電,可看到飛控中心板四周4個LED不停閃動.
0.png
源程序.zip (405.39 KB, 下載次數: 70)
1.1_LED_TEST.zip
此工程為套件基本LED閃動演示
2.2_UART_TEST.zip
此工程為套件串口演示
3.3_SPI_NRF_TEST.zip
此工程為套件SPI和NRF24L01相關功能測試
4.4_TIMER_TEST.zip
次工程為套件定時器演示
5.5_IIC_6050_TEST.zip
此工程為套件IIC和6050相關演示,其中IIC為硬件IIC,下面有IIC庫提供給大家
6.6_WAVE_3D_TEST.zip
此工程為測試上位機通過無線接收飛控數據,并3D顯示姿態,畫傳感器數據曲線圖的相關演示
7.7_HIGH_SPEED_TEST.zip
此工程為套件高速通信測試,串口工作在500K,1ms向上位機發送32字節傳感器數據,上位機分析數據并實時畫出曲線
8.8_DMP_TEST.zip
此工程是為本套件移植好的DMP工程,使用的是官方庫
9.綜合測試
此工程為套件的綜合測試,包括無線通信、無線調整PID、無線調整傳感器零點、數據FLASH區保存、波形顯示、3D姿態顯示、鍵盤鼠標控制、飛控解鎖、飛控鎖定、電機PWM顯示、電壓監控等功能
10. PPM采集
此工程為套件遙控板采集PPM信號的工程

下面給大家分享我自己寫的硬件IIC驅動,使用硬件中斷模式,至今運行一直正常。


因為程序太多,還請大家移步下載,地址在上位機里有.

因為很多人基礎不同,所以演示工程弄得詳細了一點,高手請略過。四軸用到的相關模塊相關程序可以說以上工程里都包含了。

以上工程中,NRF24L01都采用ACK With payload 模式實現雙向數據通信,不用手動切換收發狀態,NRF24L01自動完成收發切換。

下面給大家分享我自己寫的硬件IIC驅動,使用硬件中斷模式,至今運行一直正常。

下面是相關資料和原理圖:


115508qazpc653s337czs7.jpg.thumb.jpg
不思--相關芯片資料及SWD_gerber文件.zip (6.61 MB, 下載次數: 40)


下面是最新的上位機,相比以前發布的功能完善很多,波形顯示,3D姿態顯示,遙控數據顯示,電機PWM顯示,電壓監控,PID無線調整,零偏無線調整等等,就不具體講用法了,相關功能請打開上位機按F12查看幫助文件,如果有問題請聯系我
上位機界面:


1307271220827c32cea80b6d8b.jpg 13072712201ce398eb208eb977.jpg 1307271220f6919b9589660616.jpg 1307271220fb16309f5f5000be.jpg 13072712203f77a24b7b8981ef.jpg 13072712204ccf358d49381313.jpg 13072712200c3a5379bbf4a1ce.jpg


下載:
:::::::: ANO_Tech匿名四軸上位機_v2.3.zip (1.57 MB, 下載次數: 90)

新舊對比:
13072712211d62a7885f9b70a2.jpg

新飛機:
1307271221597b3509a980bc31.jpg

13072712210da1e80d2e43c61b.jpg

遙控板:

130727122150cd56ec0a8d5b35.jpg

swd調試器:
130727122127e83f5ecf5e3497.jpg


PS:我在這里開源所有的資料,是希望大家一起來玩,方便大家,可是有些人。。。拿我開源的資料去賣錢,唉。。。
115507cy1nnyzy36gxdd6y.jpg.thumb.jpg

大家在淘寶搜 四軸 資料,有好幾個,里面的資料都是我以前開源的,連介紹都是copy我的。。。。無語了

不過,咱的創意和想法他們copy不走的!

硬件弄好了,以后就要專心調試軟件了,目前姿態已經算穩定了,就差一個好用的PID了,不少人也要拿到套件了,大家在這里多多交流軟件和調試經驗,爭取早日飛穩了。



  1. #include "MPU6050.h"
  2. #include "ANO_Tech_STM32F10x_I2C.h"
  3. #include "tim.h"

  4. u8                                                mpu6050_buffer[14];                                        //iic讀取后存放數據
  5. S_INT16_XYZ                GYRO_OFFSET,ACC_OFFSET;                        //零漂
  6. u8                                                GYRO_OFFSET_OK = 1;
  7. u8                                                ACC_OFFSET_OK = 1;
  8. S_INT16_XYZ                MPU6050_ACC_LAST,MPU6050_GYRO_LAST;                //最新一次讀取值

  9. void Delay_ms_mpu(u16 nms)
  10. {       
  11.         u8 delay_cnt = TIM3_IRQCNT;
  12.         while((delay_cnt+(nms*2)) > TIM3_IRQCNT);
  13. }
  14. /**************************實現函數********************************************
  15. //將iic讀取到得數據分拆,放入相應寄存器
  16. *******************************************************************************/
  17. void MPU6050_Dataanl(void)
  18. {
  19.         MPU6050_ACC_LAST.X=((((int16_t)mpu6050_buffer[0]) << 8) | mpu6050_buffer[1]) - ACC_OFFSET.X;
  20.         MPU6050_ACC_LAST.Y=((((int16_t)mpu6050_buffer[2]) << 8) | mpu6050_buffer[3]) - ACC_OFFSET.Y;
  21.         MPU6050_ACC_LAST.Z=((((int16_t)mpu6050_buffer[4]) << 8) | mpu6050_buffer[5]) - ACC_OFFSET.Z;
  22.         //跳過溫度ADC
  23.         MPU6050_GYRO_LAST.X=((((int16_t)mpu6050_buffer[8]) << 8) | mpu6050_buffer[9]) - GYRO_OFFSET.X;
  24.         MPU6050_GYRO_LAST.Y=((((int16_t)mpu6050_buffer[10]) << 8) | mpu6050_buffer[11]) - GYRO_OFFSET.Y;
  25.         MPU6050_GYRO_LAST.Z=((((int16_t)mpu6050_buffer[12]) << 8) | mpu6050_buffer[13]) - GYRO_OFFSET.Z;
  26.        
  27.         if(!GYRO_OFFSET_OK)
  28.         {
  29.                 static int32_t        tempgx=0,tempgy=0,tempgz=0;
  30.                 static uint8_t cnt_g=0;
  31. //                 LED1_ON;
  32.                 if(cnt_g==0)
  33.                 {
  34.                         GYRO_OFFSET.X=0;
  35.                         GYRO_OFFSET.Y=0;
  36.                         GYRO_OFFSET.Z=0;
  37.                         tempgx = 0;
  38.                         tempgy = 0;
  39.                         tempgz = 0;
  40.                         cnt_g = 1;
  41.                         return;
  42.                 }
  43.                 tempgx+= MPU6050_GYRO_LAST.X;
  44.                 tempgy+= MPU6050_GYRO_LAST.Y;
  45.                 tempgz+= MPU6050_GYRO_LAST.Z;
  46.                 if(cnt_g==200)
  47.                 {
  48.                         GYRO_OFFSET.X=tempgx/cnt_g;
  49.                         GYRO_OFFSET.Y=tempgy/cnt_g;
  50.                         GYRO_OFFSET.Z=tempgz/cnt_g;
  51.                         cnt_g = 0;
  52.                         GYRO_OFFSET_OK = 1;
  53. //                        EE_SAVE_GYRO_OFFSET();//保存數據
  54.                         return;
  55.                 }
  56.                 cnt_g++;
  57.         }
  58.         if(!ACC_OFFSET_OK)
  59.         {
  60.                 static int32_t        tempax=0,tempay=0,tempaz=0;
  61.                 static uint8_t cnt_a=0;
  62. //                 LED1_ON;
  63.                 if(cnt_a==0)
  64.                 {
  65.                         ACC_OFFSET.X = 0;
  66.                         ACC_OFFSET.Y = 0;
  67.                         ACC_OFFSET.Z = 0;
  68.                         tempax = 0;
  69.                         tempay = 0;
  70.                         tempaz = 0;
  71.                         cnt_a = 1;
  72.                         return;
  73.                 }
  74.                 tempax+= MPU6050_ACC_LAST.X;
  75.                 tempay+= MPU6050_ACC_LAST.Y;
  76.                 //tempaz+= MPU6050_ACC_LAST.Z;
  77.                 if(cnt_a==200)
  78.                 {
  79.                         ACC_OFFSET.X=tempax/cnt_a;
  80.                         ACC_OFFSET.Y=tempay/cnt_a;
  81.                         ACC_OFFSET.Z=tempaz/cnt_a;
  82.                         cnt_a = 0;
  83.                         ACC_OFFSET_OK = 1;
  84. //                        EE_SAVE_ACC_OFFSET();//保存數據
  85.                         return;
  86.                 }
  87.                 cnt_a++;               
  88.         }
  89. }
  90. /**************************實現函數********************************************
  91. //將iic讀取到得數據分拆,放入相應寄存器,更新MPU6050_Last
  92. *******************************************************************************/
  93. void MPU6050_Read(void)
  94. {
  95.         ANO_Tech_I2C1_Read_Int(devAddr,MPU6050_RA_ACCEL_XOUT_H,14,mpu6050_buffer);
  96. }
  97. /**************************實現函數********************************************
  98. *函數原型:                u8 IICwriteBit(u8 dev, u8 reg, u8 bitNum, u8 data)
  99. *功  能:            讀 修改 寫 指定設備 指定寄存器一個字節 中的1個位
  100. 輸入        dev  目標設備地址
  101. reg           寄存器地址
  102. bitNum  要修改目標字節的bitNum位
  103. data  為0 時,目標位將被清0 否則將被置位
  104. 返回   成功 為1
  105. 失敗為0
  106. *******************************************************************************/
  107. void IICwriteBit(u8 dev, u8 reg, u8 bitNum, u8 data){
  108.         u8 b;
  109.         ANO_Tech_I2C1_Read_Buf(dev, reg, 1, &b);
  110.         b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum));
  111.         ANO_Tech_I2C1_Write_1Byte(dev, reg, b);
  112. }
  113. /**************************實現函數********************************************
  114. *函數原型:                u8 IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data)
  115. *功  能:            讀 修改 寫 指定設備 指定寄存器一個字節 中的多個位
  116. 輸入        dev  目標設備地址
  117. reg           寄存器地址
  118. bitStart  目標字節的起始位
  119. length   位長度
  120. data    存放改變目標字節位的值
  121. 返回   成功 為1
  122. 失敗為0
  123. *******************************************************************************/
  124. void IICwriteBits(u8 dev,u8 reg,u8 bitStart,u8 length,u8 data)
  125. {
  126.        
  127.         u8 b,mask;
  128.         ANO_Tech_I2C1_Read_Buf(dev, reg, 1, &b);
  129.         mask = (0xFF << (bitStart + 1)) | 0xFF >> ((8 - bitStart) + length - 1);
  130.         data <<= (8 - length);
  131.         data >>= (7 - bitStart);
  132.         b &= mask;
  133.         b |= data;
  134.         ANO_Tech_I2C1_Write_1Byte(dev, reg, b);
  135. }
  136. /**************************實現函數********************************************
  137. *函數原型:                void MPU6050_setClockSource(uint8_t source)
  138. *功  能:            設置  MPU6050 的時鐘源
  139. * CLK_SEL | Clock Source
  140. * --------+--------------------------------------
  141. * 0       | Internal oscillator
  142. * 1       | PLL with X Gyro reference
  143. * 2       | PLL with Y Gyro reference
  144. * 3       | PLL with Z Gyro reference
  145. * 4       | PLL with external 32.768kHz reference
  146. * 5       | PLL with external 19.2MHz reference
  147. * 6       | Reserved
  148. * 7       | Stops the clock and keeps the timing generator in reset
  149. *******************************************************************************/
  150. void MPU6050_setClockSource(uint8_t source){
  151.         IICwriteBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, source);
  152.        
  153. }
  154. /** Set full-scale gyroscope range.
  155. * @param range New full-scale gyroscope range value
  156. * @see getFullScaleRange()
  157. * @see MPU6050_GYRO_FS_250
  158. * @see MPU6050_RA_GYRO_CONFIG
  159. * @see MPU6050_GCONFIG_FS_SEL_BIT
  160. * @see MPU6050_GCONFIG_FS_SEL_LENGTH
  161. */
  162. void MPU6050_setFullScaleGyroRange(uint8_t range) {
  163.         IICwriteBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range);
  164. }

  165. /**************************實現函數********************************************
  166. *函數原型:                void MPU6050_setFullScaleAccelRange(uint8_t range)
  167. *功  能:            設置  MPU6050 加速度計的最大量程
  168. *******************************************************************************/
  169. void MPU6050_setFullScaleAccelRange(uint8_t range) {
  170.         IICwriteBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range);
  171. }
  172. /**************************實現函數********************************************
  173. *函數原型:                void MPU6050_setSleepEnabled(uint8_t enabled)
  174. *功  能:            設置  MPU6050 是否進入睡眠模式
  175. enabled =1   睡覺
  176. enabled =0   工作
  177. *******************************************************************************/
  178. void MPU6050_setSleepEnabled(uint8_t enabled) {
  179.         IICwriteBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled);
  180. }

  181. /**************************實現函數********************************************
  182. *函數原型:                void MPU6050_setI2CMasterModeEnabled(uint8_t enabled)
  183. *功  能:            設置 MPU6050 是否為AUX I2C線的主機
  184. *******************************************************************************/
  185. void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) {
  186.         IICwriteBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled);
  187. }

  188. /**************************實現函數********************************************
  189. *函數原型:                void MPU6050_setI2CBypassEnabled(uint8_t enabled)
  190. *功  能:            設置 MPU6050 是否為AUX I2C線的主機
  191. *******************************************************************************/
  192. void MPU6050_setI2CBypassEnabled(uint8_t enabled) {
  193.         IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled);
  194. }

  195. void MPU6050_setDLPF(uint8_t mode)
  196. {
  197.         IICwriteBits(devAddr, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, mode);
  198. }
  199. /**************************實現函數********************************************
  200. *函數原型:                void MPU6050_initialize(void)
  201. *功  能:            初始化         MPU6050 以進入可用狀態。
  202. *******************************************************************************/
  203. void MPU6050_Init(void)
  204. {
  205.                 ANO_Tech_I2C1_Write_1Byte(0xd2,0x19,0x07);//1khz
  206.                 ANO_Tech_I2C1_Write_1Byte(0xd2,0x1a,0x03);//44hz濾波
  207.                 ANO_Tech_I2C1_Write_1Byte(0xd2,0x1b,0x00);//gyro 250du/s
  208.                 ANO_Tech_I2C1_Write_1Byte(0xd2,0x1c,0x08);//acc +-4g
  209.                 ANO_Tech_I2C1_Write_1Byte(0xd2,0x24,13);//400khz
  210.                 ANO_Tech_I2C1_Write_1Byte(0xd2,0x6a,0x00);//mst_en=0
  211.                 ANO_Tech_I2C1_Write_1Byte(0xd2,0x6b,0x00);//sleep=0
  212. //         MPU6050_setSleepEnabled(0); //進入工作狀態
  213. //         Delay_ms_mpu(200);
  214. //         MPU6050_setClockSource(MPU6050_CLOCK_PLL_XGYRO); //設置時鐘  0x6b   0x01
  215. //         Delay_ms_mpu(50);
  216. //         MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_500);//陀螺儀最大量程 +-500度每秒
  217. //         Delay_ms_mpu(50);
  218. //         MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_4);        //加速度度最大量程 +-4G
  219. //         Delay_ms_mpu(50);
  220. //         MPU6050_setDLPF(MPU6050_DLPF_BW_42);
  221. //         Delay_ms_mpu(50);
  222. //         MPU6050_setI2CMasterModeEnabled(0);         //不讓MPU6050 控制AUXI2C
  223. //         Delay_ms_mpu(50);
  224. //         MPU6050_setI2CBypassEnabled(1);         //主控制器的I2C與        MPU6050的AUXI2C        直通。控制器可以直接訪問HMC5883L
  225. //         Delay_ms_mpu(50);

  226. }
復制代碼



回復

使用道具 舉報

ID:188187 發表于 2017-6-15 10:52 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:297069 發表于 2018-8-18 11:08 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:393919 發表于 2018-9-5 11:22 | 顯示全部樓層
很好,謝謝分享
111
回復

使用道具 舉報

ID:285561 發表于 2018-9-25 12:56 | 顯示全部樓層
程序只有LED的,上位機里沒看到地址
回復

使用道具 舉報

ID:373684 發表于 2018-9-30 09:57 | 顯示全部樓層
那套東西是上網淘的嗎?花了多少錢????
回復

使用道具 舉報

ID:417457 發表于 2018-11-25 13:38 | 顯示全部樓層
cr8526 發表于 2018-9-30 09:57
那套東西是上網淘的嗎?花了多少錢????

同問
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色一级片 | 亚洲精品欧美一区二区三区 | 国产成人精品一区二区三区网站观看 | 亚洲视频三区 | 欧美精品福利视频 | 曰韩一二三区 | 三级在线免费 | 久久久久久久国产精品影院 | 精品亚洲永久免费精品 | 欧美一区在线视频 | 久久av一区二区三区 | av高清毛片 | 密乳av| 四虎成人免费视频 | 欧美日韩电影免费观看 | 97色伦网 | 亚洲视频一区二区三区 | 亚洲日本一区二区三区四区 | 精品视频在线观看 | 做a的各种视频 | 天堂在线1 | 自拍偷拍中文字幕 | 国户精品久久久久久久久久久不卡 | 亚洲一区二区三区久久久 | 1级毛片 | 精品无码三级在线观看视频 | 中文字幕在线精品 | 国产精品精品3d动漫 | 亚洲h在线观看 | 久久精品国产99国产精品 | 日本精品一区二区三区在线观看视频 | 9色视频在线 | 国产精品毛片久久久久久 | 日韩免费一区二区 | 真人女人一级毛片免费播放 | 久久美女网 | 亚洲一二三区在线观看 | 久久性av| 久久久久国产一区二区三区不卡 | 国产一区二区视频免费在线观看 | 日韩在线一区二区 |