本文介绍了抽油电机变频器变结构控制系统功能原理,如何利用uc/os-ii的多任务功能实现控制系统的算法结构变换,操作系统的移植、多任务的建立和sdk下的软件设计;最后总结了在应用中需注意的问题。
系统控制核心采用dsp56f803,它是motorola公司推出的16位dsp型微控制器,运算速度可达40mips,片内资源丰富,有强大的软件支持,是嵌入式应用的理想选择。本系统应用了其spi、sci、pwm、键盘中断及通用i/o口等功能模块。
1 系统设计
1.1 uc/os-ii的移植与配置
motorola公司提供的软件开发工具包sdk为使用ucc/os-ii做好了铺垫工作,与硬件相关的文件os_cpu.h、os_cpu_a.asm和os_cpu_c.c已经给出,只需购得系统源代码,然后将其考入指定的文件目录,系统的移植就完成了。本文采用最新版本ucc/os-ii v2.51。
系统移植成功后,需要对操作系统进行配置(裁剪),把用不到的功能去掉,以最大限度地节省存储空间。这项工作是通过os_cfg.h中的宏定义进行的,本文只用到了多任务管理、信号量、互斥量等功能。在本应用中,ucc/os-ii内核经过剪裁后只有3kb左右,相对dsp56f803的32kb内部程序flash只用了不到十分之一。需注意的另一个关键设置是时钟节拍中断频率os_ticks_per_sec,它是系统多任务运行所依赖的时间基准,也决定了任务重复调用的最快频率。这里缺省设为1000,要比文献[3]中的推荐值高出一个数量级。但实际应用表明,dsp56f803以其高运算速度在这个设置下是完全胜任的。
1.2 系统功能
根据油田生产的要求,系统要实现以下功能:键盘输入、参数显示、三相电流采集、直流侧电压采集、温度采集、变频指令输出以及保护等。系统对电流、电压、温度进行周期性采样,采样值经过数字信号处理,作为控制器的参数,最后由控制算法得出控制量,经pwm和d/a转换器发送给变频器,形成反馈闭环控制。系统运行过程中实时显示电流、温度等参数,并可以通过键盘对控制器进行参数在线设定。另外,高温、过流等保护功能必不可少。系统原理如图1。控制器根据直流侧电容c上电压的大小来确定以哪一种控制结构运行。当直流侧电压不超过设定值时,系统以电动状态运行。超过设定值时要以回馈制动方式运行,要求两种工作状态要互锁,切换要准确、及时。
1.3 任务的创建及变结构控制的实现
根据功能要求,本着尽量减少任务数以减轻cpu运行负担的原则,本文设计了ad采集、电动运行、回馈制动和显示四个任务。另外还设计了两个中断服务子程序:用porta口的中断功能实现8个键盘输入,用外部中断irqa实现短路、过流、缺相保护功能。
每个任务都有自己的名称、内存空间和优先级。不同的任务必须有不同的优先级,它们可以是0~62之间的任意值,数值越小优先级越高。优先级的设置有不同的依据,以本文为例,回馈运行任务对时间要求最苛刻,如果不能及时启动或过早结束都会对变频器造成危害,所以其优先级设为最高;ad采集任务运行最频繁,必须为其它任务提供可靠的参数,优先级设为次高;电动运行任务是常规运行状态,优先级低于ad采集任务;显示任务只实现人机交互,显示状态和参数对控制器性能没有直接影响,优先级设为最低。ucc/os-ii要求为每个任务分配os_stk类型的堆栈空间,并且它们占用的ram存储空间必须是连续的。
任务延时是指任务执行完毕处于挂起等待状态到下一次重新运行之间的时间间隔,它的单位是时钟中断节拍。由于os_ticks_per_sec为1000,每一拍为1ms。每个任务的调用间隔不能小于一个节拍,它将影响模拟量的采样频率。各个任务的属性定义如表1所示。
1.4 任务间的通信
各个任务是通过抢占cpu的使用权来运行的,它们之间存在一定的逻辑关系,彼此互相联系又互相制约。信号量、邮箱、消息队列等功能为实现任务间通信提供了有力工具,它们的使用方法灵活多变,如用信号量设置事件标志,唤醒任务、用邮箱在任务间传递参数、用消息队列的循环寻址功能进行模拟通道的数据采集等。本文设计了两个信号量,在系统运行开始后,任务task_ad检测直流侧电压的大小。当电压未超过设定值时,发出信号dc_norm唤醒任务task_normal;当电压高出设定值时,发出信号dc_over唤醒任务task_feback。虽然这两个任务基于不同的控制结构,采用不同的算法,但都要使用pwm输出和spi通信口,所以在唤醒一个任务的同时必须让另外一个任务挂起。这里引入了互斥型信号量t_mutex实现这个功能。得到t_mutex信号的任务将独自占有共享资源的使用权,两个任务不会因资源冲突而同时挂起,解决了任务间优先级反转问题,避免了系统功能失效。任务间逻辑关系如图2所示。
操作系统为任务间通信提供了多种途径,但最简单有效的方法是共享全局变量。本文使用共享全局变量的方法实现了显示任务与键盘中断服务之间的通信,代码如下:
键盘中断:
static void keyboardisr(void)
{
uword16 cpu_sr;
os_enter_critical(); //临界区代码保护
asm{
move x:$0fb7,a1 //读键盘中断状态表
move a1,state1 //将中断状态放入全局变量
};
os_exit_critical(); //临界区代码保护结束
}
这里state1是全局变量,键盘中断的工作仅仅是将porta口中断状态寄存器(iesr,地址$0fb8)读入state1中。为防止其他任务在此期间对state1的修改,使用了临界区代码保护。
显示任务的部分代码:
switch(state1)
{case 1: //pta_0对应的键被按下
…… //相应的服务程序,略
case 128: //pta_7对应的键被按下
break; }
asm{move $00,x:$0fb8}; //清键盘中断状态, 以备下次中断
显示任务中采用多分支结构,根据statel=2n,(n=0,1,2,3,,4,5,6,7),不同的值代表不同的键被按下,程序进行相应的处理;最后将iesr寄存器清零。用同样的方法,两位之间互相组合可扩展形成16个按键。这样只用一个全局变量就完成了中断与任务间的通信,程序用内嵌汇编的c来写,简捷高效。
2 系统设计中需注意的问题
首先是存储器分配问题。多任务、邮箱等功能的使用会增加ram的额外开销,在不扩展外部ram的情况下,可用的只有片内2kb数据ram和512字的程序ram,资源相对有限,存储空间的合理分配就显得很重要。任务堆栈所占用的ram空间要根据实际应用来确定,必须考虑任务调用的嵌套情况、任务中函数为局部变量所分配的内存数目。另外,它必须能保存dsp的所有22个寄存器和16个存储器字。如果为任务分配的存储空间富余过多则造成资源紧张,甚至会因内存溢出导致系统崩溃。解决方法是调用系统函数ostaskstkchk(),它可以检测每个任务运行时使用的内存大小,为合理分配内存空间提供了依据。另外,可采用一些简化方法节省ram空间。例如sdk为ad采集的每个通道都定义一个结构体,它包括三个元素:句柄、数值长度和采样值;如果使用五路ad采集,就得定义五个结构体。通常不进行初始化,dsp内核在运行时将它们放入ram空间,占用ram较多。通常关心的只是采样值一个元素,其他两个只完成辅助功能。如果使用一个存放采样值的变量代替这个结构体,或直接采用汇编语言写这段代码,就可大幅度地节省ram空间。本文的ad采集程序就是用汇编完成。
sdk没有提供在dsp56f803下使用spi函数的例程。
仿照在807中的成功应用,笔者调用spiwrite()函数,通过spi驱动d/a转换芯片。但在编译连接时出现系统错误,数据类型unsigned short与const void不匹配,在const.c中将spiwrite做强制类型转换(void*)(&spiwrite),解决了这一问题。
筑造行业数智化根基!中软国际&深开鸿亮相华为全联接大会2023
【工程师开发板使用测评】爱普特 APT32F110 ev board Zwave物联网无线通信 智能照明实验D
三星Note10系列将于明日首销 售价6599元起
初创公司可以用人工智能做什么
激光雷达如何挽救低迷的汽车产业?
基于uC/OS-II的变频器结构控制系统设计
串行比并行接口快的四大原因分析及提高单线传输速率的三种方案
保时捷与西门子合作开发合成燃料
GB 31241-电芯重物冲击试验机在不同标准要求下的试验步骤
前端程序员怎样转型全栈工程师
低压灯带PWM调光驱动电源ICSM4A00T成熟应用方案
泰克&交大微纳学院研讨会预告第二弹!电路测试直播培训课程来了!
苹果的自研芯片之路
一文了解2017全球大数据发展趋势
fft算法以及c语言实现详情解答
分析师称苹果服务业务第四季度仍将保持两位数增速
锂离子电池和锂聚合物电池的区别在哪
ICT技术连接城市与乡村 从特岗教师的需求金字塔 重新理解乡村、教育和科技
用于仿生机器人中的机械原理
中线安防保护器安装使用注意事项