基于STM32的三自由度机械手臂

合集下载

基于STM32的机械手臂控制系统设计

基于STM32的机械手臂控制系统设计

图2 . 1机械臂控制 系统结构
该系 统是通 过 计算 机 的事先 的编程 之后 ,通 过 数据 传输 下载 到 s t m3 2 当中通 过控f l i J  ̄ s t m3 2 的定 时器 产生 多路 的P WM波 。舵机 就会 依 据 给定 的P WM波 完成相 应 的运 动轨迹 或按照 预定 的计划完 成任务 。 2 . 3 机械臂 的臂部 设计 因为机 械臂 主 要是 由臂 部组 成 ,所 以在进 行 臂部 设计 时应 当 着 重 注 意 以下 几 点 : ( 1 )手臂 在机 械 臂 中起 着 重要 的作 用 :它 不光 可 以 让物 体 进行 移 动而 且 还 能进 行 一些 操 作 。 ( 2 )因 为机 械 臂 的 臂 部在 运动 中有 很大 负担 ,为 了减小 手臂 的 负担 ,需要 将手 臂 的截 面 形状 做 的更加 合理 。在 进 行 了各种截 面 对弯 曲度 的承 受力 的实验 后 发现 ,在 相 同力 的情况 下 ,工字 型 的截 面 能承受 的力 最大 ,因此 我 选择 使 用工 字 型截 面 做手 臂 的 截面 。 ( 3 )因为 机械 臂 在 直 线运 动 中可 能会 发生 突然 的方 向转 换 , 因此 ,为 了防止 机械 臂 的硬 件损 耗过 大 ,需要 采 用一 些装置 来 保护 机械 臂 。 同时要 采用 一定 形 式 的 缓冲 措 施 。 ( 4 )为 了减 少 臂 部在 运 动时 会产 生 较 大 的转 动惯 量 , 需要 将臂 部 的重量 减少 ,以免 在运 动 中产生 较 大 的误差 ,从 而影 响 机 械 臂 的整 体 运作 ,加 快机械 臂 的运行 速度 。 经过对预期任务 的特点和类型分析,该设计 需要机械臂具有较高 的 灵 活性和流畅性 ,因此在 多次 的比较和分析后 ,决定使用 多关节型机械 臂 。它不仅可 以灵活的完成预定任务 ,而且可以有更大 的运动空间 。 2 . 4 机械臂 自由度选择 通 常将机械 臂是 由几个 传动结 构组成 的就称为几 自由度 。例如人 类 的 自由度高 达2 7 个 ,而 手臂 部分 的 自由度 一般 为6 自由度 。所 以仿 照 人类 的特性 ,机械 臂 的 自由度 应 当选为6 自由度 ,这 样 既符合 了身 体力 学并且动 力传输 效率也很 高 。为 了更加流 畅的完成抓 取物体 ,并 将物体 移动到 指定 的位置 , 需要 采用6 自由度 。而 6 自由度 的机械 臂的 控制较为 繁琐,所 以工 业和生活 中机械 臂的 自由度 多少 于6 个。 2 . 5 机 械臂 控 制器类 型 控制 器 的主 要任 务就 是按 照预 先 设计 的程 序进 行相 应 的任 务 , 它是 机械 臂 中十 分重 要 的组件 。机 械臂 的控制 器就 相 当于 电脑 中 的 处理 器 ,只有 处 理器越 好 , 电脑 的运行 速度 和 处理 速度 才会 越 快 。 对 于 机械 臂来 说 也一样 ,只有 控制 器越 好 ,才 能更 加精 准快 速 的进 行控 制 。从控 制器 的数 量 和机 械臂 的控 制 方式 可分 为 以下几 种 :单

基于某STM32的机械臂运动控制分析报告设计

基于某STM32的机械臂运动控制分析报告设计
(1)
其中:
得到各连杆之间的变换矩阵
(2)
(3)
(4)
式中:s1,s2,s3,s4;c1,c2,cs3,c4分别表示sinθ1,sinθ2,sinθ3,sinθ4; cosθ1, cosθ2, cosθ3, cosθ4以下同。由矩阵(1)可知:连杆变换 依赖于 四个参数和 ,其中只有一个参数是变化的,对于本文所研究的机器人,显然只有 为变量,其余三个参数为常量。
图3.1 STM32
3.3
该设计的主控制模块的硬件系统包括电源电路、复位电路、系统时钟电路以及JTAG调试电路四大组成部分。
3.3.1
在硬件电路的设计中,电源模块的设计是非常重要的,如果不能妥善处理,不但会使电路不能正常工作,严重的还可能烧毁电路。因此,在设计电源时务必要注意如下几点:
(1)交流输入和直流输出尽可能保持更大的距离;
关键词:四自由度机械臂,STM32,运动模型,脉冲宽度调制
第1章
1.1
机器人运动学描述了机器人关节与组成机器人的各刚体之间的运动关系。机器人在工作时,要通过空间中一系列的点组成的三维空间点域,这一系列空间点构成了机器人的工作范围,此工作范围可通过运动学正解求得。此外,根据机器人末端执行器的位置和姿态要求,通过运动学逆解求得各个关节转角,可以实现对机器人进行运动分析、离线编程、轨迹规划等工作。
机器人控制的目的就在于它能快速确定位置,这使得机器人的运动学正逆解问题变得更为重要。只有计算与运动学正逆解问题相关的变换关系在尽可能短时间内完成,才能达到快速准确的目的。在运动学方程正解过程中,只体现在矩阵相乘关系上,相对简单。
1.2
本文所研究的机器人由四个旋转关节和四个连杆组成,故为四自由度机器人,如图1.1所示。

基于STM32的机械臂运动控制分析设计说明书

基于STM32的机械臂运动控制分析设计说明书

机器人测控技术大作业课程设计课程设计名称:基于STM32的机械臂运动控制分析设计专业班级:自动1302学生姓名:张鹏涛学号:201323020219指导教师:曹毅课程设计时间:2016-4-28~2016-5-16目录摘要 (V)第一章运动模型建立...................................................................................... V I1.1引言 ................................................................................................ V I1.2机器人运动学模型的建立.................................................................. V I1.2.1运动学正解 (VIII)第二章机械臂控制系统的总体方案设计 (X)2.1机械臂的机械结构设计 (X)2.1.1臂部结构设计原则 (X)2.1.2机械臂自由度的确定 (XI)2.2机械臂关节控制的总体方案 (XI)2.2.1机械臂控制器类型的确定 (XI)2.2.2机械臂控制系统结构 (XII)2.2.3关节控制系统的控制策略 (XIII)第三章机械臂控制系统硬件设计 (XIII)3.1机械臂控制系统概述 (XIII)3.2微处理器选型 (XIV)3.3主控制模块设计 (XV)3.3.1电源电路 (XV)3.3.2复位电路 (XVI)3.3.3时钟电路 (XVI)3.3.4 JTAG调试电路.................................................................. X VII3.4驱动模块设计................................................................................. X VII3.5电源模块设计.................................................................................. X IX 第四章机械臂控制系统软件设计................................................................... X X4.1初始化模块设计............................................................................... X X4.1.1系统时钟控制....................................................................... X X4.1.2 SysTick定时器 (XXII)4.1.3 TIM定时器 (XXIII)4.1.4通用输入输出接口GPIO (XXIV)4.1.5超声波传感器模块 (XXV)总结 (XXVI)参考文献 (XXVII)附录A ......................................................................................................... X XIX 附录B . (XXX)设计要求:设计一个两连杆机械臂,具体参数自行设计,建立其运动学模型,然后在此基础上完成该机械臂两点间的路径规划,并给出仿真结果。

基于STM32的机械臂运动控制分析设计

基于STM32的机械臂运动控制分析设计

机器人测控技术大作业课程设计课程设计名称:基于STM32的机械臂运动控制分析设计专业班级:自动1302学生姓名:张鹏涛学号:201323020219指导教师:曹毅课程设计时间:2016-4-28~2016-5-16指导教师意见:成绩:签名:年月日目录摘要.............................................................................................................................. I V第一章运动模型建立 (V)1.1引言 (V)1.2机器人运动学模型的建立 (V)1.2.1运动学正解 (VII)第二章机械臂控制系统的总体方案设计 (VIII)2.1机械臂的机械结构设计 (VIII)2.1.1臂部结构设计原则 (VIII)2.1.2机械臂自由度的确定..................................................................... I X2.2机械臂关节控制的总体方案...................................................................... I X2.2.1机械臂控制器类型的确定............................................................. I X2.2.2机械臂控制系统结构 (X)2.2.3关节控制系统的控制策略 (X)第三章机械臂控制系统硬件设计............................................................................ X I3.1机械臂控制系统概述.................................................................................. X I3.2微处理器选型 (XII)3.3主控制模块设计 (XII)3.3.1电源电路 (XII)3.3.2复位电路 (XIII)3.3.3时钟电路 (XIII)3.3.4 JTAG调试电路 ........................................................................... X IV3.4驱动模块设计 (XV)3.5电源模块设计........................................................................................... X VI 第四章机械臂控制系统软件设计 (XVII)4.1初始化模块设计 (XVII)4.1.1系统时钟控制 (XVII)4.1.2 SysTick定时器 (XVIII)4.1.3 TIM定时器 ................................................................................. X IX4.1.4通用输入输出接口GPIO (XX)4.1.5超声波传感器模块 (XX)总结 (XXII)参考文献 (XXIII)附录A (XXIV)附录B (XXV)设计要求:设计一个两连杆机械臂,具体参数自行设计,建立其运动学模型,然后在此基础上完成该机械臂两点间的路径规划,并给出仿真结果。

基于STM32的协作机器人机械臂控制系统设计

基于STM32的协作机器人机械臂控制系统设计

基于STM32的协作机器人机械臂控制系统设计作者:李以聪戴福全肖明伟陈剑枰陈志伟吴国安来源:《科技与创新》2017年第10期文章编号:2095-6835(2017)10-0027-02摘要:目前,针对协作机器人的柔顺控制、零力控制问题,提出了一种基于以ST公司的STM32为微控制器的协作机器人机械臂控制系统。

该系统采用数字PID闭环算法改善机械臂的柔顺运动,增强其稳定、可靠性能,并加上力矩传感器或电流检测电路感知外界的力矩变换情况,补偿机械臂的自重,实现零力控制,为机器人的快速示教奠定基础。

实验结果表明,将STM32系列微控制器作为主控制器具有可行性,可以应用于协作机器人的机械臂控制系统中,且具有广阔的应用前景,并最终将其运用于实际工业生产加工中。

关键词:机械臂;协作机器人;PID;STM32中图分类号:TP242 文献标识码:A DOI:10.15913/ki.kjycx.2017.10.027一直以来,控制器都是机器人控制系统的核心,但是,国外相关产业公司对我国实行严厉的保密措施。

随着微处理器行业的快速发展,市面上陆续出现了高性能、高性价比的32位微处理器,它们的性能能够满足机械臂对控制器的运算需求。

针对目前协作机器人控制系统资源匮乏,价格昂贵且工作不稳定等问题,提出了一种改进设计,以满足中小企业对机械臂的控制需求。

在设计该控制系统时,首先提出了电机的硬件驱动电路设计方案。

主控芯片采用一种抗干扰能力比较强、运算速度快、价格合理的STM32微控制器,相比现在广泛使用的电机控制的DSP,STM32成本比较低,自带能产生电机控制所必须的PWM输出的TIM,且外围电路较为简单,适用于机械臂的电机控制。

接着分析机械臂电机伺服控制所需要的PID位置环算法,最后通过实物样机试验机械臂的运动柔顺度,通过Matlab进行电机旋转位置的数据拟合,得出响应曲线,并最终证实了该设计方案的可行性。

1 硬件驱动电路设计机械臂的电机驱动电路是整个研究的基础,具有良好的启动和调速性能,而其稳定控制也成了重要的研究对象。

单片机控制三自由度圆柱坐标机械手设计

单片机控制三自由度圆柱坐标机械手设计

单片机控制三自由度圆柱坐标机械手设计一、引言随着科学技术的不断发展,机械手在工业生产、科研等领域扮演着越来越重要的角色。

机械手的设计是其中的关键环节之一,而单片机是机械手控制的核心部分之一、本文将介绍一种基于单片机控制的三自由度圆柱坐标机械手的设计。

二、机械手的结构设计该机械手的结构主要由三个旋转关节组成,分别对应三个自由度。

每个旋转关节由步进电机驱动,通过直线传动装置实现转动,并带有相应的位置反馈传感器。

三、单片机的选取单片机是机械手控制的核心部分,控制机械手的动作和位置。

单片机的选择需要考虑其计算性能、接口资源等方面的要求。

本设计选择了STM32系列的单片机,具有大容量的存储器和强大的计算能力,同时提供多种通信接口和模拟/数字接口,满足了机械手控制的需求。

四、电路设计电路设计包括电源电路、电机驱动电路和控制电路三个模块。

电源电路为电机驱动和单片机提供稳定的电源。

电机驱动电路采用步进电机驱动芯片,通过信号电平控制电机的转动。

控制电路主要由单片机和传感器组成,负责接收传感器的反馈信号,并控制电机的转动。

五、软件设计在单片机软件设计方面,本设计采用C语言进行编程。

通过编写相应的程序,实现机械手的运动控制,包括正向运动、逆向运动和位置控制等功能。

同时,还可以为机械手增加一些智能化的功能,如碰撞检测、路径规划等。

六、实验与结果将设计好的电路板焊接好后,进行实验测试。

通过对机械手的不同输入信号进行测试,观察机械手的运动情况,并对其进行调试。

最终,可以实现通过单片机控制的三自由度圆柱坐标机械手的正常运行。

七、总结本文设计了一种基于单片机控制的三自由度圆柱坐标机械手。

通过对机械手的结构和电路进行设计,选取合适的单片机和编写相应的控制程序,实现了机械手的运动控制。

该设计具有较高的可靠性和灵活性,可以广泛应用于工业生产和科研等领域。

基于STM32的多自由度机械臂设计

基于STM32的多自由度机械臂设计
ELECTRONICS W ORLD ·
基 于STM3 2 孙在 尚
【摘要 】随着科技的不断进步,机械臂特别是仿人型机械臂的发展非常迅速。其在人们的 日常生活、生产 中扮演着不可或缺 的角色。鉴于我 国机 械仿 生臂 技 术 以及控 制方 法较 西 方 国家落后 , 目前 自主 研发 的机 械臂 在 使 用方便 性 以及 精度 上都 不尽 如人 意 。在 市场 上很 难 占有一 席之 地 为 了打破 西 方 国 家在这 一 领域 ,特 别是 高 端领 域 的 垄断 ,许 多国人 开始 关注 自主研 发 的机 械 臂 。对 于仿 人 型机 械 臂及 其控 制 系统 的研 究还 是 有深 远 的意 义 的 。为 了能 高 效稳 定地 控 制机 械臂 ,本设 计使 用 了数 字 式 六轴 陀螺 仪协 同作 业 ;上 位控 制 系统使 用ARM微 处理 器—— STM32F103芯 片, 用以 实现机 械臂 的 基本 动作 的控 制封 装 , 包括 定位算 法 以及运 动控 制 等 ;它能按 照 生产 工 艺的要 求 ,遵循 一 定 的程序 、时
制 关 系是这 样 的 : 0.5ms… …… …一0度 :
1.0ms… …… …45度 ; 1.5ms… …… …90度 ;
2.0ms… …一 ~1 35度 : 2.5ms… …… 一1 80度 ; 1.2 陀螺 仪 的控 制 陀螺 仪的 原理 就 是 ,一 个旋 转物 体 的旋转 轴 所指 的 方 向在 不受 外 力 影响 时 ,是 不会 改变 的 。根据 原 理 ,用它 来 保持 方 向 ,制 造 出 来 的 东西就 叫 陀螺 仪 。陀 螺仪 在 工作 时要 给它 一 个力 ,使它 快速 旋 转 起来 ,一般 能达 到 每分 钟几 十 万转 ,可 以工 作 很长 时 间 。然后 用 多种方 法读 取轴 所 指示 的方 向 ,并 自动将 数 据信 号传 给控 制 系统 。 对 于 高速 旋转 的 物体 的旋 转 轴 ,对于 改 变其 方 向 的外 力作 用有

基于STM32的机械臂运动控制分析设计

基于STM32的机械臂运动控制分析设计

机器人测控技术大作业课程设计课程设计名称:基于STM32的机械臂运动控制分析设计专业班级:自动1302学生姓名:张鹏涛学号: 2指导教师:曹毅课程设计时间: 2016-4-28~2016-5-16目录摘要 (III)第一章运动模型建立................................................................................................ I V1、1引言......................................................................................................... I V1、2机器人运动学模型的建立....................................................................... I V1、2、1运动学正解............................................................................... V I 第二章机械臂控制系统的总体方案设计.. (VII)2、1机械臂的机械结构设计 (VII)2、1、1臂部结构设计原则 (VII)2、1、2机械臂自由度的确定 (VIII)2、2机械臂关节控制的总体方案 (VIII)2、2、1机械臂控制器类型的确定 (VIII)2、2、2机械臂控制系统结构............................................................... I X2、2、3关节控制系统的控制策略....................................................... I X 第三章机械臂控制系统硬件设计.. (X)3、1机械臂控制系统概述 (X)3、2微处理器选型 (X)3、3主控制模块设计....................................................................................... X I3、3、1电源电路................................................................................... X I3、3、2复位电路 (XII)3、3、3时钟电路 (XII)3、3、4 JTAG调试电路 (XIII)3、4驱动模块设计 (XIII)3、5电源模块设计........................................................................................ X IV 第四章机械臂控制系统软件设计......................................................................... X VI4、1初始化模块设计.................................................................................... X VI4、1、1系统时钟控制........................................................................ X VI4、1、2 SysTick定时器 (XVII)4、1、3 TIM定时器 (XVIII)4、1、4通用输入输出接口GPIO ..................................................... X IX4、1、5超声波传感器模块................................................................ X IX 总结. (XX)参考文献................................................................................................................... X XI 附录A . (XXII)附录B (XXIII)设计要求:设计一个两连杆机械臂,具体参数自行设计,建立其运动学模型,然后在此基础上完成该机械臂两点间的路径规划,并给出仿真结果。

基于STM32的机械臂运动控制分析设计说明

基于STM32的机械臂运动控制分析设计说明

沐 勺,密衣厚机器人测控技术大作业课程设计课程设计名称:基于STM32的机械臂运动控制分析设计课程设计时间:2016-4-28 〜2016-5-16目录摘要 (IV)专业班级: 学生姓名: 学 号: 指导教师:自动1302 张鹏涛 201323020219曹毅第一章运动模型建立 (V)1.1 引言 (V)1.2 机器人运动学模型的建立 (V)1.2.1 运动学正解 (VII)第二章机械臂控制系统的总体方案设计 (VIII)2.1 机械臂的机械结构设计 (VIII)2.1.1 臂部结构设计原则 (VIII)2.1.2 机械臂自由度的确定 (IX)2.2 机械臂关节控制的总体方案 (X)2.2.1 机械臂控制器类型的确定 (X)2.2.2 机械臂控制系统结构 (XI)2.2.3 关节控制系统的控制策略 (XI)第三章机械臂控制系统硬件设计 (XII)3.1 机械臂控制系统概述 (XII)3.2 微处理器选型 (XIII)3.3 主控制模块设计 (XIII)3.3.1 电源电路 (XIV)3.3.2 复位电路 (XIV)3.3.3 时钟电路 (XIV)3.3.4 JTAG 调试电路 (XV)3.4 驱动模块设计 (XV)3.5 电源模块设计 (XVII)第四章机械臂控制系统软件设计 (XVIII)4.1 初始化模块设计 (XVIII)4.1.1 系统时钟控制 (XVIII)4.1.2 SysTick 定时器 (XX)4.1.3 TIM 定时器 (XXI)4.1.4 通用输入输出接口GPIO (XXII)4.1.5 超声波传感器模块 (XXII)总结 (XXIV)参考文献 (XXV)附录A (XXVI)附录B (XXVII)设计要求:设计一个两连杆机械臂,具体参数自行设计,建立其运动学模型,然后在此基础上完成该机械臂两点间的路径规划,并给出仿真结果。

设计完成上述目标的控制系统,控制器可以自行选择(单片机,ARM ,DSP,PLC 等),其他硬件部分根据系统所需要完成的功能自行选择,基本要求要体现系统的输入,输出信号和人机交互界面,画出整个系统的硬件结构(电路模块,驱动模块,控制模块等)和软件部分。

基于STM32的机械臂运动控制系统设计研究

基于STM32的机械臂运动控制系统设计研究

井冈山大学学报(自然科学版) 73 文章编号:1674-8085(2019)01-0073-05基于STM32的机械臂运动控制系统设计研究*刘磊1,余汾芬2(1. 安庆职业技术学院,安徽,安庆246003;2.安庆医药高等专科学校,安徽,安庆246052)摘要:为了提高机械臂运动的准确性以及提高机械臂的控制效率,运用STM32处理器设计了一种机械臂运动控制系统。

采用STM32作为主控系统的核心,通过角度位移传感器构成机械臂的感知模块,利用舵机驱动电路构成机械臂的运动模块,从而形成机械臂运动控制系统的硬件单元。

以模糊PID控制理论为软件核心,对机械臂运动过程中的轨迹偏差进行计算,形成控制量。

主控器STM32将根据控制量对机械臂的运动模块发出调控信号,使得机械臂能够快速回归预定的运动轨迹。

实验结果表明,本文所设计的机械臂运动控制系统,能够快速、准确地对机械臂的运动状态进行控制,提高机械臂运动的准确性。

关键词:机械臂;运动控制;STM32;角度位移传感器;模糊PID控制理论;运动轨迹中图分类号:TP391 文献标识码:A DOI:10.3969/j.issn.1674-8085.2019.01.015 RESEARCH ON THE DESIGN OF MANIPULATOR MOTION CONTROLSYSTEM BASED ON STM32*LIU Lei1,YU Fen-fen2(1. Anqing V ocational & Technical College, Anqing, Anhui 246003, China; 2. Anqing Medical College, Anqing, Anhui 246052, China)Abstract:To improve the accuracy of the manipulator motion and the control efficiency of the manipulator, a manipulator motion control system is designed by using STM32 processor.STM32 is used as the core of the main control system. The perception module of the manipulator is composed of angular displacement sensor, and the motion module of the manipulator is composed of the steering motor driving circuit. They form the hardware unit of the manipulator motion control system.Taking the theory of fuzzy PID control as the software core, the trajectory deviation of the manipulator is calculated to form the control quantity.The main controller STM32 will send the control signal to the motion module of the manipulator according to the control quantity, so that the manipulator can quickly return to the predetermined trajectory.The experimental results show that the motion control system of the manipulator designed in this paper can quickly and accurately control the motion state of the manipulator, which can improve the accuracy of the motion of the manipulator.Key words:manipulator; motion control; stm32; displacement sensor; fuzzy pid control theory; motion trajector0 引言机械臂是一种模拟人体手臂的机器[1]。

(完整word版)基于STM32的机械臂运动控制与结构设计开题报告

(完整word版)基于STM32的机械臂运动控制与结构设计开题报告

基于STM32的机械臂运动控制与结构设计开题报告班级(学号):机械1104(2011010093)姓名:文伟松指导教师:王科社选题背景机器人技术是一种新兴技术,它涉及多种学科,综合了计算机、机械学、信号处理和传感技术、控制论、仿生学和人工智能等多学科。

机器人按照用途可分为工业机器人、服务机器人和特种机器人,其中工业机器人是目前应用最多、技术上发展最成熟的一种机器人。

随着我国经济的快速发展和科学技术的突飞猛进,使得机器人在货物搬运与物流、喷涂、焊接、测量等行业有着相当广泛的应用。

码垛机器人是实现物流和包装自动化的关键装备,可以实现高速、自动、连续、准确的码垛操任务。

人工码垛是强度大、重复性高的劳动,特别是高粉尘、有毒、有害等物料,基本不适合人工码垛,因此有必要研发一种码垛机器人,减低生产过程中对工人身心伤害。

进入 20 世纪 80 年代,随着计算机技术、控制技术以及自动化技术的发展和成熟,工业发达国家如日本、美国、瑞典、意大利、德国等都在相应的研制出了自己的码垛机器人。

如德国的 KUKA 系列,日本的 FANUC 系列,瑞典的 ABB 系列等。

国外发达国家研制的码垛机器人多为四轴空间的关节机器人,一般由机械本体、拉制器和末端执行机构组成,其中机械本都是有底座,腰部连杆,大小臂连杆和末端执行器(腕部)构成。

如图 1.1。

德国KUKA 瑞典ABB机器人日本不二(FUJI)日本OKURA图1.1 发达国家研制的主要工业机器人基于串联式码垛机器人,本文设计一种类似结构的机械臂。

针对毕业论文题目“基于STM32的机械臂运动控制与结构设计”,首先对国内外高校,研究院,企业等对码垛机器人研究及其发展状况进行调研;其次对设计的机械臂作运动学分析以及控制系统设计等。

1.1.1主要研究内容本文针对串联关节型码垛机器人,设计了一种新型4DOF机械臂;此机械臂主要连杆机构与串联关节型码垛机器人类似;在不大幅度增加系统转动惯量前提下,增加一个自由度实现末端执行器翻转,改进末端视觉传感器测量角度和带宽。

基于STM32的多自由度机械臂设计研究

基于STM32的多自由度机械臂设计研究

2017年第7期时代农机TIMES AGRICULTURAL MACHINERY第44卷第7期Vol.44No.72017年7月Jul.2017作者简介:孟建平(1981-),男,内蒙古人,大学本科,讲师,主要研究方向:控制理论与控制工程。

基于STM32的多自由度机械臂设计研究孟建平(内蒙古机电职业技术学院电气工程系,内蒙古呼和浩特010070)摘要:文章阐述了机械臂的组成及原理,对驱动模块、陀螺仪、控制模块、执行模块的控制进行分析,并探讨了基于STM32的多自由度机械臂设计,以期为我国的机械臂设计提供借鉴。

关键词:STM32单片机;多自由度;机械臂随着机械技术的迅猛发展,机械臂的设计研究日益发达,机械臂在生产实践中发挥着日益重要的作用。

我国的机械臂设计研究起步较晚,缺乏良好的精度控制和机械性能。

因此,我国加强对仿人型机械臂及其控制系统的研究,对于我国机械领域的发展具有至关重要的深远意义。

1机械臂的组成及原理(1)驱动模块的精确控制。

机械臂的控制信号,经由机械臂接收机的通道,实现对机械臂信号调制芯片的进入,并完成对直流偏置电压的有效获取。

机械臂驱动模块内部存在着基准电路,能实现对基准信号的产生。

产生的基准信号的宽度是1.5ms,基准信号周期为20ms。

通过比较电位器与直流偏置电压二者的电压差,实现对电压差输出的有效获取。

当电机保持一定的转速时,电位器在级联减速齿轮的带动下,实现旋转。

电压差为0时,电机的转动停止。

通常需要利用时基脉冲,实现对机械臂舵机的有效控制。

时基脉冲以20ms 为宜。

该时基脉冲的高电平部分,通常是0.5~2.5ms 之间的角度控制脉冲部分,其总间隔是2ms。

(2)陀螺仪的控制。

陀螺仪的原理如下:当不存在外力对旋转物体的影响时,其旋转轴所指方向不变。

根据该原理能制造出实现方向保持的陀螺仪。

对于陀螺仪的工作,需要施加一个作用力,确保陀螺仪的快速旋转,通常能达到每分钟实现几十万转,且能实现较长的工作时间。

(完整word版)基于STM32的机械臂运动控制与结构设计开题报告

(完整word版)基于STM32的机械臂运动控制与结构设计开题报告

基于STM32的机械臂运动控制与结构设计开题报告班级(学号):机械1104(2011010093)姓名:文伟松指导教师:王科社选题背景机器人技术是一种新兴技术,它涉及多种学科,综合了计算机、机械学、信号处理和传感技术、控制论、仿生学和人工智能等多学科。

机器人按照用途可分为工业机器人、服务机器人和特种机器人,其中工业机器人是目前应用最多、技术上发展最成熟的一种机器人。

随着我国经济的快速发展和科学技术的突飞猛进,使得机器人在货物搬运与物流、喷涂、焊接、测量等行业有着相当广泛的应用。

码垛机器人是实现物流和包装自动化的关键装备,可以实现高速、自动、连续、准确的码垛操任务。

人工码垛是强度大、重复性高的劳动,特别是高粉尘、有毒、有害等物料,基本不适合人工码垛,因此有必要研发一种码垛机器人,减低生产过程中对工人身心伤害。

进入 20 世纪 80 年代,随着计算机技术、控制技术以及自动化技术的发展和成熟,工业发达国家如日本、美国、瑞典、意大利、德国等都在相应的研制出了自己的码垛机器人。

如德国的 KUKA 系列,日本的 FANUC 系列,瑞典的 ABB 系列等。

国外发达国家研制的码垛机器人多为四轴空间的关节机器人,一般由机械本体、拉制器和末端执行机构组成,其中机械本都是有底座,腰部连杆,大小臂连杆和末端执行器(腕部)构成。

如图 1.1。

德国KUKA 瑞典ABB机器人日本不二(FUJI)日本OKURA图1.1 发达国家研制的主要工业机器人基于串联式码垛机器人,本文设计一种类似结构的机械臂。

针对毕业论文题目“基于STM32的机械臂运动控制与结构设计”,首先对国内外高校,研究院,企业等对码垛机器人研究及其发展状况进行调研;其次对设计的机械臂作运动学分析以及控制系统设计等。

1.1.1主要研究内容本文针对串联关节型码垛机器人,设计了一种新型4DOF机械臂;此机械臂主要连杆机构与串联关节型码垛机器人类似;在不大幅度增加系统转动惯量前提下,增加一个自由度实现末端执行器翻转,改进末端视觉传感器测量角度和带宽。

基于STM32的三自由度机械手臂

基于STM32的三自由度机械手臂

此次用的是TIME3的通道1、2和4,用以 产生3路PWM波,控制机械手臂的三个电 机
Your site here
LOGO
第三部分 根据定位的中心并结合位置关系确定手臂的运动轨 迹
检测到的位置与实际位置的映射关系
LCD上的位置坐标
映射到实际位置
根据实际情况进行测量,计算机械手臂需 旋转的角度
angle 900 1800 * asin(( x 800 ) *12 /160 /14.5)) / 3.14
Your site here
谢谢!
基于STM32的三自由度机械手臂
LOGO
STM32控制TFTLCD显示摄像
头拍摄到的图片对拍摄到的图

片进行目标提取并定位中心本来自结 构用STM32的定时器三产生 PWM波对机械手臂的转角进 行控制
根据定位的中心并结合位置关 系确定手臂的运动轨迹
Your site here
LOGO
第一部分 用STM32控制TFTLCD显示摄像头拍摄到的图 片
目标中心定位:先对行扫描,找到目标点数 最多的行,同理找到目标点数最多的列,
即为目标中心
Your site here
LOGO
实际拍摄并二值化效果
Your site here
LOGO
第二部分 用STM32产生PWM波对机械手臂转角控制 机械手臂旋转原理
❖ T=20ms, t=0.5ms
T=20ms ,t=0.5ms-2.5ms
由于OV7670的像素时钟频率很高,故不是用 单片机直接抓取的,而是用FIFO暂存数据,方便 LCD缓慢的读取
Your site here
LOGO
对拍摄到的图片进行目标提取并定位中心

基于STM32的机械臂运动控制分析设计说明

基于STM32的机械臂运动控制分析设计说明

机器人测控技术大作业课程设计课程设计名称:基于STM32的机械臂运动控制分析设计专业班级:自动1302学生姓名:张鹏涛学号:201323020219指导教师:曹毅课程设计时间:2016-4-28~2016-5-16目录摘要 (IV)第一章运动模型建立 (V)1.1引言 (V)1.2机器人运动学模型的建立 (V)1.2.1运动学正解 ............................................................... V II 第二章机械臂控制系统的总体方案设计 ............................................... V III2.1机械臂的机械结构设计 ......................................................... V III2.1.1臂部结构设计原则..................................................... V III2.1.2机械臂自由度的确定.................................................... I X2.2机械臂关节控制的总体方案 (X)2.2.1机械臂控制器类型的确定 (X)2.2.2机械臂控制系统结构.................................................... X I2.2.3关节控制系统的控制策略 ............................................. X I 第三章机械臂控制系统硬件设计.......................................................... X II3.1机械臂控制系统概述 ............................................................. X II3.2微处理器选型...................................................................... X III3.3主控制模块设计................................................................... X III3.3.1电源电路 ................................................................. X IV3.3.2复位电路 ................................................................. X IV3.3.3时钟电路 ................................................................. X IV3.3.4 JTAG调试电路......................................................... X V3.4驱动模块设计....................................................................... X V3.5电源模块设计..................................................................... X VII 第四章机械臂控制系统软件设计 (XVIII)4.1初始化模块设计 (XVIII)4.1.1系统时钟控制 (XVIII)4.1.2 SysTick定时器......................................................... X X4.1.3 TIM定时器.............................................................. X XI4.1.4通用输入输出接口GPIO (XXII)4.1.5超声波传感器模块 (XXII)总结 (XXIV)参考文献 (XXV)附录A (XXVI)附录B (XXVII)设计要求:设计一个两连杆机械臂,具体参数自行设计,建立其运动学模型,然后在此基础上完成该机械臂两点间的路径规划,并给出仿真结果。

stm32三自由度机器人c语言程序代码

stm32三自由度机器人c语言程序代码

stm32三自由度机器人c语言程序代码main.c/******************************************************************************** * @file GPIO/IOToggle/main.c* @author MCD Application Team* @version V3.5.0* @date 08-April-2011* @brief Main program body.****************************************************************************** * @attention******************************************************************************* *//* Includes ------------------------------------------------------------------*/#include "stm32f10x.h"#include <stdio.h>#include "main.h"#include "delay.h"#include "DMA.h"#include "TIMx.h"#include "GPIOx.h"#include "NVIC.h"#include "USARTx.h"/* 宏定义 ------------------------------------------------------------------*/#define uchar unsigned char#define uint unsigned int#define Motor1_SUB 16 //电机1 16细分#define Motor2_SUB 16 //电机2 16细分#define Motor3_SUB 16 //电机3 16细分#define Motor1_DIR PAout( 4 ) //电机1 方向#define Motor2_DIR PAout( 5 ) //电机2 方向#define Motor3_DIR PAout( 7 ) //电机3 方向#define Motor1_UP Motor1_DIR = 1 //电机1 上升#define Motor2_UP Motor2_DIR = 1 //电机2 上升#define Motor3_UP Motor3_DIR = 1 //电机3 上升#define Motor1_DOWN Motor1_DIR = 0 //电机1 下降#define Motor2_DOWN Motor2_DIR = 0 //电机2 下降#define Motor3_DOWN Motor3_DIR = 0 //电机3 下降/* 变量定义 ------------------------------------------------------------------*/ u8 Delay_1s_Finishflag = 0;u8 KeyTrg = 0; //按键触发u8 KeyCont = 0; //按键长按uint i;u16 EXIT0_CNT = 0;u8 Motor1_OriginFlag = 0; //电机1 原点标识u8 Motor2_OriginFlag = 0; //电机1 原点标识u8 Motor3_OriginFlag = 0; //电机1 原点标识u8 Motor_Arrived = 0; //电机到达标识/* 函数声明 ------------------------------------------------------------------*/ void RTC_configuration( void );void RCC_Configuration( void );void KeyRead( void );void Delay_Ms( u16 time );void delay_1s( uint time );//================================== MAIN=======================================int main( void ){u16 i = 0;BUZZER = 0;//蜂鸣器复位GPIOE -> ODR &= 0xffff0000; //LED1 ~ LED8 = 0;RCC_Configuration();// RTC_configuration();GPIO_Configuration();NVIC_Configuration();EXTI_Configuration();Motor_Init( 0 0 0 );//TIM1关闭状态不会触发TIM2//屏蔽所有外部中断EXTI -> IMR = 0;if( LS1 ){TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable );Motor1_OriginFlag = 1;}if( LS2 ){TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable );Motor2_OriginFlag = 1;}if( LS3 ){TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable );Motor3_OriginFlag = 1;}Delay_Ms( 1000 );//开启所有外部中断EXTI -> IMR = 0x07;while( !Motor1_OriginFlag | !Motor2_OriginFlag | !Motor3_OriginFlag ){TIM1_TIM2_PWM( 1000 3200 );//让没有回到原位的导轨滑块回到原位用于初始状态的调平基准}//屏蔽所有外部中断EXTI -> IMR = 0;TIM_Cmd( TIM1 DISABLE );//关闭TIM1TIM1 -> CNT = 0;//定时器1 当前计数值清零TIM2 -> CNT = 0;//定时器2 当前计数值清零Delay_Ms( 1000 );Motor1_UP;//电机1 上升Motor2_UP;//电机2 上升Motor3_UP;//电机3 上升TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Enable );//使能 TIM2 -> CH1通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Enable );//使能 TIM2 -> CH2通道PWM输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Enable );//使能 TIM2 -> CH3通道PWM输出TIM_ITConfig( TIM1 TIM_IT_Update ENABLE ); //开启TIM1中断Motor_Arrived = 0;TIM1_TIM2_PWM( 1000 1600 );while( !Motor_Arrived );Motor_Arrived = 0;TIM1_TIM2_PWM( 700 3200 );while( !Motor_Arrived );Motor1_DOWN;//电机1 下降Motor2_DOWN;//电机2 下降Motor3_DOWN;//电机3 下降Motor_Arrived = 0;TIM1_TIM2_PWM( 500 1600 );while( !Motor_Arrived );//==================================== F1=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Enable ); //使能 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;Motor2_UP;//电机2 上升TIM1_TIM2_PWM( 1500 500 );//2#电机上升while( !Motor_Arrived );delay_ms( 2000 );TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Enable ); //使能 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;Motor1_UP;//电机1 上升TIM1_TIM2_PWM( 1500 1500 );//1#电机上升while( !Motor_Arrived );delay_ms( 3000 );//==================================== F2=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Enable ); //使能 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;Motor2_DOWN;//电机2 下降TIM1_TIM2_PWM( 1500 2000 );//2#电机下降while( !Motor_Arrived );delay_ms( 3000 );TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Enable ); //使能 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;Motor3_UP;//电机3 上升TIM1_TIM2_PWM( 1500 1500 );//3#电机上升while( !Motor_Arrived );delay_ms( 3000 );TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Enable ); //使能 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;Motor1_DOWN;//电机1 下降TIM1_TIM2_PWM( 1500 2500 );//1#电机下降while( !Motor_Arrived );delay_ms( 3000 );//=================================== F3=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Enable ); //使能 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;Motor2_UP;//电机2 上升TIM1_TIM2_PWM( 1500 3000 );//2#电机上升while( !Motor_Arrived );delay_ms( 2000 );//==================================== F4=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Enable ); //使能 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;Motor1_UP;//电机1 上升TIM1_TIM2_PWM( 1500 2500 );//1#电机上升while( !Motor_Arrived );delay_ms( 3000 );//==================================== F5=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Enable ); //使能 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;Motor3_UP;//电机3 上升TIM1_TIM2_PWM( 1500 2500 );//3#电机上升while( !Motor_Arrived );delay_ms( 3000 );//==================================== F6=========================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Enable ); //使能 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;Motor2_UP;//电机2 上升TIM1_TIM2_PWM( 1500 3000 );//2#电机上升while( !Motor_Arrived );delay_ms( 2000 );//================================ F7 回原位======================================TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Enable ); //使能 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable ); //关闭 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;TIM1_TIM2_PWM( 1500 3000 );//1#电机上升while( !Motor_Arrived );TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); //关闭 TIM2 -> CH1通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); //关闭 TIM2 -> CH2通道PWM 输出TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Enable ); //使能 TIM2 -> CH3通道PWM 输出Motor_Arrived = 0;Motor3_UP;//电机3 上升TIM1_TIM2_PWM( 1500 500 );//3#电机上升while( !Motor_Arrived );delay_ms( 2000 );for( i = 0; i < 5; ++i ){BUZZER = !BUZZER;delay_ms( 200 );}BUZZER = 0;//蜂鸣器复位while ( 1 ){LED2 = 1;LED3 = 1;LED1 = 1;delay_ms( 1000 );LED1 = 0;delay_ms( 1000 );}}//==========================子程序入口================================= /*** @brief 时钟配置* @param None* @retval None*///外部晶振为8M PLLCLK=SYSCLK=72M HCLK=72M P2CLK=72M P1CLK=36M ADCCLK=36M USBCLK=48M TIMCLK=72Mvoid RCC_Configuration( void ){ErrorStatus HSEStartUpStatus; //定义错误状态枚举变量ERROR SUCCESSRCC_DeInit(); //RCC寄存器重新设置为默认值RCC_HSEConfig( RCC_HSE_ON ); //打开外部高速时钟晶振HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部高速时钟工作if(HSEStartUpStatus == SUCCESS){RCC_HCLKConfig( RCC_SYSCLK_Div1 ); //设置AHB不分频 HCLK = SYSCLKRCC_PCLK2Config( RCC_HCLK_Div1 ); //设置APB2不分频 P2CLK = HCLKRCC_PCLK1Config( RCC_HCLK_Div2 ); //设置APB1为2分频P1CLK = HCLK / 2FLASH_SetLatency( FLASH_Latency_2 ); //设置FLASH代码延时FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable ); //设置预取指缓存RCC_PLLConfig( RCC_PLLSource_HSE_Div1 RCC_PLLMul_9 ); //设置PLL时钟外部时钟不分频为HSE的9倍频8MhZ * 9 = 72MHZRCC_PLLCmd(ENABLE); //使能PLLwhile(RCC_GetFlagStatus( RCC_FLAG_PLLRDY) == RESET ); //等待PLL准备就绪RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK ); //设置PLL为系统时钟源while( RCC_GetSYSCLKSource() != 0x08 ); //判断PLL是否为系统时钟源}}/*** @brief RTC实时时钟配置* @param None* @retval None*/void RTC_configuration( void ){RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWRENABLE); PWR_BackupAccessCmd(ENABLE);BKP_DeInit();RCC_LSEConfig(RCC_LSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();RTC_WaitForLastTask();RTC_SetPrescaler( 32767 );RTC_WaitForLastTask();PWR_BackupAccessCmd(DISABLE);}/*** @brief STM32主板按键查询函数* @param None* @retval None*/void KeyRead( void ){u8 ReadKey_Data; //读取按键输入数据ReadKey_Data = GPIOC -> IDR ^ 0x0f;KeyTrg = ReadKey_Data & ( ReadKey_Data ^ KeyCont );KeyCont = ReadKey_Data;}/*** @brief 软件延时函数* @param None* @retval None*/void Delay_Ms( u16 time ) //延时1ms函数{u16 ij;for( i = 0; i < time; i++ )for( j = 10000; j > 0; j-- );}/*** @brief TIM4 精确延时* @param None* @retval None*/void delay_1s( uint time ) //延时1s函数{uint i;for( i = 0; i < time; i++ ){TIM_Cmd( TIM4 ENABLE ); //开启定时器TIM4while( !Delay_1s_Finishflag );Delay_1s_Finishflag = 0;}}/******************************************************************************** * @file GPIO/IOToggle/stm32f10x_it.c* @author MCD Application Team* @version V3.5.0* @date 08-April-2011* @brief Main Interrupt Service Routines.* This file provides template for all exceptions handler and peripherals* interrupt service routine.****************************************************************************** * @attention** THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE* TIME. AS A RESULT STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY* DIRECT INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.** <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>****************************************************************************** *//* Includes ------------------------------------------------------------------*/#include "stm32f10x_it.h"#include "main.h"#include "dma.h"#include "GPIOx.h"/* 宏定义 -------------------------------------------------------------------*///=================================MAIN中定义====================================extern u16 EXIT0_CNT;extern u8 Motor1_OriginFlag; //电机1 原点标识extern u8 Motor2_OriginFlag; //电机1 原点标识extern u8 Motor3_OriginFlag; //电机1 原点标识extern u8 Motor_Arrived; //电机到达标识// -------------------------------- SENSOR USE---------------------------------extern u8 Delay_1s_Finishflag;extern void Delay_Ms( u16 time );//=================================MAIN中定义====================================//******************************************************************************* /** @addtogroup STM32F10x_StdPeriph_Examples* @{*//** @addtogroup GPIO_IOToggle* @{*//* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*//* Private function prototypes -----------------------------------------------*//* Private functions ---------------------------------------------------------*//******************************************************************************/ /* Cortex-M3 Processor Exceptions Handlers *//******************************************************************************/ /*** @brief This function handles NMI exception.* @param None* @retval None*/void NMI_Handler(void){}/*** @brief This function handles Hard Fault exception.* @param None* @retval None*/void HardFault_Handler(void){/* Go to infinite loop when Hard Fault exception occurs */while (1){}}/*** @brief This function handles Memory Manage exception.* @param None* @retval None*/void MemManage_Handler(void){/* Go to infinite loop when Memory Manage exception occurs */while (1){}}/*** @brief This function handles Bus Fault exception.* @param None* @retval None*/void BusFault_Handler(void){/* Go to infinite loop when Bus Fault exception occurs */ while (1){}}/*** @brief This function handles Usage Fault exception.* @param None* @retval None*/void UsageFault_Handler(void){/* Go to infinite loop when Usage Fault exception occurs */ while (1){}}/*** @brief This function handles SVCall exception.* @param None* @retval None*/void SVC_Handler(void){}/*** @brief This function handles Debug Monitor exception. * @param None* @retval None*/void DebugMon_Handler(void){}/*** @brief This function handles PendSV_Handler exception.* @param None* @retval None*/void PendSV_Handler(void){}/*** @brief This function handles SysTick Handler.* @param None* @retval None*/void SysTick_Handler(void){}/*** @brief This function handles TIM4 global interrupt request.* @param None* @retval None*/void TIM4_IRQHandler( void ){if( TIM_GetITStatus( TIM4 TIM_IT_Update ) != RESET ){TIM_Cmd( TIM4 DISABLE ); //关闭定时器TIM4TIM_ClearITPendingBit( TIM4 TIM_FLAG_Update ); //清除TIM4中断待处理位 Delay_1s_Finishflag = 1; //延时1s完成标志}}/************************************************************ 函数名:TIM3_IRQHandler** 功能描述:TIM3中断服务程序** 输入参数: 无** 输出参数: 无***********************************************************/void TIM3_IRQHandler( void ){}/*** @brief This function handles TIM2 global interrupt request.* @param None* @retval None*/void TIM2_IRQHandler( void ){}/*** @brief This function handles TIM4 global interrupt request.* @param None* @retval None*/void TIM1_UP_IRQHandler( void ){if( TIM_GetITStatus( TIM1 TIM_IT_Update ) != RESET ){TIM_ClearITPendingBit( TIM1 TIM_IT_Update ); //清除TIM1中断待处理位 TIM_Cmd( TIM1 DISABLE ); //关闭定时器TIM1Motor_Arrived = 1; //电机定位完成LED8 = !LED8;}}/*** @brief This function handles USART3 global interrupt request.* @param None* @retval None*/void USART1_IRQHandler( void ){GPIO_SetBits( GPIOC GPIO_Pin_4 );Delay_Ms( 1000 );USART_ClearFlag( USART1 USART_FLAG_RXNE );USART_ClearITPendingBit( USART1 USART_FLAG_RXNE );}/*** @brief DMA1 -> CH7 USART2发送数据完成DMA中断入口* @param None* @retval None*/void DMA1_Channel7_IRQHandler( void ){LED2 = 1;if( DMA_GetFlagStatus( DMA1_FLAG_TC7 ) != RESET ){LumMod_Uart_DAM_Tx_Over();}}/*** @brief This function handles USART3 global interrupt request.* @param None* @retval None*/void USART3_IRQHandler( void ){}/*** @brief DMA1 -> CH6 USART2接收数据完成DMA中断入口* @param None* @retval None*/void USART2_IRQHandler( void ){LED3 = 1;if( USART_GetITStatus( USART2 USART_IT_IDLE ) != RESET ) // 空闲中断 {LumMod_Uart_DMA_Rx_Data();USART_ReceiveData( USART2 ); // Clear IDLE interrupt flag bit}}/*** @brief This function handles EXTI0 global interrupt request.* @param None* @retval None*/void EXTI0_IRQHandler( void ){if( EXTI_GetITStatus( EXTI_Line0 ) != RESET ){delay_ms( 10 );//延时防止抖动if( LS1 == 1 ){LED5 = !LED5;}while( !LS1 );TIM_CCxCmd( TIM2 TIM_Channel_1 TIM_CCx_Disable ); Motor1_OriginFlag = 1;//电机1 到达原点EXTI_ClearITPendingBit( EXTI_Line0 );EXTI -> IMR = 0x06;//关闭外部中断0}}/*** @brief This function handles EXTI1 global interrupt request. * @param None* @retval None*/void EXTI1_IRQHandler( void ){if( EXTI_GetITStatus( EXTI_Line1 ) != RESET ){delay_ms( 10 );//延时防止抖动if( LS2 == 1 ){LED6 = !LED6;}while( !LS2 );TIM_CCxCmd( TIM2 TIM_Channel_2 TIM_CCx_Disable ); Motor2_OriginFlag = 1;//电机2 到达原点EXTI_ClearITPendingBit( EXTI_Line1 );EXTI -> IMR = 0x05;//关闭外部中断1}}/*** @brief This function handles EXTI2 global interrupt request. * @param None* @retval None*/void EXTI2_IRQHandler( void ){if( EXTI_GetITStatus( EXTI_Line2 ) != RESET ){delay_ms( 10 );//延时防止抖动if( LS3 == 1 ){LED7 = !LED7;}while( !LS3 );TIM_CCxCmd( TIM2 TIM_Channel_3 TIM_CCx_Disable );Motor3_OriginFlag = 1;//电机3 到达原点EXTI_ClearITPendingBit( EXTI_Line2 );EXTI -> IMR = 0x03;//关闭外部中断2}}/******************************************************************************/ /* STM32F10x Peripherals Interrupt Handlers *//* Add here the Interrupt Handler for the used peripheral(s) (PPP) for the *//* available peripheral interrupt handler's name please refer to the startup *//* file (startup_stm32f10x_xx.s). *//******************************************************************************/ /*** @brief This function handles PPP interrupt request.* @param None* @retval None*//*void PPP_IRQHandler(void){}*//*** @}*//*** @}*//******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/ /******************************************************************************** * @file 传感器模块测试程序/LCD12864/LCD12864_main.c* @author dotod* @version V1.0* @date 10-DEC-2017* @brief Main program body.****************************************************************************** * @attention printf() 输出打印函数******************************************************************************* */#include "printf.h"/******************************************************************************* * Function Name : fputc* Descxxxxription : 重定向printf() 函数* Input :* Output : None* Return : None*******************************************************************************/ int fputc( int ch FILE *f ){USART2 -> SR; //USART_GetFlagStatus( USART1 USART_FLAG_TC ) 解决第一个字符发送失败的问题USART_SendData( USART2 ( unsigned char ) ch ); //顺序发送字符while( USART_GetFlagStatus( USART2 USART_FLAG_TC )!= SET ); //等待发送完成return( ch );}/******************************************************************************* * Function Name : fgetc* Descxxxxription : 重定向scanf() 函数* Input :* Output : None* Return : None*******************************************************************************/ int fgetc( FILE *f ){while ( USART_GetFlagStatus( USART3 USART_FLAG_RXNE ) == RESET ); //等待串口1输入数据return (int)USART_ReceiveData( USART3 );}/********************************************************************************* @file 传感器模块测试程序/delay();* @author dotod* @version V1.0* @date 10-DEC-2017* @brief Main program body.****************************************************************************** * @attention* SYSTICK 非中断方式实现精确延时 SYSTICK时钟固定为HCLK的时钟1/8* 选用内部时钟源72M 所以SYSTICK的时钟为9M 即SYSTICK定时器以9M的频率递减* SysTick 主要包括CTRL LOAD VAL CALIB 4个寄存器******************************************************************************** *//* Includes ------------------------------------------------------------------*/#include "delay.h"/*** @brief 实现us精确延时* @param None* @retval None*/void delay_us( u32 nus ){u32 temp;SysTick -> LOAD = 9 * nus;SysTick -> VAL = 0X00;//清空计数器SysTick -> CTRL = 0X01;//使能减到零是无动作采用外部时钟源do{temp = SysTick -> CTRL;//读取当前倒计数值}while( ( temp & 0x01 ) && ( ! ( temp & ( 1 << 16 ) ) ) );//等待时间到达SysTick -> CTRL = 0x00; //关闭计数器SysTick -> VAL = 0X00; //清空计数器}/*** @brief 实现ms精确延时* @param None* @retval None*/void delay_ms( u16 nms ){u32 temp;SysTick -> LOAD = 9000 * nms;SysTick -> VAL = 0X00;//清空计数器SysTick -> CTRL = 0X01;//使能减到零是无动作采用外部时钟源do{temp=SysTick -> CTRL;////读取当前倒计数值}while( ( temp & 0x01 ) && ( !( temp & ( 1 << 16 ) ) ) );//等待时间到达SysTick -> CTRL = 0x00; //关闭计数器SysTick -> VAL = 0X00; //清空计数器}/******************************************************************************** * @file 传感器模块测试程序* @author dotod* @version V1.0* @date 10-DEC-2017* @brief****************************************************************************** * @attention******************************************************************************* *//* Includes ------------------------------------------------------------------*/#include "DMA.h"#include <stdio.h>#include <string.h>/* 变量定义 ------------------------------------------------------------------*/u8 LumMod_Tx_Buf[ 20 ];u8 LumMod_Rx_Buf[ 20 ];uint LumMod_Rx_Data_index = 0;uint LUMMOD_TX_BSIZE = 0;uint LUMMOD_RX_BSIZE = 0;/*** @brief USART_DMA_Init USART1 DMA通道配置* @param None* @retval None*/void USART_DMA_Init( void ){DMA_InitTypeDef DMA_InitStructure;/* DMA1 clock enable */RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1 ENABLE ); //开启DMA1时钟/*--- LUMMOD_UART_Tx_DMA_Channel DMA Config ---*/DMA_Cmd( DMA1_Channel7 DISABLE ); // 关闭DMA通道7DMA_DeInit( DMA1_Channel7 ); // 恢复DMA通道配置缺省值DMA_InitStructure.DMA_PeripheralbaxxxxseAddr = ( uint32_t )( &USART2 -> DR );// 设置串口发送数据寄存器地址DMA_InitStructure.DMA_MemorybaxxxxseAddr = ( uint32_t )LumMod_Tx_Buf; // 设置发送数据缓冲区首地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 设置数据传输方向双向传输内存缓冲区 -> 外设寄存器DMA_InitStructure.DMA_BufferSize = LUMMOD_TX_BSIZE; // 需要发送的字节数这里可以设置为0 实际要发送数据时会重新设置次值DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 设置外设递增模式因为该通道只连接一个外设所以不需要递增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 设置DMA内存缓冲区地址递增模式DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据宽度为8位 1个字节DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据宽度为8位 1个字节DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 设置DMA传输方式单次传输模式DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; // 优先级设为很高DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 关闭内存到内存的DMA方式DMA_Init( DMA1_Channel7 &DMA_InitStructure );// DMA通道初始化DMA_ClearFlag( DMA1_FLAG_GL7 ); // 清除DMA所有标志DMA_Cmd( DMA1_Channel7 DISABLE ); // 失能DMADMA_ITConfig( DMA1_Channel7 DMA_IT_TC ENABLE ); // 开启发送DMA中断/*--- LUMMOD_UART_Rx_DMA_Channel DMA Config ---*/DMA_Cmd( DMA1_Channel6 DISABLE ); // 关闭DMA通道6DMA_DeInit( DMA1_Channel6 ); // 恢复DMA通道配置缺省值DMA_InitStructure.DMA_PeripheralbaxxxxseAddr = LUMMOD_UART_DR_baxxxxse; // 设置串口接收数据寄存器地址DMA_InitStructure.DMA_MemorybaxxxxseAddr = ( uint32_t )LumMod_Rx_Buf; //设置接收数据缓冲区首地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 设置数据传输方向双向传输外设寄存器 -> 内存缓冲区DMA_InitStructure.DMA_BufferSize = LUMMOD_RX_BSIZE; // 设置最大接收字节数DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 设置外设递增模式因为该通道只连接一个外设所以不需要递增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 设置DMA内存缓冲区地址递增模式DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据宽度为8位 1个字节DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据宽度为8位 1个字节DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 设置DMA传输方式单次传输模式DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; // 优先级设为很高DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 关闭内存到内存的DMA方式DMA_Init( DMA1_Channel6 &DMA_InitStructure ); //DMA通道初始化DMA_ClearFlag( DMA1_FLAG_GL6 ); // 清除DMA所有标志DMA_Cmd( DMA1_Channel6 ENABLE ); // 开启DAM接收通道等待接收数据}/*** @brief DMA1 -> CH7 USART2发送数据完成DMA中断处理* @param None* @retval None*/void LumMod_Uart_DAM_Tx_Over( void ){DMA_ClearFlag( DMA1_FLAG_GL7 ); // 清除标志位DMA_Cmd( DMA1_Channel7 DISABLE ); // 关闭DMA通道DMA1_Channel7 -> CNDTR = 0; // 清除数据长度// OSMboxPost( mbLumModule_Tx ( void * ) 1 ); // 设置标志位}/*** @brief USART2要发送数据处理* @param None* @retval None*/u16 LumMod_Cmd_WriteParam( u16 sample_num u8 *psz_param ){// uint err;uint LumMod_Tx_Index ;if( !sample_num ) //判断数据长度是否有效return 0;while ( DMA_GetCurrDataCounter( DMA1_Channel7 ) );//检查DMA通道内是否还有数据 if( psz_param )memcpy( LumMod_Tx_Buf psz_param ( sample_num > 1024 ? 1024 : sample_num ) ); LumMod_Tx_Index = 0;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 1;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 2;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 3;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 4;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 5;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 6;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 7;LumMod_Tx_Buf[ LumMod_Tx_Index++ ] = 8;LumMod_Uart_Start_DMA_Tx( LumMod_Tx_Index );// OSMboxPend( mbLumModule_Tx 0 &err );return sample_num;}/*** @brief USART1要发送数据字节数目高速DMA并开启DMA传输* @param None* @retval None*/void LumMod_Uart_Start_DMA_Tx ( uint16_t size ){DMA1_Channel7 -> CNDTR = ( uint16_t )size; // 设置要发送的字节数目DMA_Cmd( DMA1_Channel7 ENABLE ); // 开启DMA发送}。

STM32的医疗康复机器人手臂控制系统

STM32的医疗康复机器人手臂控制系统

STM32的医疗康复机器人手臂控制系统郭志阳;陈学英【摘要】医疗康复机器人是近年出现的一种新型机器人,主要功能是帮助患者完成各种运动功能恢复训练.为此提出通过STM32微控制器控制无刷直流电机来控制机器手臂的运转,并通过Simulink建立PID模型,运用XPC_Target和控制板进行通信,以此得到电机在调速过程中合适的PID参数,使机器手臂在运转的过程中更加平滑.实际的临床试验操作证明,该系统能够较好地完成手臂的医疗康复训练.【期刊名称】《单片机与嵌入式系统应用》【年(卷),期】2015(015)012【总页数】4页(P66-69)【关键词】医疗康复机器人手臂;STM32;PID;Simulink;IR2130【作者】郭志阳;陈学英【作者单位】电子科技大学电子工程学院,成都610054;电子科技大学电子工程学院,成都610054【正文语种】中文【中图分类】TP332随着我国逐渐步入老年社会,对各类康复设备的需求日益增大,对性价比高的医疗康复设备控制系统的需求尤为迫切。

基于DSP芯片的成本相对较高、设计复杂、研发周期长,芯片的尺寸会导致印刷电路板的体积变大。

本文基于STM32微控制器设计的医疗康复机器人手臂控制系统,具有杰出的功耗控制和电机控制的高级定时器,能产生3对可配置并互补输出的PWM信号。

通过在Simulink上建立双闭环PID算法模型,得到合适的PID参数来改变PWM波的占空比,进而精确地实现电机的调速,保证了机器人手臂运行轨迹平滑,运行速度稳定。

由于无刷直流电机[1]具有体积小、性能稳定等优点,其机器手臂尺寸能够更加符合人体运动学设计理念[4]。

医疗康复机器人手臂可以模拟日常生活中手臂的一些动作,通过创造虚拟工作环境实现对手臂各个关节的运动训练、肌肉的锻炼,以及神经功能的恢复训练。

以STM32微控制器为控制核心,机器手臂控制总体设计方案如图1所示。

通过运用IR2130栅极驱动芯片,对STM32输出的6路PWM信号进行特殊处理,满足H桥中IRF3808高功率MOS管工作的需求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于STM32的三自由度机械手臂
LOGO
基 本 结 构
STM32控制TFTLCD显示摄像 头拍摄到的图片对拍摄到的图 片进行目标提取并定位中心 用STM32的定时器三产生 PWM波对机械手臂的转角进 site here
LOGO
第一部分 用STM32控制TFTLCD显示摄像头拍摄到的图 片 STM32
Your site here
LOGO
TFT-LCD即薄膜晶体管液晶显示器
1,2.4 ’/2.8/3.5 ’3种大小的屏幕可选。 2,320 ×240 的分辨率 3,16 位真彩显示。 4,自带触摸屏,可以用来作为控制输
Your site here
LOGO
OV7670
该图像传感 器体积小、工作电压低,提供单片 器体积小、工作电压低,提供单片 VGA 摄像头和 影处理器的所有功能。通过 SCCB 总线控 ,可以 输出整帧、子采样、取窗口等方式的各种分辨率 8 位影像数据 由于OV7670的像素时钟频率很高,故不是用 单片机直接抓取的,而是用FIFO暂存数据,方便 LCD缓慢的读取
LOGO
实际拍摄并二值化效果
Your site here
LOGO
第二部分 用STM32产生PWM波对机械手臂转角控制
机械手臂旋转原理
T=20ms, t=0.5ms T=20ms ,t=0.5ms-2.5ms 即脉冲占空比为2.5%-12.5%对应旋转角度
0
0
-185
0
Your site here
Your site here
LOGO
对拍摄到的图片进行目标提取并定位中心
先将彩色图像变为二值图像,便于处理定位
再将图像缩小成原来的四分之一,建立一 个矩阵将这些数据储存,相当于储存了一 个二维图像矩阵
目标中心定位:先对行扫描,找到目标点数 最多的行,同理找到目标点数最多的列, 即为目标中心
Your site here
0 0 0
Your site here
谢谢!
LOGO
STM32的定时器三介绍 STM32定时器资源比较丰富, TIME1 和 TIME8 (能同时各产生7路的 PWM波)等高级定时器
TIME2~TIME5(能同时各产生4路的 PWM波)等通用定时器
TIME6 和 TIME7 T 等基本定时器。 此次用的是TIME3的通道1、2和4,用以 产生3路PWM波,控制机械手臂的三个电 机
Your site here
LOGO
第三部分 根据定位的中心并结合位置关系确定手臂的运动轨 迹 检测到的位置与实际位置的映射关系
LCD上的位置坐标
映射到实际位置
根据实际情况进行测量,计算机械手臂需 旋转的角度
angle 90 180 * a sin(( x 80 ) *12 / 160 / 14.5)) / 3.14
相关文档
最新文档