相关文章推荐
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",);

二、测试例子

实现数据的自增、恒定值、自减功能 ,通过输入菜单输入命令,选择对应的功能

%% 文件功能说明
% 上位机菜单编辑
% 从键盘读入菜单执行相应的程序
% 模拟单片机定时器中断的编写(定时器的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;
        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;
            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);
            case 4
                fprintf('4 up\n');
                down_flag = 0;
                keep_flag = 0;
                if start_flag == 0
                   start_flag = 1; 
                   start(t);
            case 5
                fprintf('5 keep\n');
                stop(t);
                temp_down_flag = down_flag;
                if down_flag
                    down_flag = 0;
                if keep_flag == 0
                   keep_flag = 1; 
                   start_flag = 1;
                   start(t);
            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');
        if sys_run_flag 
            ccm = input('等待新指令(1:停止输出,0:退出程序):\n');
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;
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);  %数组存储数据
            data(i) = data(i-1)+1;  %数组存储数据
        plot(data)      %作图
        i = i+1;        %下标更新
%         disp(num2str(data(i-1))) %用于在命令行窗口实时显示数字
        if i == 1
            data(i) = data(i)-1;    %数组存储数据
            down_flag = 0;
            if keep_flag
                data(i) = data(i-1);  %数组存储数据
                data(i) = data(i-1)-1;  %数组存储数据
        plot(data)      %作图
        i = i+1;        %下标更新
%         disp(num2str(data(i-1))) %用于在命令行窗口实时显示数字
                    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档Matlab定时器中断前言一、timer的基本用法二、测试例子运行结果前言matlab中与单片机进行交互时需要用到定时器timer,用它可以模拟单片机的定时器中断服务。在此基础上进行拓展,可用串口(serial)+定时器(timer)通过matlab实现上位机数据的实时显示等功能。进一步的,通过设置菜单,可以实现更为复杂的调试功能。一、timer的基本用法二、测试例子%% 文件功能说明% 上位机菜单编辑% 从键盘读入菜
				
http://blog.sina.com.cn/s/blog_9183ba080101olx3.html 鉴于Matlab 中缺乏多线程机制,使用Timer 无疑是一个很重要的工具,MatlabTimer 是一个Java 对象。 (1) Timer 的定义 t=timer(); 设置属性: eg. set(t,‘Name’,‘your_timer_name’); 当然可以一次性设置完成: TaskTimer=timer(… ‘Name’,‘FebirdTimer’,… ‘TimerFcn’,@
Matlab生成dsp程序——官方例程学习(2)一、主要功能二、CAN总线三、2837x关于CAN说明四、生成程序五、总结     这次学习的是官方例程中的Asynchronous Scheduling,emm因为我也是一边学习一边记录,所以现在也没办法解释整个框架的结构啥的。后面我会一步一步看,慢慢分析的。 例子官网连接:官网例程链接 一、主要功能    定时器或ePWM模块用于配置定时器中断定时器中断是根据定时器周期触发的,当收到消息时会触发eCAN消息接收中断。硬件中断块(图中的蓝色模块)触发定时
% 创建一个定时器对象 t = timer('ExecutionMode', 'fixedRate', 'Period', 1, 'TimerFcn', @myTimerInterrupt); % 启动定时器 start(t); % 停止定时器(当需要停止定时器时调用) % stop(t); % 删除定时器对象(当不再需要定时器时调用) % delete(t); 上述代码中,`myTimerInterrupt` 函数定义了在定时器中断发生时要执行的操作,这里仅仅是输出一条消息。创建定时器对象后,设置了其执行模式为 `fixedRate`,周期为 1 秒,并指定了中断处理函数。最后通过 `start` 函数启动定时器。 你可以根据需要修改 `myTimerInterrupt` 函数中的操作,以实现你所需的功能。在需要停止定时器时,调用 `stop(t)` 停止定时器;当不再需要定时器时,调用 `delete(t)` 删除定时器对象。
 
推荐文章