Matlab simulink定时器中断
前言
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;
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 %定时器启动标志
start_flag = 0;
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)
case 0
fprintf('Exit\n');
sys_run_flag = 0;
stop(t);
delete(t);
%break;
%matlab中switch不像c,一个case执行完后不会顺序执行后面的,break只用于while和for循环
case 1
fprintf('1 Timer1 excution \n');
if ~start_flag
start(t);
start_flag = 1;
end
case 2
fprintf('2 Timer1 stop \n');
stop(t)
start_flag = 0;
case 3
fprintf('down\n');
down_flag = 1;
keep_flag = 0;
if start_flag == 0
start_flag = 1;
start(t);
end
case 4
fprintf('4 up\n');
down_flag = 0;
keep_flag = 0;
if start_flag == 0
start_flag = 1;
start(t);
end
case 5
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
case 6
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
data(i) = data(i-1)-1; %数组存储数据
end
end
plot(data) %作图
i = i+1; %下标更新
% disp(num2str(data(i-1))) %用于在命令行窗口实时显示数字
end
end
三、测试例子的运行结果
在键盘上输入对应的数字,1,2,3,4,5,6,进行任意的上升,下降,保持操作,得到的结果如下: