计算机控制系统课程设计直流伺服电机控制系统_第1页
计算机控制系统课程设计直流伺服电机控制系统_第2页
计算机控制系统课程设计直流伺服电机控制系统_第3页
计算机控制系统课程设计直流伺服电机控制系统_第4页
计算机控制系统课程设计直流伺服电机控制系统_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、直流伺服电机控制系统目录1引言32单片机控制系统硬件组成32.1微控制器32.2电机驱动芯片42.3按键输入和显示模块52.3.1按键输入52.3.2显示模块52.4直流伺服电动机53.单片机控制系统软件设计53.1主程序63.2键盘处理子程序74.控制系统原理图及仿真74.1控制系统方框图74.2控制系统电路原理图85.simulink组件对直流伺服控制系统的仿真85.1直流伺服电机数学模型85.2系统simulink模型及时域特性仿真95.2.1 simulink建模及仿真95.2.2单位负反馈系统simulink建模及仿真105.3 pid校正115.3.1 pid参数的凑试法确定115

2、.3.2比例控制器校正125.3.3比例积分控制器校正145.3.4 pid控制器校正165小结19引用文献191引言本设计的直流伺服电机控制系统是一个随动控制系统。以stm32核心板为控制器,通过按键将设定值输入到单片机,采用超声波传感器采集小车前方物体的距离,单片机对设定值与测量距离求差后输出控制信号,双btn7971大电流h桥驱动伺服电机工作,进而控制电机向着减小差值的方向转动。同时单片机处理的数字信号通过lcd来显示,实时显示超声波传感器的测量值。另外本设计还利用了matlab软件,利用simulink构造直流电机控制系统模型,通过对各个单元部件的参数进行设定,进而对直流伺服电机系统控

3、制进行仿真,就其仿真结果对系统进行时域分析。2单片机控制系统硬件组成本系统是由一片单片机、矩阵式键盘、超声波模块hc-sr04、显示模块和一辆带有直流伺服电机的车模组成,另外通过altinum designer软件进行电路设计。2.1微控制器stm32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的armcortex-m3内核。按性能分成两个不同的系列:stm32f103“增强型”系列和stm32f101“基本型”系列。增强型系列时钟频率达到72mhz,是同类产品中性能最高的产品;基本型时钟频率为36mhz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选

4、择。两个系列都内置32k到128k的闪存,不同的是sram的最大容量和外设接口的组合。时钟频率72mhz时,从闪存执行代码,stm32功耗36ma,是32位市场上功耗最低的产品。以下是stm32系列的内部结构图:2.2电机驱动芯片模块上的en端为h桥的使能端,需要外接5v电压,en不可悬空,当en都为高电平时电机驱动模块开始工作,en端为低电平时,电机驱动停止工作。2.3按键输入和显示模块2.3.1按键输入采用自己设计的形如4×4矩阵式按键,按键用于设定某一数值。通过程序设置延时环节来消除按钮的抖动问题,这样做使矩阵式按钮硬件连线简单,同时按钮的软件设计也变的简单。2.3.2显示模块

5、系统采用传统点阵式1602显示器,显示传感器的测量值以及键盘的输入设定值。2.4直流伺服电动机直流伺服电动机在伺服系统中控制机械元件转动.是一种补助马达间接变速装置。又称执行电动机,在自动控制系统中,用作执行元件,把所收到的电信号转换成电动机轴上的角位移或角速度输出。其主要特点是,当信号电压为零时无自转现象,转速随着转矩的增加而匀速下降。其作用可使控制速度、位置精度非常准确。直流伺服电动机的结构与直流电动机基本相同。只是为减小转动惯量,电机做得细长一些。所不同的是电枢电阻大,机械特性软、线性(电阻大,可弱磁起动、可直接起动)。供电方式是他励供电,即励磁绕组和电枢分别两个独立的电源供电。控制方式

6、包括电枢控制和磁极控制,其中改变电枢电压u调速范围较大,直流伺服电机常用此方法调速。直流伺服电动机转速的计算公式如下:式中:n为转速;为磁通;u为外加电压;i、r为电枢电流和电阻;ke为电势系数。3.单片机控制系统软件设计软件设计采用模块化设计,由主程序模块和功能实现模块两大部分组成。主程序通过读取键值与超声波传感器测量距离进行求差,结合pid控制算法输出至驱动模块以达到控制电机的目的;功能实现模块主要由主函数模块、键盘处理子程序和屏幕显示模块、pid控制算法子程序等组成。3.1主程序主程序首先对键盘和显示模块的程序进行初始化,通过读取键值处理后与超声波传感器测量距离进行求差以达到控制电机的目

7、的。主程序流程图如图3-1所示。显示模块初始化键盘扫描程序开始读取键值pid消除差值控制电机键盘模块程序初始化输入值是否有效?与传感器测距求差进行秋茶 n y 图3-1主程序流程图3.2键盘处理子程序键盘采用程序扫描的工作方式,即在特定的程序位置段上安排键盘扫描程序读取键盘状态。键盘处理子程序的程序扫描法流程图如图3-2所示。是否有键按下?延时10ms调用按键扫描子程序开始是否有键按下?按键散转、处理程序返回 n n y y 图3-2键盘处理子程序的程序扫描法流程图4.控制系统原理图及仿真4.1控制系统方框图控制系统是以单片机为控制器,通过键盘输入设定值,经单片机处理后送到电机驱动器,电机驱动

8、器将收到的信号进行放大,最终电机按照减小设定值与测量值的方式转动。图4-1即为控制系统方框图电机转动,随动系统完成将信号输出给电机驱动器pid控制减小差值与实际测量值求差按键输入图4-1控制系统方框图4.2控制系统电路原理图图4-2控制系统电路原理图5.simulink组件对直流伺服控制系统的仿真5.1直流伺服电机数学模型直流伺服电机闭环系统结构图如图5-1所示 u(s) n(s) 图5-1直流伺服电机闭环系统结构图其中直流伺服电机的传递函数为5.2系统simulink模型及时域特性仿真对于单输入单输出系统,在经典控制理论中可用传递函数来描述系统,获得系统的动态响应。同样,simulink仿真

9、软件也有传递函数模块,可方便地描述系统的特性,且简化了仿真模型。从模块库窗口创建系统模型如图1所示,选信号源模块组中的阶跃信号模块为输入信号,以输出模块组中的示波器模块作为显示器来观察系统阶跃响应。在模型窗口设置传递函数模块的参数和特性,运行仿真模型,得系统阶跃响应曲线。5.2.1 simulink建模及仿真图5-2直流伺服电机开环系统simulink模型端口step为直流伺服电机的输入电压,输出端口为驱动信号。图5-3是开环系统的仿真结果,即开环系统的阶跃响应曲线,也即直流伺服电机输入1v单位阶跃电压时。电机的转轴输出呈线性变化。图5-3开环系统仿真图由图5-3响应曲线可知,系统没有在可视范

10、围内达到稳态值“1”,但从理论上分析知此系统属稳定系统,在足够时间内是能够达到稳定状态的。上述分析说明:系统的响应速度较慢,系统性能较差,从而可能不具备使用价值。结果表明,该系统没有达到预期的设计要求。5.2.2单位负反馈系统simulink建模及仿真图5-4是在图5-3的基础上加一个单位负反馈环节,构成直流伺服电机的单位负反馈系统,单位负反馈系统simulink模型如图5-4所示图5-4直流伺服电机单位负反馈系统simulink模型图5-5是单位负反馈系统的仿真结果图5-5单位负反馈系统仿真图系统超调:40%,调节时间:2s。由图5-5和开环阶跃响应曲线相比较知:系统应经可以达到较快达到稳态

11、值。说明闭环单位负反馈系统对系统性能有很大改善。5.3 pid校正为了使系统能够达到设计要求,我们可以在图5-4前向通道上设置一个控制器构成闭环系统来校正直流伺服电机。基于pid控制(闭环)的直流伺服电机系统框图如图5-6所示。输入信号 +速度输出 输出信号 信号偏差 直流电机pid + -距离负反馈图5-6基于pid控制(闭环)的直流伺服电机系统框图其控制过程为比较超声波传感器的测量值与键盘设定值,即输入信号,通过反馈后与系统输入信号进行比较,得到偏差信号。偏差信号作为pid控制器的输入信号根据设定的pid控制规律计算后输出信号u,作为控制量输入给直流电机,从而实现整个直流电机调速系统的闭环

12、负反馈pid控制。5.3.1 pid参数的凑试法确定增大比例系数kp系统响应有利于减小静差,但是过大会增大超调,并产生震荡,使稳定性变坏。增大ti可以减小超调,减小震荡,是系统更稳定,但静差消除变慢。增大微分td有利于加快系统响应时间,使超调减小,稳定性增加,但对扰动的抑制能力减弱,对扰动有较敏感的响应。在凑试时,对参数实行下述先比例,后积分,再微分的整定步骤。(1)首先只整定比例部分。即将比例部分由小变大,并观察相应的系统响应,直到得到反应快,超调小的响应曲线。如果系统没有静差或静差已小到允许范围内,那么只需用比例控制器即可,最优比例系数可由此确定。(2)如果在比例调节的基础下系统的静差不能

13、满足设计要求,则须加入积分环节。整定时首先置积分时间ti为一较大值,并将经第一步整定得到的比例系数略微缩小,然后减小积分时间,并在保持系统良好动态性能的情况下,静差得到消除。在此过程中,可根据响应曲线的好坏反复改变比例系数与积分时间,以期得到满意的控制过程与整定参数。(3)若使用比例积分控制器消除了静差,但动态过程经反复调整仍不能满意,则可加入微分环节,构成比例积分微分控制器。在整定时,可先置微分时间td为零。在第二步整定的基础上,增大td,同时相应的改变比例系数和积分时间,逐步凑试,以获得满意的调节效果和控制参数。5.3.2比例控制器校正比例控制系统simulink模型及仿真图5-7 比例控

14、制系统simulink模型kp=1时仿真图kp=3时kp=5时仿真图由以上三个比例控制的仿真图可知,增大比例系数kp一般系统响应利于减小静差,但是过大会增大超调,并产生震荡,使稳定性变坏。5.3.3比例积分控制器校正积分控制的作用是只要系统存在误差,积分控制作用就不断地积累,输出控制量以消除误差,因而,只要有足够的时间,积分控制将能完全消除误差。在比例环节基础上加入积分环节,只要参数设置合适就能完全消除系统偏差。比例积分控制系统simulink模型图5-8 比例积分控制系统simulink模型kp=1、ki=1时仿真图kp=1、ki=3时仿真图kp=5、ki=3时仿真图由以上三个比例积分控制的

15、仿真图可知,增大ti有减小超调,减小震荡,使系统更稳定,但静差消除变慢。pi控制参数设置适当可使系统静差为零。经多次试凑,选ki=1.5.3.4 pid控制器校正比例积分作用虽能是系统误差为零,但系统动态性能不能得到满足。积分作用太强可能会使系统出现震荡。微分控制具有超前控制能力,可抑制最大动态偏差,改善系统动态性能,提高系统的稳定性。为此,在pi作用基础上引入微分控制,构成pid控制器,以使系统满足稳、准、快的要求。pid控制控制系统simulink模型如图图5-9 pid控制系统simulink模型kp=1、ki=1、kd=0.1时仿真图和pi控制闭环响应曲线相比较可知:系统响应时间变短,

16、超调变小,但仍不符合要求;kp=5、ki=1、kd=0.1时仿真图与kp=1、ki=1、kd=0.1时的仿真图相比,系统超调和调节时间都变小,仍然不符合要求,继续校正。需加大kp及ki。kp=12、ki=1、kd=0.5时仿真图由上曲线知此时系统有微量的超调,进一步加大ki时超调为零。kp=12、ki=1、kd=0.9时仿真图经过多次校正参数,此时当kp=12、ki=1、kd=0.9时系统超调量为0,稳态误差为0,性能满足设计要求,稳定、准确、快速得到了完满的统一。5小结控制系统特点是以单片机为控制器,通过键盘输入设定值,使得系统消除测量值与实际值的偏差方便快捷。但在proteus中没能实现闭

17、环系统的pid控制。此缺点通过软件弥补,在matlab软件中的simulink中进行了直流伺服电机的开环控制系统仿真,单位闭环控制系统仿真,闭环pi控制系统仿真,闭环pd控制仿真,闭环pid控制仿真能够更好的测试和控制系统的性能,从而为系统设计提供了更准确的性能指标。参考文献1李正军.计算机控制系统.北京:机械工业出版社,2010.62周荷琴等.微型计算机原理及接口技术m.合肥:中国科技大学出版社,2008.63张毅刚等.单片机原理与应用设计m.北京:电子工业出版社4计算机控制技术实验指导书部分程序如下:#include "stm32f10x.h" #include &qu

18、ot;user_config.h" #include "tft28.h" #include "gui.h"#include <stdio.h>#include "key.h"#include <math.h>int overflow=0; #define module_interval 25 #define object_distance 100.0 void nvic_configuration(void);void tim_configuration(void);void gpio_configu

19、ration(void);void rcc_configuration(void);float sensor_using(void);void delay(void);unsigned long lasttime;double input, output, setpoint,derr;double errsum, lasterr;unsigned int device_code; gpio_inittypedef gpio_initstructure;/定义一个结构变量,用于初始化gpioerrorstatus hsestartupstatus;void delay(vu32 ncount)

20、for(; ncount != 0; ncount-);void delay_ms(unsigned int ncount) int i,j; for(i=0;i<ncount;i+) for(j=0;j<0x3000;j+); void rcc_configuration(void) rcc_apb1periphclockcmd(rcc_apb1periph_tim3, enable); rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_gpiob | rcc_apb2periph_gpioc | rcc_a

21、pb2periph_afio, enable);void gpio_config(void) rcc_apb2periphclockcmd(rcc_gpio_tft, enable); gpio_initstructure.gpio_pin = ds1_pin|ds2_pin|ds3_pin|ds4_pin|ds5_pin|ds6_pin|ds7_pin|ds8_pin;/工作在输出模式 gpio_initstructure.gpio_mode = gpio_mode_out_pp;/gpio¹¤×÷ÔÚÊä

22、79;öģʽ gpio_initstructure.gpio_speed = gpio_speed_10mhz; gpio_init(gpio_tft_data, &gpio_initstructure); rcc_apb2periphclockcmd(rcc_gpio_ctra, enable); gpio_initstructure.gpio_pin = gpio_pin_0 | gpio_pin_1; /使用pa0、pa1 gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpi

23、o_initstructure.gpio_speed = gpio_speed_10mhz; gpio_init(gpio_ctra, &gpio_initstructure); rcc_apb2periphclockcmd(rcc_gpio_ctrb, enable); gpio_initstructure.gpio_pin = gpio_pin_0 | gpio_pin_1 |gpio_pin_2 |gpio_pin_8 ; /使用pb0.1.2.8 gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_initstructur

24、e.gpio_speed = gpio_speed_10mhz; gpio_init(gpio_ctrb, &gpio_initstructure); gpio_resetbits(gpio_ctrb,gpio_pin_8);void nvic_configuration(void) nvic_inittypedef nvic_initstructure; nvic_initstructure.nvic_irqchannel = tim2_irqn; nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; nvic_inits

25、tructure.nvic_irqchannelsubpriority = 0; nvic_initstructure.nvic_irqchannelcmd = enable; nvic_init(&nvic_initstructure);void tim_configuration(void) tim_timebaseinittypedef tim_timebasestructure; rcc_apb1periphclockcmd(rcc_apb1periph_tim2, enable); tim_deinit(tim2); tim_timebasestructure.tim_per

26、iod=10000; tim_timebasestructure.tim_prescaler=0; tim_timebasestructure.tim_clockdivision=tim_ckd_div1; tim_timebasestructure.tim_countermode=tim_countermode_up; tim_timebaseinit(tim3, &tim_timebasestructure); tim_prescalerconfig(tim3,359,tim_pscreloadmode_immediate); tim_arrpreloadconfig(tim3,

27、disable); tim_itconfig(tim3,tim_it_update,enable); tim_cmd(tim3, disable);void delay(void) u32 i; i=3000; while(i-);/超声波传感器模块float sensor_using(void) float distance=0; u16 tim=0; gpio_setbits(gpioc,gpio_pin_12); delay(); gpio_resetbits(gpioc,gpio_pin_12); tim_cmd(tim3, enable); while(!gpio_readinput

28、databit(gpioc,gpio_pin_11) && overflow=0); tim3->cnt=0; while(gpio_readinputdatabit(gpioc,gpio_pin_11) && overflow=0); tim_cmd(tim3, disable); if(overflow!=0) overflow=0;return 0.0; tim=tim_getcounter(tim2);distance=(float)sqrt(tim/20.0*17)*(tim/20.0*17)-module_interval*module_int

29、erval/4.0)+12.0; return(distance);void tim3_pwm_init(u16 arr,u16 psc)/pwm output gpio_inittypedef gpio_initstructure; tim_timebaseinittypedef tim_timebasestructure; tim_ocinittypedef tim_ocinitstructure; rcc_apb1periphclockcmd(rcc_apb1periph_tim3, enable); rcc_apb2periphclockcmd(rcc_apb2periph_gpioc

30、 | rcc_apb2periph_afio, enable); gpio_pinremapconfig(gpio_fullremap_tim3, enable); /启用定时器三 gpio_initstructure.gpio_pin =gpio_pin_6 | gpio_pin_7 | gpio_pin_8 | gpio_pin_9; gpio_initstructure.gpio_mode = gpio_mode_af_pp; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_init(gpioc, &gpio_init

31、structure); gpio_resetbits(gpioc,gpio_pin_6 | gpio_pin_7 | gpio_pin_8 | gpio_pin_9); tim_timebasestructure.tim_period = arr; tim_timebasestructure.tim_prescaler =psc; tim_timebasestructure.tim_clockdivision = 0; tim_timebasestructure.tim_countermode = tim_countermode_up; tim_timebaseinit(tim3, &

32、tim_timebasestructure); tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm1; tim_ocinitstructure.tim_outputstate = tim_outputstate_enable; tim_ocinitstructure.tim_pulse = 0; tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high; tim_oc1init(tim3, &tim_ocinitstructure); tim_oc1preloadconfig(tim3,

33、 tim_ocpreload_enable); tim_oc2init(tim3, &tim_ocinitstructure); tim_oc2preloadconfig(tim3, tim_ocpreload_enable); tim_oc3init(tim3, &tim_ocinitstructure); tim_oc3preloadconfig(tim3, tim_ocpreload_enable); tim_oc4init(tim3, &tim_ocinitstructure); tim_oc4preloadconfig(tim3, tim_ocpreload_

34、enable); tim_arrpreloadconfig(tim3, enable); tim_cmd(tim3, enable); compute(double kp,double ki,double kd)/pid control double derr; unsigned long now; double timechange = (double)(now - lasttime); double error = setpoint - input; errsum += (error * timechange);derr = (error - lasterr)/timechange; output = kp * error + ki * errsum + kd * derr; lasterr = error; lasttime = now;int main(void)float result=0;int x; rcc_configuration;/系统时钟初始化 nvic_configuration();/中断初始化tim_configuration();/定时器初始化 gpio_config(); device_code=0x9320; tft_initial(); led_init();key_init(); compute

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论