基于uCCOS的直流电机PID转速闭环调速控制系统Proteus仿真实现…
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PWMInit();
//PWM 初始化
while(1)
{ nj=IOPIN>>16;
nb=(float)nj/10;
//采样反馈转速
e=n-nb;
u=us+q0*e+q1*es+q2*es2; //PID 处理
if(u>=Umax)
u=Umax;
es2=es;
es=e;
us=u;
OSMboxPost(Conbox,(void*)&u); //发送处理后的信号
OSTimeDlyHMSM(0,0,0,30);
}
}
/******************************************************************************
** 函数名称: Task2_Task
** 功能描述: 根据控制信号输出 PWM 波
******************************************************************************/
在本仿真中LPC2106没加晶振电路,频率在芯片属性中设置。
3.液晶显示 本系统采用 Proteus 仿真库有的液晶显示模块 AMPIRE128X64,为 8192 像素的单色 LCD
屏幕分为两半控制,控制引脚为 CS1 和 CS2。数据通过移位寄存器输入。
4.电机驱动电路 本系统仿真的是最大输入电压为 12 伏的微型电机,故用通用电机驱动电路实现假设该电
void Task2(void *p_arg)
{ uint8 err;
float *nh;
p_arg = p_arg;
uC/COS 是一个完整的、可移植、可固化、可剪裁的占先式实时多任务内核.uC/COS 已经有很多产品成功使用的案例且得到美国军方的认证,说明了该系统的可靠性。uC/COS 源代码公开,代码短,源代码大部分是使用ANSI C 编写的,移植性和裁减性好,功能强大, 能可靠应用于各种控制系统中。
系统构成
路输入电阻为无穷大,输出电阻为 0。
5.仿真电机的 51 单片机 虽然 Proteus 有电机模块,但其电机模块没有输出转速接口故用一单片机代替它,单片机
用 ADC0832 采样输入的电压,经过处理即输出和真实电机同步的转速(需要大量的浮点运 算,可考虑用 DSP)。通过两个按键改变转矩没按一次增大或减小 0.001,上面的是增大。
#define q2 Kp*td/Ts
#define ADC_DO 0x00000040
//P0.6
#define ADC_CS 0x00000080
//P0.7
#define ADC_CLK 0x00000100
//P0.8
#define ADC_DI 0x00000200
//P0.9
OS_STK
在电机控制系统开发中,常常需要消耗各种硬件资源,系统构建时间长,而在调试时很 难对硬件系统进行修改,从而延长开发周期。随着计算机仿真技术的出现和发展,可用计算 机对电机控制系统进行仿真,从而减小系统开发开支和周期。计算机仿真可分为整体仿真 和实时仿真。整体仿真是对系统各个时间段对各个对象进行计算和分析,从而对各个对象的 变化情况有直观的整体的了解,即能对系统进行精确的预测,如 Matlab 就是一个典型的实 时仿真软件。实时仿真是对时间点的动态仿真,即随着时间的推移它能动态仿真出当时系统 的状态。Proteus 是一个实时仿真软件,用来仿真各种嵌入式系统。它能对各种微控制器进 行仿真,本系统即用 Proteus 对直流电机控制系统进行仿真。
//最大调节转速
#define Kp 0.7
//比例放大系数
#define Ts 0.03
//采样周期
#define t0 4
//积分时间常数
#define td 0.0005
//微分时间常数
#define q0 Kp*(1+Ts*t0+td/Ts)
#define q1 -Kp*(1+2*td/Ts)
OSInit(); OSTaskCreate(Main_Task, (void*)0, &Main_TaskStk[TASK_STK_SIZE - 1], 0); OSStart(); return 0; }
/******************************************************************************
** 函数名称: Main_Task
** 功能描述: 初始化系统及建立任务
******************************************************************************/
void Main_Task(void *p_arg)
{
p_arg = p_arg;
// 不分频,计数频率为 Fpclk // 设置 PWMMR0 匹配时复位 PWMTC // 设置 PWM 周期
// 设置 PWM 占空比 // PWMMR0、PWMMR1 锁存
// 允许 PWM1 输出,单边 PWM // 启动定时器,PWM 使能 // 设置 PWM 周期
// 设置 PWM 占空比 // PWMMR0、PWMMR1 锁存
OSTaskCreate(Task3, (void *)0, &Task3_TaskStk[TASK_STK_SIZE - 1], 1);
OSTaskCreate(Task4, (void *)0, &Task4_TaskStk[TASK_STK_SIZE - 1], 5);
OSTaskSuspend(0);
#include "config.h"
#include "LCD.h"
#define TASK_STK_SIZE
512
//各任务栈大小
#define IO_Init()
\
PINSEL0= 2; \
IODIR|= 0x00007FB0;
//P0.4\P0.5\P0.7-P1.4 为输出其他的为输入
Βιβλιοθήκη Baidu
#define Umax 1000
2.LPC2106 微控制器 LPC2106是Phlip公司推出的核心为ARM的控制器。LPC2106 包含一个支持仿真的
ARM7TDMI-S CPU、与片内存储器控制器接口的ARM7 局部总线、与中断控制器接口的 AMBA 高性能总线(AHB)和连接片内外设功能的VLSI 外设总线(VPB,ARMAMBA 总 线的兼容超集)。片内有64K 字节静态RAM和128K的FLASH存储器。可寻址4GB。
// 避免编译警告
TargetInit();
IO_Init();
Conbox = OSMboxCreate((void*)0);
LCD_Main();
OSTaskCreate(Task1, (void *)0, &Task1_TaskStk[TASK_STK_SIZE - 1], 2);
OSTaskCreate(Task2, (void *)0, &Task2_TaskStk[TASK_STK_SIZE - 1], 3);
}
/******************************************************************************
** 函数名称: Task1_Task
** 功能描述: 实时任务,负责采样和处理数据
******************************************************************************/
Main_TaskStk[TASK_STK_SIZE];
OS_STK
Task1_TaskStk[TASK_STK_SIZE];
OS_STK
Task2_TaskStk[TASK_STK_SIZE];
OS_STK
Task3_TaskStk[TASK_STK_SIZE];
OS_STK
Task4_TaskStk[TASK_STK_SIZE];
在系统软件开发中开发中可用操作系统,也可不用操作系统。如用操作系统,程序可 实现模块化,并能对系统资源进行统筹管理,最主要的是可实现多任务运行。如果需要多任 务并行运行,并且需要一定的时间间隔,某些任务对时间的要求不高时,如不用操作系统则 要占用定时器资源,并且对栈空间和硬件资源很难进行管理,所以在这种情况下需要操作系 统。本系统用操作系统 uC/COS.
**
实时微型直流电机 PID 转速闭环调速控制系统程序(基于移植于 LPC2106 上的
uc/cos 实时操作系统)
**
程序编写者: 吴斌
**
编写日期: 2007 年 11 月 14 日
******************************************************************************/
} /****************************************************************************** *************************** ** 函数名称: main ** 功能描述: c 语言的主函数,由它启动多任务环境 ******************************************************************************* *************************/ int main (void) {
void Task4(void *p_arg);
//函数声明
void PWMInit(void)
{
PWMPR = 0x00; PWMMCR = 0x02; PWMMR0 = 2765; PWMMR1 = 0; PWMLER = 0x03; PWMPCR = 0x0200; PWMTCR = 0x09; PWMMR0 = 2765; PWMMR1 = 0; PWMLER = 0x03;
转速控制输入 (0832 采样)
移植了 uC\COS 的 LPC2106 ARM 微控 制器
液晶显示 测速接口 PWM波
输入转矩
51 单 片 机仿真 的电机
电机驱 动电路
硬件全图
各子系统
1. 转速控制输入 如用按键输入则需要复杂的软件实现,并且需要足够的引脚资源,本系统用 ADC0832
采样电位器上的电压信号来实现转速信号输入。
基于 uC/COS 的直流电机 PID 转速闭环调速控制系统 Proteus 仿真实现
在工业自动控制系统和各种智能产品中常常会用用电动机进行驱动、传动和控制,而现 代智能控制系统中,对电机的控制要求越来越精确和迅速,对环境的适应要求越来越高。随 着科技的发展,通过对电机的改造,出现了一些针对各种应用要求的电机,如伺服电机、步 进电机、开关磁阻电机等非传统电机。但是在一些对位置控制要求不高的电机控制系统如传 动控制系统中,传统电机如直流电机乃有很大的优势,而要对其进行精确而又迅速的控制, 就需要复杂的控制系统。随着微电子和计算机的发展,数字控制系统应用越来越广泛,数字 控制系统有控制精确,硬件实现简单,受环境影响小,功能复杂,系统修改简单,有很好的 人机交换界面等特点。
void Task1(void *p_arg)
{ float us;
//上次输出控制信号
float es;
//上次采样误差信号
float es2 = 0;
//上次的上次的采样误差信号
uint32 nj;
//采样转速信号
float u;
//此次输出控制信号
float e;
//此次采样误差信号
p_arg = p_arg;
//各任务栈
OS_EVENT
*Conbox;
//控制信号邮箱
float n=0;
// 输入转速
float nb=0;
// 反馈转速
void Main_Task(void *data);
void Task1(void *p_arg);
void Task2(void *p_arg);
void Task3(void *p_arg);
6.仿真结果
仿真 1.8 秒钟后得下图,可看到转速逐渐增大然后稳定下来。
增大转矩后,可看到转速下降后又恢复
7.程序;
1.系统主程序:main.c
/******************************************************************************