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


一、主要功能

系统运行后,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.主要代码

#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设计,视频分享,技术交流。

  • 13
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MPU6050是一种常用的六轴陀螺仪加速度计模块,用于测量物体的姿态和运动。PID控制是一种常用的控制算法,用于实现目标值与实际值之间的闭环控制。下面是一个基于MPU6050陀螺仪和PID控制的舵机代码示例: ```c++ #include <Wire.h> #include <Servo.h> #include <MPU6050.h> MPU6050 mpu; Servo servo; // PID参数 double kp = 1.0; // 比例系数 double ki = 0.2; // 积分系数 double kd = 0.1; // 微分系数 // 目标角度 double targetAngle = 0.0; // PID变量 double error = 0.0; double lastError = 0.0; double integral = 0.0; double derivative = 0.0; // 舵机角度范围 int servoMin = 0; int servoMax = 180; void setup() { Wire.begin(); mpu.initialize(); servo.attach(9); // 连接舵机的引脚 // 设置舵机角度范围 servo.write(servoMin); delay(500); servo.write(servoMax); delay(500); // 初始化PID变量 error = targetAngle - getAngle(); } void loop() { // 获取当前角度 double currentAngle = getAngle(); // 计算误差 error = targetAngle - currentAngle; // 计算积分项 integral += error; // 计算微分项 derivative = error - lastError; // 计算PID输出 double output = kp * error + ki * integral + kd * derivative; // 限制输出范围 output = constrain(output, servoMin, servoMax); // 控制舵机角度 servo.write(output); // 更新上一次的误差 lastError = error; delay(20); // 控制周期 } // 获取当前角度 double getAngle() { int16_t rawAccX, rawAccY, rawAccZ; mpu.getAcceleration(&rawAccX, &rawAccY, &rawAccZ); double accX = rawAccX / 16384.0; // 根据MPU6050的灵敏度进行缩放 double accY = rawAccY / 16384.0; double angle = atan2(accY, accX) * (180.0 / PI); // 计算角度 return angle; } ``` 这段代码使用了Wire库来与MPU6050通信,Servo库来控制舵机。在setup函数中,初始化了MPU6050和舵机,并设置了舵机的角度范围。在loop函数中,通过PID控制算法计算出舵机的输出角度,并控制舵机转动到相应的角度。getAngle函数用于获取当前的角度值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值