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;
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只用于whilefor循环
            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,进行任意的上升,下降,保持操作,得到的结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ericanxuanxuan/article/details/114296264
今日推荐