四軸飛行器遙控器相關程序及原理圖分享
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (30.53 KB, 下載次數: 40)
下載附件
2022-10-14 02:36 上傳
51hei.png (45.46 KB, 下載次數: 42)
下載附件
2022-10-14 02:37 上傳
單片機源程序如下:
- // STCunio
- //**********************************遙控器程序Rev1.3正式版*************************
- //聲明:程序作者不會對本程序進行任何升級了,該程序就是該硬件的最終版本
- // 程序:SWUST 電氣自動化13級 LQM
- // 本程序適用于STC四軸的美國手遙控器(左手油門)
- //左手上下為油門,左右為旋轉
- //右手上下為俯仰,左右為橫滾
- // MCU工作頻率28MHZ!!!
- #include <rtx51tny.h>
- #include <STC15F2K60S2.H>
- #include <NRF24L01.H>
- #include <AD.H>
- sbit RLED=P0^5;
- sbit GLED=P0^6;
- sbit LKEY=P4^7;
- sbit RKEY=P3^4;
- volatile int idata ay,ax,by,bx;
- volatile int idata cy,cx,dy,dx;
- volatile float idata battery;
- unsigned char idata TxBuf[20]={0};
- unsigned char idata RxBuf[20]={0};
- void IO_and_Init();
- void AD() _task_ 0 //獲取AD采樣數據
- {
- IO_and_Init(); //初始化I/O口
- os_create_task (1); //啟動進程1
- while(1)
- {
- cy=getADCResult(3); //// 油門 //讀取4個搖桿通道每個通道的8位數據,取值范圍0-255
- Delay(10);
- cx=getADCResult(2); //yaw
- Delay(10);
- dy=getADCResult(1); //俯視
- Delay(10);
- dx=getADCResult(0); //橫滾
- Delay(10);
- battery=(getADCResult(4)*5.05*100)/256; //電池電壓檢測通道 低于3.7V亮紅燈
- Delay(10);
- if(battery<=370)
- {
- RLED=1;GLED=0;
- }
- else
- {
- RLED=0;GLED=1;
- }
- os_wait(K_IVL,3,0);//延時3個節拍
- }
- }
- void NRF24L01() _task_ 1
- {
- while(1)
- {
- TxBuf[0]++;
- TxBuf[1]=128;
- TxBuf[2]=128;
- TxBuf[3]=128;
- if(cy<20) {goto EXIT;} //當油門拉至最低時遙控器解鎖
- if(RKEY==0) {TxBuf[5]=1;} else {TxBuf[5]=0;}
- if(LKEY==0) {TxBuf[6]=1;} else {TxBuf[6]=0;}
- nRF24L01_TxPacket(TxBuf);//發送TxBuf數組的數據
- os_wait(K_IVL,2,0); //給一定延時讓數據發送完成
- }
- EXIT:
- while(1)
- {
- if((dy-by)>=255){TxBuf[1]=255;} //用上電記錄的數據對采樣數據進行修正,保證搖桿中位時數據為128
- else if((dy-by)<=0){TxBuf[1]=0;}
- else{TxBuf[1]=dy-by;}
-
- if((dx-bx)>=255){TxBuf[2]=255;}
- else if((dx-bx)<=0){TxBuf[2]=0;}
- else{TxBuf[2]=dx-bx;}
-
- if((cx-ax)>=255){TxBuf[3]=255;}
- else if((cx-ax)<=0){TxBuf[3]=0;}
- else{TxBuf[3]=cx-ax;}
- //油門:TxBuf[4]
- //Yaw:TxBuf[3]
- //俯仰:TxBuf[1]
- //橫滾:TxBuf[2]
- TxBuf[4]=cy; //油門通道不需處理,直接發送AD檢測的8位數據即可,根據AD采樣原理易知讀取的AD采樣數據不可能為負也不可能大于255
- if(RKEY==0) {TxBuf[5]=1;} else {TxBuf[5]=0;}
- if(LKEY==0) {TxBuf[6]=1;} else {TxBuf[6]=0;}
- TxBuf[0]++;
- nRF24L01_TxPacket(TxBuf);//發射數據
- os_wait(K_IVL,2,0); //給一定延時讓數據發送完成
- }
- }
- void IO_and_Init()
- {
- P1M0=0x00; //P1設為高阻模式
- P1M1=0xFF;
- P0M0=0XFF; //其他I/O口設置為準雙向,弱上拉模式
- P0M1=0X00;
- P2M0=0X00;
- P2M1=0X00;
- P3M0=0X00;
- P3M1=0X00;
- P4M0=0X00;
- P4M1=0X00;
- P5M0=0Xff;
- P5M1=0X00;
- LKEY=1; //拉高按鍵檢測I/O口電平,按鍵為低電平觸發
- RKEY=1;
- init_NRF24L01(); //初始化無線模塊
- adc_init(); //初始化AD檢測模塊
- ax=getADCResult(0)-128; //記錄上電時搖桿的數據作為中位修正,因為搖桿中位要為128即256/2
- Delay(10);
- by=getADCResult(3)-128;
- Delay(10);
- bx=getADCResult(2)-128;
- Delay(10);
- }
復制代碼
51hei.png (6.3 KB, 下載次數: 41)
下載附件
2022-10-14 02:42 上傳
代碼PCB文件51hei附件下載:
STC飛行器.7z
(796.35 KB, 下載次數: 36)
2022-10-14 02:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|