综合测控实验Simulink-2015_第1页
综合测控实验Simulink-2015_第2页
综合测控实验Simulink-2015_第3页
综合测控实验Simulink-2015_第4页
综合测控实验Simulink-2015_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

综合测控实验(下)主讲人:黄弢、王峻峰主要内容:Matlab、Simulink测控系统应用:Matlab、Simulink调用*.dll,结合PID算法,实现对外部设备的闭环控制其它控制系统软件平台:组态软件在控制系统的应用DR-LinkVisualC++,VisualBasic51单片机、ARM控制实验内容Matlab/SimulinkPLC组态软件DR-LinkVC++/VB51单片机变频器直流电机调速器步进电机驱动器伺服电机驱动器可控硅调功器三相交流异步电机直流电机步进电机伺服电机发热元件换算算法输出电流电压PWMPID算法被控对象课程内容PWM脉宽调制实现调压——直流斩波调压直流斩波调压:将一个量值的直流电变为另一个量值的直流电,也称DC/DC变换

利用C写的S-Function执行步骤

mdlInitializeSizes是Simulink与S-function交互时调用的第一个方法。随后Simulink将调用其他S-function方法(都以mdl开头)。仿真结束时,Simulink调用mdlTerminate。注意:Simulink仿真时直接在适当的时间调用每个回调方法,利用C写的S-Function仿真步骤如图4.1所示:03二月2023SIMULINK自定义模块CommonlyUsedBlocks(公共模块库)Continuous(连续模块库)Discrete(离散模块库)Logic&BitOperation(逻辑与位操作模块库)Ports&Subsystems(端口与子系统模块库)

MathOperation(数学模块库)

Function&Tables(函数与表格模块)Ports&SubsystemsSignalAttributes(信号与系统模块库)Sinks(接收器模块库)Sources(输入源模块库)User-DefinedFunctions03二月2023Simulink

s-Functuion应用在MATLAB环境下使用MEX命令将已编译好的C文件(通过SIMULINK编译)转换成DLL文件,然后再结合S-FUNCTION,调用该DLL文件。首先在MATLAB的COMMAND窗口中输入:>>mex-setup会出现:

Selectacompiler:[1]LccCversion2.4inF:\MATLAB\sys\lcc[2]MicrosoftVisualC/C++version6.0inC:\ProgramFiles\MicrosoftVisualStudio[0]None即选择一个编译器。在这里一般选择VC++选项,直接在命令窗口中敲击编译器编号的数字键,然后回车即可。S-Function模板创建DLL

新建一个文件夹,选择为当前目录打开simulink,选择User-DefinedFunctions/S-FunctionExamples/C-filesS-Function//BasicC-MEXTemplate,根据所定义模块的功能,将该自动生成的文件重命名,并存入你指定的文件夹中将模版的c文件另存,文件名自定义,如MyOn.cpp。将Function改成和文件名一样,如图4.5所示。在mdlOutputs(SimStruct*S,int_Ttid)函数中进行修改,将real_T*y=ssGetOutputPortSignal(S,0);替换为real_T*y=ssGetOutputPortRealSignal(S,0);Matlab命令窗口,输入:mexMyOn.cpp,可以看到出现了一个MyOn.dll文件在simulink窗口下,新建一个mdl文件(可为mytemp1,mdl的文件名不能与sfunction的名字相同,即不能为MyOn,否则会出现命名冲突。)),向其中添加一个S-Function模块,双击模块,将其中的S-FunctionName改为dll的文件名(不加后缀,也就是MyOn)。

相同

输入输出设置及采集编程以下编程均在MyOn.cpp文件中标注输入输出设置:

三个接口没有任何,这样我们就不清楚道理每个接口作用。为此,我们可以在图4.10所示的模块上单击右键,然后选择MaskS-Function,在该cpp文件mdlStart(SimStruct*S)函数中添加采集卡初始化以及开启采集任务。

constreal_T*u1=(constreal_T*)ssGetInputPortRealSignalPtrs(S,0);constreal_T*u2=(constreal_T*)ssGetInputPortRealSignalPtrs(S,1);constreal_T*u3=(constreal_T*)ssGetInputPortRealSignalPtrs(S,2);doubleFs=u1[0];//采样频率

if(ADCardInit()!=1)//采集卡初始化

{ssSetErrorStatus(S,"Can'tfindtheDAQCard!");}DAQ1(0x1,5000,1024*4,buffer);//开启采集Fs=5000pnum=0; //初始化buf指针位置采集卡初始化及开启数据采集:

if(u2[0]==1)DAQ1(0x1,Fs,1024,buffer);elseif(u2[0]==2)DAQ1(0x2,Fs,1024,buffer);elseif(u2[0]==3)DAQ1(0x4,Fs,1024,buffer);elseif(u2[0]==4)DAQ1(0x8,Fs,1024,buffer);elseif(u2[0]==5)DAQ1(0x10,Fs,1024,buffer);elseif(u2[0]==6)DAQ1(0x20,Fs,1024,buffer);elseif(u2[0]==7)DAQ1(0x40,Fs,1024,buffer);elseif(u2[0]==8)DAQ1(0x80,Fs,1024,buffer);elsessSetErrorStatus(S,"channelnumberiswrong!");ADCardInit()是采集卡DLL函数,作用是初始化采集卡。如果初始化成功则返回1,用于判断是否连上采集卡。DAQ1()函数为采集卡DLL单通道采样函数,作用是启动采集卡进行单通道数据采集。参数1为采样通道,是以8位2进制数表示各个通道是否开启,如对通道1进行采集,该参数即为:00000001;同理,对3通道进行采集,其参数为00000100。各通道对应关系分别为:0x1:通道1 0x2:通道2 0x4:通道30x8:通道4 0x10:通道5 0x20:通道60x40:通道7 0x80:通道8DAQ2(ch,Fs,len,buffer1,buffer2)为双通道采样函数,第一个参数为通道号,和DAQ1一样,同样是以2进制数表示,如对1,2通道进行采集,该参数即为00000011;对3,4通道进行采集,即为00001100;下面是几组通道的对应关系0x3:通道1、2 0x0A:通道2、40x0C:通道3、40x11:通道1、5 0x12:通道2、50x22:通道2、6程序中使用位操作,首先获取采样通道号,例如1和2,将通道变量置0,即程序中的:unsignedcharchannel=0x00; //初始化采集通道用位操作方法,设置channel的第0位、第1位为1:

channel|=(1<<ch1);//设置采样通道1(该例子中ch1为0)

channel|=(1<<ch2);//设置采样通道2(该例子中ch2为1)第二个参数Fs为采样频率;第三个参数len为采样长度;第四、五个参数为两个通道的缓存区指针。数据输出

数据输出在mdlOutputs()函数内实现。

intLength=1024*4; //读取的buffer长度

constreal_T*u2=(constreal_T*)ssGetInputPortRealSignalPtrs(S,1);ReadDaq(u2[0],Length,buffer);//从采集卡读取bufferreal_T*y=ssGetOutputPortRealSignal(S,0); //获取输出指针

if(pnum>=Length)pnum=0;//判断指针是否已满*y=buffer[pnum]; //输出第pnum个点的值

pnum++; //指针加1

函数ReadDaq()作用是读取下位机buf里的采样数据。参数1为通道号,分别为1-8;参数2为buffer长度;参数3为保存的buffer指针。退出采集卡:函数ADCardQuit()是采集卡dll函数,其作用是退出采集卡。staticvoidmdlTerminate(SimStruct*S){

ADCardQuit();}再次在MATLAB的CommandWindow中输入mexMyOn.cpp,完成数据采集卡的程序编写。打开测试实验平台上的直流电源,打开通道1的信号源,返回使用该模块形成的mytemp1.mdl文件,将运行时间改为inf,点击菜单栏上的“保存”图标,点击菜单栏上的“运行”图标,进行执行。双击Scope可以查看采集的信号波形。调用界面设计clfresetset(gcf,'menubar','none')set(gcf,'unit','normalized','position',[0.2,0.2,0.5,0.35]); set(gcf,'defaultuicontrolunits','normalized') %设置用户缺省控件单位属性值h_axes1=axes('position',[0.05,0.55,0.6,0.4]);h_axes2=axes('position',[0.05,0.05,0.6,0.4]);有两轴对象和两个按钮对象。

hpush1=uicontrol(gcf,'Style','push',... %制作“采集”按钮

'position',[0.8,0.25,0.18,0.15],'string','采集');hpush2=uicontrol(gcf,'Style','push',... %制作“停止”按钮

'position',[0.8,0.05,0.18,0.15],'string','停止');%首先让我们先前建立的mytemp1mdl文件运行%“采集”按键引起的回调set(hpush1,'callback',[...'set_param(''mytemp1'',''SimulationCommand'',''start''),',... 't=timer(''TimerFcn'',''getdata'',''Period'',1,''ExecutionMode'',''fixedSpacing'',''TasksToExecute'',inf),',...%设置定时器,运行getdata文件,与上面是一行。'pause(2);start(t);',... %暂停2秒并启动定时器

]);%“停止”按键引起的回调hpush2=uicontrol(gcf,'Style','push',... 'position',[0.8,0.05,0.18,0.15],'string','停止');%制作“停止”按钮set(hpush2,'callback','stop(t);set_param(''mytemp2'',''SimulationCommand'',''stop'');');%停止定时器,mdl文件停止运行。

回调属性球杆定位控制系统实验电机简单运动控制Qtest.mdl的Matlab模型结构如下图所示:模型主要由一个常量模块——COM,代表使用的串口号;S函数——InitIPM_RAM,初始化控制卡和下载配置文件;一个子系统构成。双击子系统,能看到其内部结构如下所示:将文件mcqg.out、IPM100.CFG、TMLcomm.dll、TML_lib.dll、TML_lib.h、TML_lib.lib复制到当前路径中。其中mcqg.out是执行InitIPM­_RAM必须要的文件(在s-function的c文件中有相应语句);IPM100.CFG、TMLcomm.dll、TML_lib.dll、TML_lib.h、TML_lib.lib五个文件是IPM的驱动文件;编写InitIPM_RAM.h、InitIPM_RAM.cpp、Move_Abs.cpp、Move_Abs.h、Get-AD.cpp、Get-AD.h、Stop.cpp、Stop.h、Servo_On.cpp、Servo_On.h、InitIPM_RAM.h、InitIPM_RAM.cpp是初始化IPM的c文件和头文件,同时也要mex产生对应的dll文件。InitIPM_RAM函数功能:对采集控制卡初始化;函数实现描述:定义与上位机通讯的波特率115200定义驱动器的轴号255定义与上位机通讯方式RS232定义与上位机通讯默认端口号串口1初始化驱动器载入驱动器配置文件使用说明:1个输入设置串口号1个输出“1”

(真值也就是“Subsystem的一个触发信号,初始化完成后发出信号)Get_AD函数功能:采集AD数据(对于球杆系统为采集小球位置);函数实现描述:定义AD采样端口的值、地址、AD端口号等变量对他们赋初始值IPM100运动控制器有两个10位的模拟量输入端口,AD2和AD5,该函数中对AD端口号AD_No(系统默认为5)进行判断并读取该端口模拟量的值,并赋给变量val_ad。再通过读取内存中模拟量输入端口对应地址单元内的值,根据*y=400.00*((float)(unsignedshort)val_ad/65535.00)计算出小球的实际位置(单位毫米)。其中400为整个位移传感器的长度(400毫米),65535(1111111111111111)B为小球位置为400mm时对应的值。备注:AD转换结果有10位的分辨率,并左移6位。这样AD转换后的值在内存中为16位。该函数的输入是AD输入通道模拟量经转换后在内存中的值,输出为计算出来的小球的实际位置。使用说明:1个输入:AD端口号1个输出:经过换算出来的小球的位置YMove_Abs函数功能:绝对运动命令:控制电机运动函数实现描述:输入电机的目标位置、目标速度和目标加速度,使电机运动到设定的目标位置使用说明:3个输入:设定运动的速度和加速度及目标位置Stop函数功能:运动停止命令函数函数实现描述:读入电机停车的方式(默认STOP_3系统以设定的加减速度停车)

使用说明:一个输入:设定停止模式Servo_on函数功能:电机伺服控制函数实现描述:读入

TS_Power(Axis_On_Flag)Axis_On_Flag值(1或0)根据输入值上伺服或下伺服。使用说明:一个输入:设定伺服状态(上伺服或下伺服)问题讨论1:问题1:Servo_on开时,曲柄才能运动到目标位置,问题2:当Stop关闭时,曲柄才能运动到目标位置,当Stop开时,理论上曲柄会一动一停的运动到目标位置,实际很艰难,可以听到电机在运动。QGTest的子系统中五个模块的程序是循环执行的。Stop和Move_Abs循环执行,曲柄则会一停一动的运动。如果搭建的只有servo_on和Stop两个模块的系统中则不存在这个问题。对于Servo_on可能也是由于程序的循环执行所造成的。问题讨论2:1.时域波形特征:有效值,均值,均方差,峰值,峰峰值,频率.2.频域波形分析:信号波形和相应幅值谱和相位谱,并得到相应的频率值和幅值.Fft的双边特性3.热电偶温度测量:测量信号的均值4.数字滤波器设计消除不需要的频率分量

卷积基础任何输入的数字信号均可以表示成时延脉冲的线性组合,如下数字信号的脉冲表示而单位脉冲响应h[n],是系统对单位脉冲函数输入的响应。每个滤波器都有单位脉冲响应。如果已知滤波器的单位脉冲响应h[n],则可以利用卷积的方法来计算滤波器在任意输入的输出。卷积的计算由于滤波器为线性时不变因果系统,当输入是单位脉冲δ[n-k],则输出是h[n-k],可见,系统的输出取决于输入和系统的脉冲响应h[n],卷积事实上等于序列x[k]和和h[k]的反转位移序列相乘,卷积的计算:逐点相乘后相加,这里要理解h[n-k]的含义,h[n-k]是h[k]关于纵轴的镜像;h[n-k]是h[-k]右移n个采样点所得的值。离散系统的时域模型

——差分方程差分方程是递归定义的,函数f(t)在t=kT处第i阶差分的差分就是其第i+1阶差分,如:上述函数的二阶前向差分方程定义为:离散系统中信号是以序列的形式出现的,因此只能用差分方程来分析。设f(t)为t的函数,在t=kT处取值为f(kT),此时f(t)在t=kT处的一阶差分方程定义为:前向差分后向差分差分方程与卷积差分方程与卷积均可以计算己知输入情况下的滤波器的输出,二者的结果对于同一个滤波器而言应该是相同的。Z变换与差分方程求解Z变换是对离散序列进行的一种数学变换。常用以求线性时不变差分方程的解。

离散时间序列x(n)的Z变换:逆Z变换:由Y(z)计算y[n]y[n]=Z−1{Y(z)}z-1延迟因子,不能把单步延迟项z-1和逆Z变换的符号Z

−1混淆。①线性性质:②时延性质:延迟定理用Z传输函数、脉冲响应、差分方程可以描述同一个数字系统。数字滤波器设计数字滤波器经典滤波器根据滤波特性来分:低通;高通;带通;带阻(理想滤波器是不可实现的,只能在一定程度上去逼近)从单位脉冲响应长度来分:IIR-DF;FIR-DF现代滤波器寻找在某种准则下的最优解维纳滤波器,卡尔曼滤波器,自适应滤波器从对信号处理的作用来分:选频;其他1.ωp和ωs分别称为通带边界频率和阻带截止频率。2.从ωp到ωs称为过渡带,过渡带上的频响一般是单调下降的3.通带频率范围为0≤|ω|≤ωp,在通带中要求(1-δ1)<|H(ejω)|≤1,阻带频率范围为ωs≤|ω|≤π,在阻带中要求|H(ejω)|≤δ2。11+p1-psps显然,p越小,通带波纹越小,通带逼近误差就越小;s越大,阻带波纹越小,阻带逼近误差就越小;ωp与ωs间距越小,过渡带就越窄。所以低通滤波器的设计指标完全由通带边界频率ωp、通带最大衰减p

阻带边界频率ωs和阻带最小衰减s确定。11/Aps归一化的数字低通滤波器幅度响应指标FIR滤波器可以设计为线性相位,并且总是稳定的。在多数情况下,FIR滤波器的阶数NFIR

显著大于具有等效幅度响应的IIR滤波器阶数NIIR

。NFIR/NIIR

通常为10的量级或更高.I

温馨提示

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

评论

0/150

提交评论