【51单片机】MPU6050陀螺仪控制舵机设计

文章目录

  • 一、主要功能
  • 二、硬件资源
    • 1.硬件准备
    • 2.硬件连接
  • 三、软件设计
    • 1.软件结构
    • 2.主要代码
  • 四、实验现象
  • 联系作者


一、主要功能

系统运行后,LCD1602显示MPU6050检测的欧拉角数值,P表示俯仰角,R表示横滚角,Y表示航向角,T表示温度值。调节MPU6050横滚角可控制舵机旋转0-180度。


二、硬件资源

1.硬件准备

项目所需要的硬件资源如下:
1、51单片机开发板1个
2、SG90舵机模块1个
3、LCD1602液晶模块1个
4、USB线1条(用于供电和程序下载)
5、杜邦线若干
6、MPU6050模块1个

2.硬件连接

	  MPU6050模块-->单片机IO
	  VCC-->5V
	  GND-->GND
	  SCL-->P21
	  SDA-->P20

	  SG90舵机模块-->单片机IO
	  VCC-->5V
	  GND-->GND
	  数据-->P22

	  LCD1602液晶-->单片机IO
	  RS->P26
	  RW->P25
	  E->P27
	  DB0-DB7-->P00-P07

三、软件设计

1.软件结构

【51单片机】MPU6050陀螺仪控制舵机设计_第1张图片

2.主要代码

#include "app_demo.h"
#include "time.h"
#include "lcd1602.h"
#include "stdio.h"
#include "uart.h"
#include "mpu6050.h"
#include "mahony.h"
#include "pwm.h"


//控制管脚定义
sbit LED1=P2^3;

//定义全局结构体变量
_sys_str sys_str;


//舵机角度控制
//angle:0-180
void servo_set_angle(float angle)
{
	pwm_set_duty_cycle(angle / 180 * 20 + 5);
}

xdata short gtemp=0;//温度
//陀螺仪数据处理显示
void mpu_data_pros_show(void)
{
	xdata u8 buf[8];

	//俯仰角
	if(Pitch<0)
	{
		Pitch=-Pitch;
		lcd1602_show_num(2,0,'-',0);
	}
	else
		lcd1602_show_num(2,0,' ',0);	
	lcd1602_show_nums(3,0,Pitch,3,0);

	if(Roll<0)
	{
		Roll=-Roll;
		lcd1602_show_num(12,0,'-',0);
	}
	else
		lcd1602_show_num(12,0,' ',0);
	lcd1602_show_nums(13,0,Roll,3,0);	
	
	if(Yaw<0)
	{
		Yaw=-Yaw;
		lcd1602_show_num(2,1,'-',0);
	}
	else
		lcd1602_show_num(2,1,' ',0);	
	lcd1602_show_nums(3,1,Yaw,3,0);
	lcd1602_show_nums(13,1,gtemp/100,2,0);		
}

//应用控制系统
void app_sys_control(void)
{
	xdata short aacx,aacy,aacz;		//加速度传感器原始数据
	xdata short gyrox,gyroy,gyroz;	//陀螺仪原始数据
	
	u8 i=0;
	u8 duty_value=0;

	lcd1602_init();//LCD1602初始化	
	UART_Init();
	MPU6050_Init();
	MPU6050_Mahony_Init(85);
	pwm_init(0XFF,0XA3,200,duty_value);//定时时间为0.1ms,PWM周期是200*0.1ms=20ms,初始占空比为0ms
	
	lcd1602_show_string(0,0,"P:-180    R:-180");
	lcd1602_show_string(0,1,"Y:-180    T: 25C");

	while(1)
	{
		gtemp=MPU6050_Get_Temperature();	//得到温度值
		MPU6050_Get_Accelerometer(&aacx,&aacy,&aacz);	//得到加速度传感器数据
		MPU6050_Get_Gyroscope(&gyrox,&gyroy,&gyroz);	//得到陀螺仪数据
		Imu_Update(gyrox, gyroy, gyroz, aacx, aacy, aacz);
//		printf("俯仰角=%f, 横滚角=%f, 航向角=%f\r\n",Pitch,Roll,Yaw);
		servo_set_angle(Roll);
		mpu_data_pros_show();		
	}
}

四、实验现象

B站演示视频:https://space.bilibili.com/444388619


联系作者

作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

你可能感兴趣的:(【51单片机】趣味项目设计,51单片机,c语言,嵌入式硬件,proteus)