Matlab定时器中断
Matlab定时器中断
前⾔
matlab中与单⽚机进⾏交互时需要⽤到定时器timer,⽤它可以模拟单⽚机的定时器中断服务。在此基础上进⾏拓展,可⽤串⼝
(serial)+定时器(timer)通过matlab实现上位机数据的实时显⽰等功能。进⼀步的,通过设置菜单,可以实现更为复杂的调试功能。
⼀、timer的基本⽤法
t =timer('TimerFcn',@t_TimerFcn,'Period',0.2,'ExecutionMode','fixedSpacing','TasksToExecute',inf);
start(t);
对上⾯参数的解释:
TimerFcn :相当于单⽚机的中断服务函数,这⾥起了个名字叫t_TimerFcn
Period :定时周期
ExecutionMode:执⾏模式,这⾥选择fixedSpacing ,具体的可以doc + timer 调出matlab的帮助⽂档查看
TasksToExecute :执⾏次数,这⾥inf表⽰⽆限次,可以设置为10次,50次,等任意数字
start(t)表⽰启动定时器
%下⾯的是中断服务函数
function t_TimerFcn(~,~)%这个函数名字是⾃⼰起的,需要和上⾯的TimerFcn后⾯@后的名字相同
fprintf("测试定时器服务函数功能%d",);
end
⼆、测试例⼦
实现数据的⾃增、恒定值、⾃减功能 ,通过输⼊菜单输⼊命令,选择对应的功能
%%⽂件功能说明
%上位机菜单编辑
%从键盘读⼊菜单执⾏相应的程序
%模拟单⽚机定时器中断的编写(定时器的TimerFcn就是定时器中断服务函数)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;
clear;
fprintf作用global ccm ;%指令存取
global data %分配内存空间
data =zeros(1,50);%设计数组的默认容量为50,实际可以超过这个⼤⼩
data(1)=1;
global down_flag %下降标志
down_flag =0;
global temp_down_flag %上升下降缓存标志
temp_down_flag =0;
global keep_flag %保持恒定值
keep_flag =0;
global start_flag %定时器启动标志
global i %数组下标
i =2;%matlab中数组第⼀个元素下标为1、
%定时器对象句柄
global t
global sys_run_flag;%系统运⾏标志
sys_run_flag =1;
%菜单
fprintf('使⽤说明:\n');
fprintf(' 0 -> 退出当前程序\n');
fprintf(' 1 -> Start\n');
fprintf(' 2 -> STOP\n');
fprintf(' 3 -> DOWN\n');
fprintf(' 4 -> UP\n');
fprintf(' 5 -> KEEP\n');
fprintf(' 6 -> EXIT KEEP MODE\n');
%配置定时器,相当于new⼀个定时器对象
timer_config();
ccm =input('input ccm:\n');
% ccm 可以表⽰⼀个⼀维的数组,ccm(1,1)表⽰具体功能,后⾯可以加其他的数据如ccm(1,2),ccm(1,3)等进⾏辅助功能的实现%999表⽰退出的代码
%while(ccm~=999)
while(sys_run_flag)
if isempty(ccm)
ccm =0;
end
switch ccm(1,1)
case0
fprintf('Exit\n');
sys_run_flag =0;
stop(t);
delete(t);
%break;
%matlab中switch不像c,⼀个case执⾏完后不会顺序执⾏后⾯的,break只⽤于while和for循环
case1
fprintf('1 Timer1 excution \n');
if~start_flag
start(t);
start_flag =1;
end
case2
fprintf('2 Timer1 stop \n');
stop(t)
start_flag =0;
case3
fprintf('down\n');
down_flag =1;
keep_flag =0;
if start_flag ==0
start_flag =1;
start(t);
end
case4
fprintf('4 up\n');
down_flag =0;
keep_flag =0;
if start_flag ==0
start_flag =1;
start(t);
fprintf('5 keep\n');
stop(t);
temp_down_flag = down_flag;
if down_flag
down_flag =0;
end
if keep_flag ==0
keep_flag =1;
start_flag =1;
start(t);
end
case6
fprintf('6 exit keep mode \n');
keep_flag =0;
down_flag = temp_down_flag ;
otherwise
fprintf('使⽤说明:\n');
fprintf(' 0 -> 退出当前程序\t\t\t');
fprintf(' 1 -> start\n');
fprintf(' 2 -> stop\t\t');
fprintf(' 3 -> down\n');
fprintf(' 4 -> up\n');
fprintf(' 5 -> keep\n');
fprintf(' 6 -> EXIT KEEP MODE\n');
end
if sys_run_flag
ccm =input('等待新指令(1:停⽌输出,0:退出程序):\n');
end
end
function timer_config(~,~)
%写⼀个定时器函数,定时执⾏⼀个语句,模拟定时器中断
global t
global start_flag
t =timer('TimerFcn',@t_TimerFcn,'Period',0.2,'ExecutionMode','fixedSpacing','TasksToExecute',inf); start(t);
start_flag =1;
end
function t_TimerFcn(~,~)
global data %数据:斜坡函数,data(i)上升或者下降;
global i %数组的下标
global down_flag
global keep_flag
if~down_flag
if keep_flag
data(i)=data(i-1);%数组存储数据
else
data(i)=data(i-1)+1;%数组存储数据
end
plot(data)%作图
i = i+1;%下标更新
%disp(num2str(data(i-1)))%⽤于在命令⾏窗⼝实时显⽰数字
else
if i ==1
data(i)=data(i)-1;%数组存储数据
down_flag =0;
else
if keep_flag
data(i)=data(i-1);%数组存储数据
else
end
plot(data)%作图
i = i+1;%下标更新
%disp(num2str(data(i-1)))%⽤于在命令⾏窗⼝实时显⽰数字
end
end
三、测试例⼦的运⾏结果
在键盘上输⼊对应的数字,1,2,3,4,5,6,进⾏任意的上升,下降,保持操作,得到的结果如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论