stc15单片机 固定翼无人机 飞控程序
硬件
- stcf2k60s2
- 2.4g无线通信模块nrf24l01
- mg90s数字舵机
- 摇杆
- 无刷电机
- 电调
用到的单片机资源
- pwm
- ad转换
程序结构
- 利用ADC转换读取摇杆值
- 将摇杆数值转换为16进制通过2.4G无线通信模块发送置接收端
- 通过接收到的数据控制pwm改变来控制舵机电机
硬件使用
-
舵机
采用50Hz的PWM信号控制
-
电调
采用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