直流电机转速负反馈调节器拖动系统课程设计报告.docx

上传人:b****8 文档编号:9541545 上传时间:2023-02-05 格式:DOCX 页数:35 大小:721.19KB
下载 相关 举报
直流电机转速负反馈调节器拖动系统课程设计报告.docx_第1页
第1页 / 共35页
直流电机转速负反馈调节器拖动系统课程设计报告.docx_第2页
第2页 / 共35页
直流电机转速负反馈调节器拖动系统课程设计报告.docx_第3页
第3页 / 共35页
直流电机转速负反馈调节器拖动系统课程设计报告.docx_第4页
第4页 / 共35页
直流电机转速负反馈调节器拖动系统课程设计报告.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

直流电机转速负反馈调节器拖动系统课程设计报告.docx

《直流电机转速负反馈调节器拖动系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《直流电机转速负反馈调节器拖动系统课程设计报告.docx(35页珍藏版)》请在冰豆网上搜索。

直流电机转速负反馈调节器拖动系统课程设计报告.docx

直流电机转速负反馈调节器拖动系统课程设计报告

 

拖动系统课程设计

报告书

 

题目:

直流电机转速负反馈调节器

 

任务书:

设计题目:

闭环控制的PWM直流调速系统设计与实现

专题题目:

直流电机速度闭环调速系统

任务下达日期:

2015年5月15日

设计日期:

2015年6月7日-2015年6月17日

主要内容:

1、测定综合实验中所用控制对象的参数(由实验完成)。

2、根据给定指标设计转速调节器,并选择调节器参数和具体实现电路。

3、按设计结果组成系统,以满足给定指标。

4、研究参数变化对系统性能的影响。

5、在变工况(加载)下进行调试。

要求:

1、能独立设置电机速度(按键设置或滑动变阻器设置或上位机设置);

2、能显示当前电机的实际速度(单位为:

r/min);

3、能控制电机启动、停止、正反转、软启动和软制动;

4、给电机加载后,速度能迅速调节回给定值;

 

摘要

本文章介绍了有TIM4C123GH6PM芯片以及带编码器的直流电机、L298电机驱动模块、矩阵键盘,串口四位数码管构成的PID转速闭环控制系统。

由芯片的正交编码模块对电机自带的编码器产生的信号进行正交解码得到速度值,并由芯片将其与设定值进行比较的到偏差,再由偏差产生的直接控制作用去消除偏差。

本文中不仅介绍了基础TIM4C123GH6PM的转速控制系统的软件设计,还涉及了硬件的设计方法。

本文介绍系统不仅可以实现自动调速,还可实现电机的正反转以及启停控制,以及对电机转向进行标志。

关键词:

直流电机;PID闭环控制;TM4C123GH6PM;矩阵键盘;串口四位数码管

 

目录

1系统概述·································1

2硬件设计·································1

2.1控制器································1

2.2按键模块·······························2

2.3串口四位数码管····························2

2.4L298电机驱动模块···························3

2.5直流电机·······························4

2.5.1直流电机参数··························4

2.5.2编码器参数··························4

2.5.3信号线说明···························5

3软件设计·································5

3.1主函数部分·····························5

3.2速度计算模块·····························5

3.3速度显示模块·····························5

3.4按键检测模块·····························6

3.5PID控制模块·····························8

4系统调试································10

5结束语·································11

6参考文献································11

7附录··································12

正文:

1.系统概述

本次设计以数字PID为控制算法,以TIM4C123GH6PM为控制芯片,运用TIM4的PWM模块产生受PID算法控制的PWM信号驱动L298N电机驱动模块进而驱动电机,并用TIM4的正交编码模块对编码器产生的脉冲进行计数,实现转速闭环控制,达到转速无静差的目的。

2.硬件电路设计

硬件连接示意图

2.1.控制器

采用TIM4C123GH6PM,TIM4具有高速,低功耗的特点,而且自带PWM模块和正交编码模块,不仅控制性能好而且简便易于实现。

并且自带3色LED都灯。

可以作为停止,正转,反转的信号标志。

其管脚如下:

2.2.按键模块

按键为自己焊接的4×3矩阵键盘,采用扫描式方法,在A2,A3,A4依次给低电平,B0~4进行检测,根据组合进行判定数字

2.3.串口四位数码管

2.4.L298电机驱动模块

2.5.直流电机

2.5.1.直流电机参数:

电机的电枢电阻11欧。

工作电压可从3V至30V。

堵转电流=电压/电枢电阻。

18v时空转转速9000rpm,其他电压下的转速可大致按比例计算。

2.5.2.编码器参数:

共输出两路正交(相位相差90°)脉冲信号。

分辨率334,意味着电机每旋转一周输出334个周期脉冲。

如果把每一路脉冲的上沿和下沿都利用起来,相当于四倍频,分辨率可以达到34×4=1336。

334线AB相编码器,内含整形电路,输出是方波,可直联单片机IO。

编码器供电电压为5V,AB相输出,在A相或B相的上升或下降沿时判断对方的电平,就可以判断电机的转动方向。

2.5.3.信号线说明:

A相方波输出,B相方波输出,VCC,GND是编码器电源,必须稳压。

电机1,电机2是直流电机的电源。

 

3.软件设计

3.1.

主函数部分

该函数先要要设置系统时钟,在函数中系统时钟为50MHz,然后便要对本次课程设计中数码管,按键所需要的GPIO口进行初始化配置。

接着要对芯片上的PWM模块、正交编码模块进行初始化配置。

然后要设置电机的初始状态。

各个部分初始化完毕后,设计主循环部分的函数,速度检测应该放到最前,因为数码管显示和PID控制都需要用到检测的速度,然后便是数码管显示显示实时速度,按键检测检测完毕后,如果按键输入速度,便要通过PID控制达到所设置的速度。

然后往复循环。

 

1.

2.

3.

3.1.

3.2.速度计算模块

由于正交编码模块采用双边沿触发设置,故电机运行一圈的脉冲数为334×4。

程序如下:

speed_signal=QEIVelocityGet(QEI1_BASE);//得到脉冲个数

speed=(speed_signal*50*60)/(4*334);//速度计算

speedDirectionGet=QEIDirectionGet(QEI1_BASE);//得到电机转速方向

3.3.速度显示函数

由于按键输入时要显示出按键值,所以加入输入数字个数检测变量,在无按键按下的情况显示速度,在按键按下时,显示按键值,直到四个数字输完,显示全部的四位数字,才切换会速度显示。

程序如下:

if(jianceTime==0){

SpeedDisplay();

}elseif(jianceTime==0xFF){

for(i=0;i<1000;i++){

LED4_Display();

}

jianceTime=0;

}else{

LED4_Display();

}

3.4.按键检测模块

由于加入防抖动延时,按键函数分为两部分,一部分为按键按下检测,另一部分为按键值检测

按键按下检测程序:

GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,0);

if(!

(GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0)&&

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1)&&

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2)&&

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3)))

{

SysCtlDelay(SysCtlClockGet()/100);

if(!

(GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0)&&

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1)&&

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2)&&

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3)))

{

shaomiao(3-jianceTime);

}

GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,0);

while(!

(GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0)&&

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1)&&

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2)&&

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3)))//按键释放检测

{

}

}

按键值检测程序:

GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,0xFF);

GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2,0);

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0))

LED1[i]=1;

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1))

LED1[i]=4;

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2))

LED1[i]=7;

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3)){

jianceTime=0xFF;

judge_forward_reverse();

return;

}

GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_2,GPIO_PIN_2);

GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_3,0);

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0))

LED1[i]=2;

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1))

LED1[i]=5;

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2))

LED1[i]=8;

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3))

LED1[i]=0;

GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_3,GPIO_PIN_3);

GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,0);

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_0))

LED1[i]=3;

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_1))

LED1[i]=6;

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_2))

LED1[i]=9;

if(!

GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_3))

{

LED[0]=11;LED[1]=11;LED[2]=11;LED[3]=11;

jianceTime=0xFF;

stop();

return;

}

GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_4,GPIO_PIN_4);

3.5.PID控制模块

由于电机的机械特性,导致一个PID参数难以对电机转速进行宽范围的调控,经测试尤其200r/min一下,难以正常运转,因此进行分段PID控制

if(setspeed<200){//200r/min以下PID控制

Kp=0.001;

Ki=0.00000005;//0.000011;//0.000064;//0.00012//0.0001;///0.000081

Kd=0.2;

e[2]=setspeed-speed;

uk=Kp*(e[2]-e[1])+Ki*e[2]+Kd*(e[2]-2*e[1]+e[0]);

out=uk+past_uk;

if(out>5000){

out=5000;

}

if(out<=-5000){

out=-5000;

}

past_uk=out;

e[0]=e[1];

e[1]=e[2];

PulseWidth=PulseWidth+PulseWidth*(out/5000);

if(PulseWidth<0.3){

PulseWidth=0.3;

}

if(PulseWidth>1){

PulseWidth=1;

}

}

if(setspeed>=200){//200r/min以上PID控制

Kp=0.04;

Ki=0.000001;

Kd=0.00001;

e[2]=setspeed-speed;

uk=Kp*(e[2]-e[1])+Ki*e[2]+Kd*(e[2]-2*e[1]+e[0]);

out=uk+past_uk;

if(out>5000){

out=5000;

}

if(out<=-5000){

out=-5000;

}

past_uk=out;

e[0]=e[1];

e[1]=e[2];

PulseWidth=PulseWidth+PulseWidth*(out/5000);

if(PulseWidth<0.3){

PulseWidth=0.3;

}

if(PulseWidth>1){

PulseWidth=1;

}

}

govern_speed();

4.系统调试

本次课程设计的程序,我是一个模块一个模块依次编写的,首先是显示模块,显示模块的程序为51程序移植,这个模块唯一难点便是M4的GPIO口操作要比51复杂很多,除了花点时间之外,并没有太多困难。

在显示模块之后是按键模块,由于用的矩阵键盘,除了需要配置较多GPIO口之外,便是程序的逻辑问题。

刚开始我的键盘扫描程序编写的是一个较大的子程序,编完程序调试时变出了问题,按了2下1,数码管便显示4个1.经检查是没有加防抖动延时,因为用的矩阵键盘,按下检测比较麻烦,不知道怎么检测哪一个按钮,便起了侥幸心理,没想到就问题。

后来经过思考,按下检测不需要知道哪个按键按下,于是便让A1~A3口均输出低电平,让B0~B3口进行检测,只要有低电平按下,便进行防抖延时。

加入防抖延时后,仍然不能完全解决问题,经过思考,系统时钟较快,如果按下时,系统可以执行两遍扫描程序,那便依然会出现上述问题,于是还要加按键释放检测。

加了按键释放检测,上述问题便迎刃而解。

所以一个键盘扫描程序用必须要有防抖延时和释放检测这两个环节。

第三个模块就是PWM模块,这个模块是芯片上就有的功能,初始化配置之后便可使用。

因为模块这个要配合按键输入占空比进行调速,首先第一个问题便是修改按键程序与之协调,并要添加正转,反转,停止和占空比设置函数。

在程序编写完毕后,PWM调速已经没有问题,但是启停正反转无法实现,还有一个问题便是停止后,让电机启动要进入哪个状态。

主要问题便是电机的正反转问题,刚开始正反转便是让一路PWM占空比为0,另一路有占空比不为0进行正反转控制,但是经过示波器观察发现,占空比不为0时无任何问题,但是占空比为0时,PWM输出管脚竟然是高电平,与理想中不一样。

于是,设想如果PWM为0不能实现高电平,那么关掉PWM发生器,PWM发生器输出管脚应该就为低电平,可是经过测试后发现,PWM输出管脚依旧为高电平,无奈只能去找资料还有查看M4函数定义以及数据手册,然后经过大量测试发现将PWM输出管脚输出功能关闭之后,PWM输出管脚为低电平,才解决问题。

第四部分便是正交编码模块,由于TI的数据手册虽然介绍的正交编码模块,但是没有讲解如何用函数去配置正交编码模块,就连TI的官方例程都没关于正交编码的程序,无奈只能去查找TI的函数库以及用其他厂商的M4芯片正交编码的程序作为参考,但是当程序编写出来后,并不能像想象中一样运行,经测试正交编码输入信号正常,而且由于其他模块在此模块前均正常工作,在加此模块后,除了初始化正交编码模块程序外,就加了用正交编码模块的速度获取函数以及电机运转反向获取函数然后送与数码管进行显示,所以问题的出现极大可能出现在正交编码的初始配置上,因为正交编码的初始化函数并不是TI提供的,经过查阅大量的TIM4系列类似本芯片的正交编码函数以及TI论坛的大量程序,发现初始化配置中缺少了GPIOPinConfigure(GPIO_PC5_PHA1);这一句GPIO复用功能配置函数。

加上此函数后,程序运行正常,模块功能正常。

5.结束语

在这次课程设计中,由于用了很多刚接触的东西,我学会了很多,例如在这次我用了刚接触的串口4位数码管,还有矩阵按键的原理虽然原来知道,但也是第一次变为现实。

最为重要的我知道了如何自学一种芯片,原来的我只知道跟着例程做,现在我知道了要去查这个芯片的函数库,我也知道了如何运用一款芯片的数据手册。

所以这次课设不仅提高了我对电机拖动的理解,最为重要的是提高了我的自学能力。

 

参考文献:

【1】叶朝辉:

TM4C123微处理器原理与实践。

北京:

清华大学出版社,2014.01.01

【2】XX文库.直流电机PID控制。

网址:

【3】阮毅、陈伯时电力拖动自动控制系统——运动控制系统。

机械工业出版社2015.01

【4】Tiva™TM4C123FH6PM微控制器数据手册

【5】德州仪器在线技术支持社区

附录

课设程序:

#include

#include

#include"inc/hw_memmap.h"

#include"driverlib/sysctl.h"

#include"driverlib/gpio.h"

#include"driverlib/pin_map.h"

#include"driverlib/pwm.h"

#include"driverlib/qei.h"

#defineucharunsignedchar

#definePERIOD_TIMESysCtlClockGet()/2000

#defineDIOGPIO_PIN_1

#defineRCLKGPIO_PIN_2

#defineSCLKGPIO_PIN_3

intanjianzhi=1;

ucharLED[8];

ucharLED1[8];

ucharjianceTime=0;

doublePulseWidth;

unsignedlongspeed_signal=0;

uint32_tsetspeed=0,speed=0;

intspeedDirectionGet=0;

inte[3];

doubleuk,past_uk,out;

ucharspeedstop=0;

/***************************************************************************************PWM初始化******************************

***************************************************************/

voidInit_PWM()

{

PulseWidth=0.3;

//设置PWM时钟和系统时钟一致

SysCtlPWMClockSet(SYSCTL_PWMDIV_1);

//使能PWM外设

SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);

//使能外设端口

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

//设置对应管脚的PWM信号功能

GPIOPinConfigure(GPIO_PB4_M0PWM2);

GPIOPinConfigure(GPIO_PB7_M0PWM1);

//设置PWM信号端口

GPIOPinTypePWM(GPIO_PORTB_BASE,GPIO_PIN_4);

GPIOPinTypePWM(GPIO_PORTB_BASE,GPIO_PIN_7);

//PWM生成器配置

PWMGenConfigure(PWM0_BASE,PWM_GEN_1,PWM_GEN_MODE_DOWN|PWM_GEN_MODE_NO_SYNC);

PWMGenConfigure(PWM0_BASE,PWM_GEN_0,PWM_GEN_MODE_DOWN|PWM_GEN_MODE_NO_SYNC);

//设置PWM信号周期

PWMGenPeriodSet(PWM0_BASE,PWM_GEN_1,PERIOD_TIME);

PWMGenPeriodSet(PWM0_BASE,PWM_GEN_0,PERIOD_TIME);

//设置PWM信号占空比

PWMPulseWidthSet(PWM0_BASE,PWM_OUT_2,PulseWidth*PERIOD_TIME);

PWMPulseWidthSet(PWM0_BASE,PWM_OUT_1,PulseWidth*PERIOD_TIME);

//使能PWM输出端口

PWMOutputState(PWM0_BASE,PWM_OUT_2_BIT,false);

PWMOutputState(PWM0_BASE,PWM_OUT_1_BIT,false);

//使能PWM生成器

PWMGenEnable(PWM0_BASE,PWM_GEN_1);

PWMGenEnable(PWM0_BASE,PWM_GEN_0);

//使能PWm生成器模块的及时功能.

PWMSyncTimeBas

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1