STC15单片机 固定翼无人机/航模 飞控程序

stc15单片机 固定翼无人机 飞控程序

硬件

  1. stcf2k60s2
  2. 2.4g无线通信模块nrf24l01
  3. mg90s数字舵机
  4. 摇杆
  5. 无刷电机
  6. 电调

用到的单片机资源

  1. pwm
  2. ad转换

程序结构

  1. 利用ADC转换读取摇杆值
  2. 将摇杆数值转换为16进制通过2.4G无线通信模块发送置接收端
  3. 通过接收到的数据控制pwm改变来控制舵机电机

硬件使用

  1. 舵机
    采用50Hz的PWM信号控制
    在这里插入图片描述

  2. 电调
    采用71.4hz的PWM信号控制,高电平宽度为1.0到2.0ms,电调上电需要自检,自检的方法就是给高电平宽度为1ms持续3s左右,当电机发出急促的哔哔哔声音就自己成功,可以开始控制

程序

遥控端
左边摇杆控制油门
右边摇杆控制转向及高度

#include "STC15F2K60S2.H"
#include "stdio.h"
#include "intrins.h"   
#include "nrf_24l01.h"

#define uint unsigned int
#define uchar unsigned char
#define ADC_POWER 0xE0 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟

uchar rx_buf[TX_PLOAD_WIDTH];
uchar tx_buf[TX_PLOAD_WIDTH];
unsigned char sta;
uchar dat0;
uchar dat1;
uchar dat2;
uint num;
uint num0;
uint num1;
uint num2;
uint k;
sbit S1=P2^3;
sbit S2=P2^4;

void Delay100ms(void);
void delayms(int ms);
void uartInit(void);
void UARTSend(char ucData);
void UART_PutString(unsigned char *s);
uchar GetADCResult(unsigned char ch);
void InitADC();


void main(void)
{
   
  unsigned int lock_key=0;
	
	P0M0=0X00;P0M1=0X00;
	P1M0=0X00;P1M1=0X00;
	P2M0=0X00;P2M1=0X00;
	P3M0=0X00;P3M1=0X00;
	P4M0=0X00;P4M1=0X00;
	
  uartInit();	 
	Delay100ms();
  init_nrf24l01_io();
	InitADC();
  UART_PutString("READY!\r\n");
  ifnnrf_rx_mode();//初始化  接收模式

  while(1)
  {
     
		  if(S1==0)
		   {
   
				 delayms(1);
				 if(S1!=0)
				 {
   
					 k=1;
				 }
			 }
			 	 if(S2==0)
		   {
   
				 delayms(1);
				 if(S2!=0)
				 {
   
					 k=2;
				 }
			 }
      num=GetADCResult(0);//num数值0-255
      num0=num/51;
      num=GetADCResult(2);
		  if(num<190)
			{
   
				num1=num/85;
			}
      if(190<num&&num<210)num1=3;
			if(num>210)
			{
   
				num1=(num-210)/15+3;
			}
      num=GetADCResult(3);
      if(num<160)
			{
   
				num2=num/80;
			}
      if(160<num&&num<185)num2=3;
			if(num>185)
			{
   
				num2=(num-185)/23+3;
			}		
			IRQ=1;
			SPI_RW_Reg(WRITE_REG+STATUS,0xff);
			tx_buf[0]=num0;//油门数据
			//if(k==1)
			//{
   
				tx_buf[1]=num1;//转向数据
			//}
		  //if(k==2)
			//{
   
				tx_buf[2]=num2;//上下数据
			//}
			ifnnrf_tx_mode();
			while(IRQ);  			
			sta=SPI_Read(STATUS);              
			SPI_RW_Reg(WRITE_REG+STATUS,0xff); 
      if(sta&STA_MARK_TX)                
			 {
   
				 delayms(1);
	     } 
		  else
		   {
   
		 		 ifnnrf_CLERN_ALL();
	     }
	    lock_key=1;
   }	
		
   if(lock_key) 
		{
   
			lock_key=0;
			ifnnrf_rx_mode();
			IRQ=1;
			while(IRQ==0);
			_delay_us(400);
    }
 }

/*************************串口初始化******************************************/
void uartInit(void)
{
    
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0xE0;		//设定定时初值
	TH1 = 0xFE;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1  
	EA = 1;
	ES=1; 
}

/*******************************数据发送**************************************/
void UARTSend(char ucData)
{
   
	SBUF=ucData;
	while(TI==0);
	TI=0;
}
/******************************字符串发送*************************************/
void UART_PutString(unsi
  • 2
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethan_LiuQuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值