当前位置:   article > 正文

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

stc飞控

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/520772
推荐阅读
相关标签
  

闽ICP备14008679号