当前位置:   article > 正文

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

51单片机陀螺仪程序


一、主要功能

系统运行后,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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

三、软件设计

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();		
	}
}
  • 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

四、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述


联系作者

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

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/568304
推荐阅读
相关标签
  

闽ICP备14008679号