自动调平装置设计

一、 方案设计

1.1 任务分析

本课题的设计任务是利用姿态传感器MPU6050设计并制作一套自动调平装置,由圆盘、姿态传感器、可以调节高度的三个脚组成。并对姿态传感器的数据进行解算,设计控制算法通过STM32控制电机进行平台调节。

1.2 原理设计

1.2.1 MPU6050原理

MPU6050是整合性六轴运动处理模块,它可以实时获取运动物体在三维坐标系内的偏转角度,其中横滚角roll为绕X轴偏转的角度,俯仰角pitch为绕Y轴偏转的角度,航向角yaw为绕Z轴偏转的角度。

图1 MPU6050外观

MPU6050外观如上图所示,其中较为重要的是SCL和SDA两个管脚,它们是连接MCU的I2C接口,MCU通过这个I2C接口来控制MPU6050,此时MPU6050作为一个I2C从机设备进行通信,I2C的工作原理如图2,大致为主机首先会线拉低SDA总线,开始通信,接下来主机会发送地址,如果某个从设备地址和主机发的地址吻合,就会发出一个ACK信号,通信就此建立。之后开始读写操作,随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件,完成通信。

MPU6050的驱动流程如图3所示,具体如下:

(1)初始化I2C接口:初始化MPU6050的SDA和SCL

(2)复位MPU6050:电源管理寄存器1(0X6B)的Bit7写1(MPU6050内部所有寄存器恢复默认值)。复位后设置电源管理寄存器1为0X00,进入正常工作状态。

(3)设置满量程范围:通过陀螺仪配置寄存器(0X1B)和加速度传感器配置寄存器(0X1C)设置。设置陀螺仪的满量程范围为±2000dps,加速度传感器的满量程范围为±2g。

设置陀螺仪配置寄存器(0X1B)的Bit4 Bit3为11,由于陀螺仪的ADC为16位,则其灵敏度为:65536/4000=16.4LSB/(°/S)

设置加速度传感器配置寄存器(0X1C)的Bit4 Bit3为00,由于加速度传感器的ADC为16位,则其灵敏度为:65536/4=16384LSB/g

(4)设置其他参数:通过中断使能寄存器(0X38)和用户控制寄存器(0X6A)关闭中断和AUX I2C接口,FIFO使能寄存器(0X23)关闭所有FIFO通道(默认禁止),采样率分频寄存器(0X19)设置陀螺仪采样率为50,配置寄存器(0X1A)设置数字低通滤波器(DLPF)为带宽的1/2。

(5)配置系统时钟源并使能传感器:通过电源管理寄存器1(0X6B)的最低三位来设置(默认值是0,内部8M RC震荡),设置为1,选择x轴陀螺PLL作为时钟源。通过电源管理寄存器2(0X6C)来设置对应位为0即可开启使能角速度传感器和加速度传感器。

陀螺仪数据输出寄存器地址为:0X43~0X48,x轴的数据可以通过读取0X43(高8位)和0X44(低8位)寄存器得到,其他轴以此类推。加速度传感器数据输出寄存器地址为:0X3B~0X40,读x轴的数据可以通过读取0X3B(高8位)和0X3C(低8位)寄存器得到,其他轴以此类推。温度传感器的值可以通过读取0X41(高8位)和0X42(低8位)寄存器得到,温度换算公式如下(Temperature为计算得到的温度值,单位为℃,regval为从0X41和0X42读到的温度传感器值)。

Temperature=36.53+regval/340

图2 I2C的工作原理

图3 MPU6050使用流程

对于姿态解算问题,MPU6050 自带了DMP,即数字运动处理器,可以将加速度传感器和角速度传感器的原始数据,直接转换成四元数输出,而得到四元数之后即可计算出欧拉角。使用内置的 DMP,简化了代码设计,且 MCU 不用进行姿态解算过程,提高了系统的实时性。然后我们需要将四元数转换为欧拉角即可,图4为相关程序,要注意的问题是DMP输出的四元数是q30格式的,也就是浮点数放大了 2^{^{30}}倍。在换算成欧拉角之前,必须先将其转换为浮点数,也就是除以 2^{^{30}} ,然后再进行计算。另外,计算公式的57.3是弧度转换为角度,即 \frac{\pi}{180}

图4 四元数到欧拉角转换程序

1.2.2 调平算法

对于调平算法,我的方案是实时检测当前姿态,将俯仰角和横滚角与水平位置进行对比(由于要求精度优于1°,即在-1°和1°范围内可认为完成调平),当满足要求时直接声光提示,不满足时根据姿态调整电机运动情况实现调平。具体策略为根据俯仰角和横滚角的数值,我们可以知道其与x轴及y轴的偏角,另外根据MPU6050粘贴位置我们可知其实物的偏转情况,据此我们可以控制电动推杆上升或下降,将不同情况利用case语句写进程序即可实现调平,相关流程图如图5。

图5 调平算法流程图

1.2.3 按键控制

我利用矩阵键盘来切换不同界面显示以及进行模式选择,按下13键显示课题题目、姓名学号以及当前时间(可实时更新),按下16键退出,按下14键显示温度以及三个欧拉角(可实时更新),按下1-3键对应电机1上升、下降、暂停,5-7键控制电机2,9-11键控制电机3,同时按下后屏幕会显示对应汉字,按下12键为设置模式,此时按下任意按键后可以自动调节至对应键值的角度(此部分应用算法与自动调平一致,只是在循环中增添了按键扫描相应代码以及进行了变量更改),按下13键自动调平,同时有声光提示。相应管脚分配如表1所示。

表1 管脚分配

1.3 结构方案设计

对于装置结构,圆盘平台用亚克力的加工,直径16厘米,厚度5毫米,可调节高度的三个脚由电动推杆组成,推杆的伸缩由电机控制,实现高度的精确调节,推杆底部设计为通用螺纹接口。然后根据设备的坐标系统和所需测量的方向,选定一个合适的位置使用胶带直接将MPU6050模块粘贴在预定位置。在完成所有连接和配置后,进行基本的功能测试。验证MPU6050是否能正常进行姿态解算,然后根据设备的实际使用方向对MPU6050的输出数据进行校准,可通过旋转设备并观察数据变化来检查模块是否按预期方向工作,装置的结构示意图见图6。

图6 装置结构示意图

1.4 仿真设计

在拟定好初步方案及编写部分程序后,我在proteus中进行了仿真,由于软件中没有MPU6050传感器,即使下载导入模型也不能进行仿真,因此我用按键来代替,按下不同按键对应的角度加一,按下最后一个按键角度清零,电机转动,同时声光提示,仿真结果见图7。

图7 仿真结果图

1.5 系统框图

该课题以STM32F103C8T6为核心,通过L298驱动电动推杆,进而改变角度,通过MPU6050解算欧拉角,并以此作为反馈控制电机运动实现自动调平,同时有矩阵键盘和OLED实现人机交互,LED和蜂鸣器实现调平后的声光提示,具体框图见图8。

图9为总设计思路图,本装置在满足设计要求的前提下,增添了实时时间显示、调节时间计算、设置倾角等功能,并通过矩阵键盘实现了不同显示界面的切换,具体如图。

图8 系统框图

图9 总设计思路图

二、硬件电路设计

2.1 矩阵键盘

将16个按键排成4行4列,第一行将每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,这样便一共有8根线,我们将这8根线连接到单片机的8个I/O口上,配置行为输出模式,列为输入模式,对第一行输出高,其它行输出低,判断列对应管脚电平状态,从而记录第一行对应的哪列按键按下,其它行和列操作依此类推。从图10中可以看出,矩阵按键引出的8根控制线直接连接到单片机的PB8-PB15引脚口上,其中第1-4行对应PB8-PB11引脚,第1-4列对应PB12-PB15引脚上。

图10 矩阵键盘电路设计

2.2 声光提示

图11所示为核心板板载的一个LED灯,连接在PC13引脚。如果要使LED指示灯亮,只需要控制管脚输出低电平,如果要使LED指示灯灭,只需控制管脚输出高电平。

根据STM32F1芯片数据手册可知,单个IO口的最大输出电流是25mA,而蜂鸣器的驱动电流是30mA左右,因此我选择使用蜂鸣器模块,其中含有三极管可以对电流进行放大。如果要使蜂鸣器工作,只需要控制PA3输出高电平即可。

图11 声光提示部分电路设计

2.3 MPU6050及OLED

在原理设计部分我们知道MPU6050较为重要的是SCL和SDA两个管脚,用于I2C通信,而XDA和XCL是用于连接外部磁传感器进而形成九轴结构,AD0和INT也没有用到,故在该课题中无需连接,电路设计见图12。

对于OLED模块,本课题使用的为四线I2C接口形式,使用3.3V供电,模块的SCL与STM32的PB6连接,模块的SDA与PB7连接,电路设计见图13。

图12 MPU6050电路设计

图13 OLED电路设计

2.4 L298及电机部分

电动推杆位移原理较为简单,每个电动推杆有红黑两条线,红接高黑接低推杆上升,红接低黑接高推杆下降,因此我们只需对电机对应的IO口置0或置1即可实现。

对于L298的连接,我们在精密仪器实验中曾经学习过,使用12V供电(电动推杆要求),输入端接STM32的IO口,输出端接电机,输入和输出具有一一对应的关系,具体电路设计见图14。

图14 L298及电机电路设计

2.5 总览

经上述操作,我们完成了硬件电路各部分设计,为便于后续操作及实验验证,我利用Fritzing软件制作了整体接线示意图,如图15,图中可以清楚地看到电源模块、L298N、电机、蜂鸣器模块、MCU、OLED、矩阵键盘、MPU6050等模块,将电动推杆、MPU6050安装在圆盘平台上后硬件工作即全部完成。

图15 面包板接线示意图

三、 测试结果及分析

3.1 主界面

如图16所示,为初始界面,按下13键可进入,由上至下依次显示:课题题目、学号、姓名、年月日、星期、时间(可实时更新)。

图16 主界面

起初遇到了一些问题,比如调用内部RTC时出现了秒钟更新速度出现较大误差,经过多次修改时间初始值以及多次烧录程序,最终解决了该问题。然后将该部分程序写入按键后出现了无法实时更新的问题,只能手动刷新,我查阅了一些资料,试用外部中断来解决但结果仍不好,于是我在该程序中又写了一个死循环,在死循环中又做了一步按键扫描,按下16键可退出,最终实现了实时更新。

3.2 MPU6050界面

如图17所示,为MPU6050界面,按下14键可进入,由上至下依次显示:温度、俯仰角、横滚角、航向角。

图17 MPU6050界面

同样遇到了一些问题,首先也是只能手动刷新,我同样用了上述方法来解决。然后是姿态解算的问题,经常会出现MPU6050无法初始化的问题,我上网查询后发现可能原因是初始时位置与水平差异过大,经调整后初始化成功(也有MPU6050固定问题和杜邦线连接问题,经调整后得到了较好的改善)。

3.3 电机运动界面

如图18-图20所示,为电机运动界面,在这里以一号电机为例,按下1键电机1上升,按下2键电机1下降,按下3键电机1暂停,同时显示对应文字。同理,按下5-7键对应电机2,按下9-11键对应电机3。

在写界面的过程中我有过一些尝试,如计算电机运动位移,由于电动推杆的厂家说该推杆无法调速,且匀速速度为30mm/s,最大位移为21mm,当我利用定时器中断来统计时间并计算位移时发现结果与手册不符,我认为实际速度可能远达不到30mm/s,也可能不是严格的匀速运动,最终没有加入该功能。

图18 电机上升界面

图19 电机下降界面

图20 电机暂停界面

3.4 自动调平界面

如图21所示,为自动调平界面,按下15键可进入,由于水平位置只与俯仰角和横滚角相关,由上至下依次显示:功能名称、俯仰角、横滚角、调节时间。

实现自动调平的操作为首先使电机运动,进而使圆盘平台不平,然后按下15键开始自动调平算法,实现自动调平,屏幕上角度实时更新。由于精度要求,在-1°和1°之间时停止电机运动,认为实现调平,同时有声光提示。对于调节时间,我在屏幕上显示的是当前的秒钟时间,当初始时间与完成时间的差异超过10秒时会报警。

图21 自动调平界面

3.5 设置角度界面

如图22所示,为设置角度界面,按下12键可进入,由上至下依次显示:功能名称、俯仰角、横滚角。

实现设置角度的操作为按下12键后设置想要的角度(按下按键即设置对应的键值为角度值),然后即可应用设置角度算法,就会自动调节到设置的角度。如图中所示为设置2°后调节的结果,精度仍然为1°以内,调节完成后仍然会有声光提示。

图22 设置角度界面

四、 作品照片及说明

4.1 硬件部分及说明

如图23所示,我们可以看到ST-Link、矩阵键盘、STM32F103C8T6、OLED、L298、蜂鸣器、MPU6050、圆盘平台、电动推杆、电源模块等,电路连接在前面已有说明,在此不再赘述,对于MPU6050的安装,我首先人为将其平放在圆盘平台上,确定俯仰角、横滚角均为0时利用胶带将其粘贴在圆盘平台上;另外,对于电动推杆的连接,我使用螺丝螺母将其与圆盘平台固定连接,至于各个电动推杆与平台间的倾角不必相同,因为调平算法是以角度作为反馈,故初始位置不水平也不影响后续调平等操作。

4.2 软件部分及说明

在软件部分,主要用到的头文件如表2所示,相关功能主要是控制LED灯、进行I2C通信、控制按键、进行MPU6050初始化及姿态解算、控制OLED、控制电机、控制蜂鸣器、控制RTC等。

表2 外设相关头文件

在具体软件设计部分,主要对主函数部分进行说明,首先是初始化部分,如图24所示,主要有时钟初始化,中断优先级设置,LED初始化,矩阵键盘初始化,MPU6050初始化,OLED初始化,RTC初始化,电机初始化,蜂鸣器初始化等。

图24 初始化部分

然后主要是while(1)死循环部分,首先进行按键扫描,然后即可利用if语句按照设计的功能编写程序,如图25所示为电机升降及暂停部分,电机两根线的电流正负情况我主要是利用GPIO_SetBits(),GPIO_ResetBits()这两个函数来控制,OLED_ShowFontHZ()函数是用来显示汉字的函数,对于字符的点阵数据我使用汉字取模软件PCtoLCD2002,使用C51格式即可完成取模。

图25 电机升降及暂停部分

图26所示为时间显示部分,相关参数由RTC相关函数直接计算得出,将其写入死循环中即可实现实时更新。右侧图中即为退出死循环的程序,即定义另一个按键变量keyy,用以区别外部按键变量key,在内部死循环中再进行一次按键扫描,即可实现功能。

图26 时间显示部分

图27所示为自动调平部分,逻辑比较简单,就是根据角度的不同来控制电机的运动,进而实现自动调平。

图27 自动调平部分

图28所示为设置角度部分,主要是进行按键扫描,然后将按下的按键对应键值设置为期望键值,然后应用设置算法,达到指定角度后LED闪烁。关于设置算法,比较简单,只要在调平算法上修改即可,根据精度要求将1°和-1°替换为对应的期望角度±1°,如此即可实现设置角度并调节。

图28 设置角度部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值