学位论文基于stm32的舵机控制系统设计.docx
《学位论文基于stm32的舵机控制系统设计.docx》由会员分享,可在线阅读,更多相关《学位论文基于stm32的舵机控制系统设计.docx(43页珍藏版)》请在冰豆网上搜索。
![学位论文基于stm32的舵机控制系统设计.docx](https://file1.bdocx.com/fileroot1/2023-2/6/04ebaeab-060a-4f42-8777-4d9f049dd936/04ebaeab-060a-4f42-8777-4d9f049dd9361.gif)
学位论文基于stm32的舵机控制系统设计
基于STM32的舵机控制系统
院系
北方科技学院
专业
自动化
班级
B641301
学号
B64130116
姓名
李国军
指导教师
张庆新
负责教师
张庆新
沈阳航空航天大学
2010年6月
摘要
随着越来越多的高科技产品逐渐融入了日常生活中,舵机的控制系统发生了巨大的变化。
单片机、C语言等前沿学科的技术的日趋成熟与实用化,使得舵机的控制系统有了新的的研究方向与意义。
本文描述了一个由STM32微处理器、舵机、LCD显示器、键盘等模块构成的,提供基于STM32的PWM信号舵机的控制系统。
该系统采用STM32微处理器为核心,在MDK的环境下进行编程,根据键盘的输入,使STM32产生周期性PWM信号,用此信号对舵机的速度及转角进行控制,并且通过LCD显示出数据。
结果表明该系统具有结构简单、工作可靠、精度高等特点.
关键词:
STM32微处理器;舵机系统;LCD显示;PWM信号
Abstract
Aswellasthehigh-techproductsgraduallyintegratedintothedailylife,servocontrolsystemhasundergonetremendouschanges.SCMandClanguageofthefrontierdisciplinessuchmaturetechnologyandpractical,Makesteeringcontrolsystemisanewresearchdirectionandmeaning.ThispaperdescribesaSTM32microprocessors,steering,LCDdisplayandkeyboard,etc.BasedontheSTM32servocontrolsystemofPWMsignal,ThissystemusesSTM32microprocessorasthecore,MDKintheenvironment,accordingtothekeyboardinputprogramming,STM32produceperiodicPWMsignal,withthissignaltothevelocityandAngleofsteeringgearcontrol,andthroughtheLCDdisplaydata.Thefeaturesofthesimplehardware,stableoperationandhighprecisionareincarnatedintheproposedsystem.
Keywords:
STM32microprocessors;Steeringsystem;LCDdisplay;pulsewidthmodulationsignal
第1章绪论
舵机(servomotor),又名伺服电机,主要是由外壳、电路板、马达、减速齿轮和电位器构成。
舵机主要适用于那些需要角度不断变化并可以保持的控制系统,比如人形机器人的手臂和腿,车模和航模的方向控制。
舵机的基本工作原理是发一个控制信号给舵机,经电路板判断转动方向,再驱动马达开始转动,透过减速齿轮将动力传至摆臂,同时由电位器检测送回讯号,判断是否已经到达指定位置。
早期在模型上使用最多,主要控制模型的舵面,所以俗称舵机。
舵机接收一个简单的控制命令就可以自动的转动到一个比较精确的角度,仿人型机器人就是舵机应用的最高境界。
随着工业的发展,舵机应用到那些需要角度不断变化并可以保持的控制系统,目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。
1.1课题背景
舵机最早出现在航空模型中,飞机的飞行姿态是通过调节发动机和各个控制舵面来实现的。
以简单的四通飞机来说,遥控器有四个通道,分别对应四个舵机,而舵机又通过连杆等传动元件带动舵面的转动,从而改变飞机的运动状态。
舵机因此得名:
控制舵面的伺服电机。
不仅在航模飞机中,在其他的模型运动中都可以看到它的应用:
船模上用来控制尾舵,车模中用来转向等等。
目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍,由此可见,凡是需要操作性动作时都可以用舵机来实现,随着舵机的应用越来越广泛,对舵机的精确控制要求也越来越高,因此一个好的舵机控制系统使舵机的控制精确会达到一个新的高度,让舵机达到理想的工作状态。
STM32系列32位闪存微控制器基于突破性的ARMCortex-M3内核,这是一款专为嵌入式应用而开发的内核。
STM32系列产品得益于Cortex-M3在架构上进行的多项改进,包括提升性能的同时又提高了代码密度的Thumb-2指令集,大幅度提高的中断响应,而且所有新功能都同时具有业界最优的功耗水平。
STM32F系列产品的目的是为MCU用户提供新的自由度。
它提供了一个完整的32位产品系列,在结合了高性能、低功耗和低电压特性的同时保持了高度的集成性能和简易的开发特性.它的优点有以下几个方面:
搭载ARM公司最新的、具有先进架构的Cortex-M3内核,出色的实时性能,优越的功效高级的、创新型外设,最大的集成性易于开发,加速了面市时间整个产品系列具有脚到脚、外设和软件的高度兼容性,为您提供最大的灵活性。
1.2课题的研究展望
舵机是随着生产发展而产生和发展的,而舵机的发展反过来又促进社会生产力的不断提高。
以前,舵机的发展过程是由诞生到在工业上初步应用、各种舵机建立和发展。
在进入计算机和自动化时代的今天,不仅对舵机提出了诸多性能良好、运行可靠、单位容量的重量轻、体积小等方面越来越多的要求,而且随着自动控制系统的计算装置的发展,在舵机转动的理论基础上,发展出多种高精度、快响应的控制舵机。
与此同时,电力电子学等学科的渗透使舵机这一较为成熟的学科得到新的发展。
当前科学技术突飞猛进,因此舵机正向多用途、多品种方向发展,向高精度和高稳定的方向发展。
在应用上,由于计算机技术迅速发展,将会出现由机器人工作的无人工厂,以计算机作为这些工厂的“中枢神经”,使实现无人化成为可能。
在这种时代里,某些特种舵机必须具有快速响应、高精度运动、快速启动和停止等使机器人比人的手脚更复杂而精巧的运动。
理论上,在舵机中应用了控制技术,使舵机具有更好的特性,因此舵机控制系统成为控制一些重要元件的重要的部分。
基于STM32的舵机控制系统会越来越多的应用在精度要求高的舵机系统中,舵机的控制将与其他的元件结合,功能越来越强大,使得舵机的作用也会越来越大。
课题任务及要求
本次设计的基于STM32的舵机控制系统是以STM32微处理器为核心,在MDK的环境下进行C语言的编程,编写键盘、ADC、显示的子程序,设计键盘中的某个按键,当按下该按键时,通过STM32产生PWM信号,该信号为舵机控制信号,控制多路舵机,实现可通过按键控制舵机的旋转角度和速度等有效准确的控制,并将其状态通过TFT彩色LCD显示,毕设方案:
1、熟悉科研课题的环境及毕业设计的具体要求;
2、阅读主要参考文献,收集有关资料;
3、学习STM32处理器;
4、学习舵机控制的技术资料;
5、学习基于固件库的程序开发方法;
6、掌握MDK编程环境的C语言开发平台;
7、完成论文。
1.3课题内容及安排
本文对基于STM32的舵机控制系统设计进行了详细的介绍,共分五章。
第1章简要介绍了整个课题的研究背景、目的、意义及整个任务的要求安排;第2章是针对此次课题的任务进行方案论证,尤其重要的对STM32微处理器其32位的处理能力及内嵌的语音对本设计的影响进行详细的阐述;第3章具体介绍了整个控制系统的硬件设计,包括键盘输入模块电路,转接板电路,显示电路的设计;第4章阐述了舵机控制系统的软件设计,包括STM32初始化子程序,数据处理子程序,显示子程序的设计。
第5章是针对硬件调试、软件调试和整机连调的结果进行了具体的分析和说明。
第2章硬件设计
硬件是整个基于STM32技术的舵机控制系统设计的基础,怎样选择合适的器件来组成整个硬件电路十分关键,也是本章叙述的重点。
除此之外,以下部分还会分别阐述本设计运用到的各个模块的特性和原理,以及它们所能实现的功能。
2.1STM32微处理单元
本设计的舵机控制系统需要STM32处理器,STM32微处理器完成键盘输入量对舵机的控制,并且通过LCD显示舵机的转动角度,作为舵机的主控制器,实现对舵机稳定和精确的控制。
作为微型移动机器人上的主控制器,需要处理的数据和事件比较多,因此需要一款功能强大的处理器——STM32这款32位的微处理器正是最佳的选择。
下面将着重介绍STM32的强大的功能以及本设计所用到的STM32中的SPI通讯的部分的工作原理。
STM32的突出的功能包括以下几点:
1.性能强劲。
在相同的主频下能做处理更多的任务,全力支持劲爆的程序设计。
2.功耗低。
延长了电池的寿命——这简直就是便携式设备的命门(如无线网络应用)。
3.实时性好。
采用了很前卫甚至革命性的设计理念,使它能极速地响应中断,而且响应中断所需的周期数是确定的。
4.代码密度得到很大改善。
一方面力挺大型应用程序,另一方面为低成本设计而省吃俭用。
5.使用更方便。
现在从8位/16位处理器转到32位处理器之风刮得越来越猛,更简单的编程模型和更透彻的调试系统,为与时俱进的人们大大减负。
6.低成本的整体解决方案。
让32位系统比和8位/16位的还便宜,低端的Cortex‐M3单片机甚至还卖不到1美元。
7.遍地开花的优秀开发工具。
免费的,便宜的,全能的,要什么有什么。
正是基于以上这么多的优点,使得STM32成为本设计中微型移动机器人上的主处理器的最佳选择。
下图2.1为STM32的系统结构图
图2.1STM32系统结构图
高级控制定时器由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。
它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较,PWM,嵌入死区时间的互补PWM……)。
使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。
高级控制(TIM1)和通用(TIMx)定时器是完全独立的,它们不共享任何资源
TIM1定时器的功能包括:
1.16位上,下,上/下自动装载计数器
2.16位可编程预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
3.4个独立通道:
输入捕获,输出比较,PWM生成(边缘或中间对齐模式),单脉冲模式输出,死区时间可编程的互补输出
4.使用外部信号控制定时器和定时器互连的同步电路
5.在指定数目的计数器周期之后更新定时器寄存器
6.刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态
7.如下事件发生时产生中断/DMA:
(1)更新:
计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
(2)触发事件(计数器启动,停止,初始化或者由内部/外部触发计数)
(3)输入捕获─输出比较─刹车信号输入
高级定时器TIM的框图如下,
图2.2定时器TIM的框图
2.2舵机
图2.3舵机实物图
舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统 。
舵机都有外接三根线,分别用棕、红、橙三种颜色进行区分,棕色为接地线,红色为电源正极线,橙色为信号线。
电源线和地线用于提供舵机内部的直流电机和控制线路所需的能源.电压通常介于4~6V,一般取5V
图2.4舵机的接线图
其工作原理是:
控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。
它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。
最后,电压差的正负输出到电机驱动芯片决定电机的正反转。
当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。
以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms---------—90度;
1.0ms---------—45度;
1.5ms--------------0度;
2.0ms------------45度;
2.5ms------------90度;
舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms之间,但是,事实上脉宽可由0.5ms到2.5ms之间,脉宽和舵机的转角0°~180°相对应。
有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋转的角度也会有所不同。
控制说明:
舵机的响应时间对于控制非常重要,一方面可以通过修改PWM周期获得。
另一方面也可以通过机械方式,利用舵机的输出转距余量,将角度进行放大,加快舵机响应速度;
2.3LCD显示器
LCD显示器是本课设的主要器件,当键盘的输入量经过STM32微处理器进行数据的处理,由模拟量转换成数据量,传给LCD进行显示数据。
LCD模块的连接有两种方法:
直接控制和间接控制。
直接控制实际指的是LCD模块的总线接口直接与MCU端口连接,然后MCU通过程序控制端口来模拟LCD的总线时序来完成对其的控制操作;而间接控制指的是MCU本身就有外部总线拉出,与LCD的总线接口对应的连接上,程序中直接操作总线以控制LCD。
考虑到电路设计的简洁性及灵活性,本系统采用PWM信号点亮LCD的方式,硬件电路图如下,
图2.5PWM信号点亮LCD硬件电路
2.4时钟电路的制作
STM32工作时,是在统一的时钟脉冲控制下一拍一拍的进行的,这个脉冲是由STM32控制器中的时序电路发出的,STM32的时序就是CPU在执行指令时所需控制信号的时间顺序。
为了保证各部件间的同步工作,STM32内部电路就在唯一的时钟信号控制下严格的按时序进行工作。
要给单片机提供时序要有相关的硬件电路,即振荡器和时钟电路。
常用的时钟电路设计有两种方式,一种是内部时钟方式,另一种是外部时钟电路方式。
本系统采用了内部时钟方式,利用STM32内部的振荡器,然后在引脚OSC-IN和OSC-OUT两端跨接晶体,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路,如图2.6所示。
图2.6STM32内部时钟方式电路
外接晶振时,C1和C2值选择为27pF,C1,C2对频率有微调作用,晶体振荡频率为12MHz。
在实际连接中,为了减少寄生电容,更好地保证振荡器稳定、可靠地工作,振荡器和电容应尽可能安装得与单片机芯片靠近。
第3章软件设计
3.1STM32固件库简介
STM32的函数库是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。
该函数库还包括每一个外设的驱动描述和应用实例。
通过使用本固件函数库,无需深入掌握细节,用户也可以轻松应用每一个外设。
因此,使用本固态函数库可以大大减少用户的程序编写时间,进而降低开发成本。
每个外设驱动都由一组函数组成,这组函数覆盖了该外设所有功能。
每个器件的开发都由一个通用API(applicationprogramminginterface应用编程界面)驱动,API对该驱动程序的结构,函数和参数名称都进行了标准化。
所有的驱动源代码都符合“StrictANSI-C”标准(项目于范例文件符合扩充ANSI-C标准)。
驱动源代码已经文档化,他们同时兼容MISRA-C2004标准(根据需要,我们可以提供兼容矩阵)。
由于整个固态函数库按照“StrictANSI-C”标准编写,它不受不同开发环境的影响。
仅对话启动文件取决于开发环境。
该固态函数库通过校验所有库函数的输入值来实现实时错误检测。
该动态校验提高了软件的鲁棒性。
实时检测适合于用户应用程序的开发和调试。
但这会增加了成本,可以在最终应用程序代码中移去,以优化代码大小和执行速度。
因为该固件库是通用的,并且包括了所有外设的功能,所以应用程序代码的大小和执行速度可能不是最优的。
对大多数应用程序来说,用户可以直接使用之,对于那些在代码大小和执行速度方面有严格要求的应用程序,该固件库驱动程序可以作为如何设置外设的一份参考资料,根据实际需求对其进行调整。
本设计即是利用STM32中的固件库为基础而编写的,直接调用现成的外设驱动函数使得主程序变的更加简洁,可读性比较高。
本设计中用到的固件库函数主要有时钟初始化相关的固件库函数、I/O口初始化相关的固件库函数和SPI总线接口相关的固件库函数。
3.2软件的总体设计
本设计的程序编辑完成后放在项目的主程序中是在其中的一个时间片执行的,也就是说主程序周期性的采集所输入的模拟值。
在本设计中由于要保证程序的连续的运行,所以要持续的对输入量进行采集,也就是说本设计中的各个初始化工作完成之后程序会死循环在通讯子程序里面,从而连续不断的采集控制的模拟值。
设计原程序时采用模块化的思想,将程序划分为几块,这样做即使得程序结构清晰、增强可读性,又使得程序在调试的时候可以单独对每个子程序分别调试,减少了程序调试的时间。
本设计的源程序主要分为以下几个部分:
时钟初始化子程序,GIPO初始化子程序,嵌套向量中断控制器(NVIC)初始化子程序和A/D转换子程序。
软件的总体流程图如下图3.1所示。
图3.1软件总体流程图
3.3时钟初始化子程序
系统时钟SYSCLK可以选择三种类型的时钟提供:
HSE、HIS和PLLCLK,其中HSE为外部高速时钟,可以由外部晶振电路提供,晶振电路分别接到SOC_IN和SOC_OUT即可,而HSI时钟信号由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入,由于外部时钟源工作稳定而且时钟频率精确,所以本设计采用外部时钟源作为系统的时钟。
STM32的系统时钟可以有内部的振荡器提供,也可以由外部的由晶振构成是振荡电路提供时钟,本设计中采用外部振荡电路为STM32提供稳定的时钟脉冲。
由于STM32中的包含的大部分外设是在连续的时钟脉冲下才能正常工作,所以STM32中存在一些分频器和倍频器,这些分频器或倍频器将系统时钟进行分频或者倍频用来为相应的外设提供合适的时钟信号,下图3.2为STM32时钟树。
图3.2STM32时钟树
本设计所需的STM32的外设包括TIM2、TIM3和GPIOA口,所以也要对外设的时钟进行设置。
由于在APB1和APB2系统总线外设上,所以要对APB1和APB2总线的时钟频率进行设置。
经过APB1与APB2的分频,将SYSCLK转换成可以进行外设及TIMX可以接收的系统时钟。
在时钟初始化子程序中先对系统时钟的模式进行选择,即将系统时钟设置为HSE模式(外部时钟模式),然后设置AHB时钟等于系统时钟,且设置了低速或高速AHB,最后使能的时钟,时钟初始化子程序的流程图如下图3.3。
图3.3时钟初始化流程图
3.4I/O口初始化子程序
每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问。
GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。
当作为输出配置时,写到输出数据寄存器上的值(GPIOx_ODR)输出到相应的I/O引脚。
可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。
输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。
本设计使用的STM32的TIM_Channel_1,其接口对应的是STM32上的PA6口。
设计中PA6的通讯方式是推挽式输出方式,设置的最高输出速率为50MHz。
3.5PWM信号子程序
脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。
通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
脉冲宽度调制模式可以产生一个由TIM3_ARR寄存器确定频率、由TIM3_CCRx寄存器确定占空比的信号。
在TIM3_CCMRx寄存器中的OCxM位写入’110’,确定PWM模式1,能够独立地设置OC1输出通道产生一路PWM。
通过设置TIM3_CounterMode设置其为向上计数,通过设置TIM3_CCMRx寄存器的OC1_PE位使能相应的预装载寄存器,最后还要设置TIM3_CR1寄存器的ARPE位使能自动重装载的预装载寄存器。
因为仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIM3_EGR寄存器中的UG位来初始化所有的寄存器。
OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可以设置为高电平有效或低电平有效。
OCx的输出使能通过(TIMx_CCER和TIMx_BDTR寄存器中)CCxE、CCxNE、MOE、OSSI和OSSR位的组合控制。
在PWM模式1下,TIMx_CNT和TIMx_CCRx始终在进行比较,依据计数器的计数方向以确定是否符合TIMx_CCRx≤TIMx_CNT或者TIMx_CNT≤TIMx_CCRx。
根据TIMx_CR1寄存器中CMS位的状态,定时器能够产生边沿对齐的PWM信号或中央对齐的PWM信号。
3.6A/D转换初始化子程序
12位ADC是一种逐次逼近型模拟数字转换器。
它有18个通道,可测量16个外部和2个内部信号源,可以把转换分成两组:
规则的和注入的。
在任意多个通道上以任意顺序进行的一系列转换构成成组转换,各通道的A/D转换可以单次、连续、扫描或间断模式执行,ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
在开始ADC转换和14个时钟周期后,EOC标志被设置,16位ADC数据寄存器包含转换的结果。
时序图如下图,
图3.4时序图
在ADC初始化设置时,首先开启AHB外设时钟使能寄存器DMA1时钟,定义转换数据量,设置DMA的通道1的初始化,独立地选择通道的采样时间,在通道1设置看门狗,开启ADC1并启动转换,应用连续转换模式,使用DMA模式,接着便开始转换规则通道,完成由模拟量到数据量的转变。
其结构图如下,
图3.5ADC转换
3.7LCD显示子程序
液晶显示模块的显示器上的显示点与驱动控制芯片中的显示缓存RAM是一一对应的;驱动控制芯片当中共有65(8Pagex8bit+1)X132个位的显示RAM区。
而显示器的显示点阵大小为64X128点,所以实际上在液晶显示模块中有用的显示RAM区为64X128个位;按byte为单位划分,共分为8个Page,每个Page为8行,而每一行为128个位(即128列)。
驱动控制芯片的显示RAM区每个byte的数据对应屏上的点的排列方式为:
纵向排列,低位在上高位在下。
如要点亮LCD屏上的某一个点时,实际上就是对该点所对应的显