使用STM32CubeIDE编写EC11 定时器中断方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用STM32CubeIDE编写EC11 定时器中断方式相关的知识,希望对你有一定的参考价值。

参考技术A

原贴地址 使用STM32CubeIDE编写EC11

从上图可以看出旋转EC11时,A相上升沿时,B相高电平为顺时针转动,B相低电平则为逆时针转动。所以我们利用这一特性,使用STM32的定时器捕获功能对A相进行电平捕获,然后与B相电平进行比较从而判断旋转方向。

首先要开启定时器TIM3,我们使用这个 HAL_TIM_IC_Start_IT(htim, Channel); 启动定时器。

使用定时器回调函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

在里面编写上面的程序,因为我们将B相接在PA7引脚,所以我们使用switch case语句进行判断引脚电平,如果单片机检测到A相为高电平就会进入这个中断判断B相电平,低电平为反转,高电平极为正转(程序中的cnt为计数作用)。

经测试通过串口打印数据,EC11非常稳定,也没有出现丢步和乱跳的情况。

如何在 Objective-C 中编写计时器?

【中文标题】如何在 Objective-C 中编写计时器?【英文标题】:How Do I write a Timer in Objective-C? 【发布时间】:2011-03-31 23:29:34 【问题描述】:

我正在尝试使用 NSTimer 制作秒表。

我给出了以下代码:

 nst_Timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(showTime) userInfo:nil repeats:NO];

它无法在几毫秒内工作。这需要超过 1 毫秒。

【问题讨论】:

【参考方案1】:

不要那样使用NSTimer。 NSTimer 通常用于在某个时间间隔触发选择器。它的精度不高,不适合你想做的事情。

你想要的是一个高分辨率计时器类(使用NSDate):

输出:

Total time was: 0.002027 milliseconds
Total time was: 0.000002 seconds
Total time was: 0.000000 minutes

主要:

Timer *timer = [[Timer alloc] init];

[timer startTimer];
// Do some work
[timer stopTimer];

NSLog(@"Total time was: %lf milliseconds", [timer timeElapsedInMilliseconds]);  
NSLog(@"Total time was: %lf seconds", [timer timeElapsedInSeconds]);
NSLog(@"Total time was: %lf minutes", [timer timeElapsedInMinutes]);

编辑:-timeElapsedInMilliseconds-timeElapsedInMinutes添加了方法

Timer.h:

#import <Foundation/Foundation.h>

@interface Timer : NSObject 
    NSDate *start;
    NSDate *end;


- (void) startTimer;
- (void) stopTimer;
- (double) timeElapsedInSeconds;
- (double) timeElapsedInMilliseconds;
- (double) timeElapsedInMinutes;

@end

Timer.m

#import "Timer.h"

@implementation Timer

- (id) init 
    self = [super init];
    if (self != nil) 
        start = nil;
        end = nil;
    
    return self;


- (void) startTimer 
    start = [NSDate date];


- (void) stopTimer 
    end = [NSDate date];


- (double) timeElapsedInSeconds 
    return [end timeIntervalSinceDate:start];


- (double) timeElapsedInMilliseconds 
    return [self timeElapsedInSeconds] * 1000.0f;


- (double) timeElapsedInMinutes 
    return [self timeElapsedInSeconds] / 60.0f;


@end

【讨论】:

这个类不包含dealloc方法。这不会泄漏吗? 如果我想使用这个类来重复执行一段代码(比如重复的 NSTimer),我该怎么做呢? 这个答案太可笑了,只有 1 票(现在是 2 票)。 由于[NSDate date]startTimerstopTimer 中自动释放,因此无法保证这些对象在稍后尝试使用它们之前由自动释放池释放,例如timeElapsedInSeconds。您应该将它们保留在startTimerstopTimer 中,并在其中释放之前的实例(以及在dealloc 方法中)以防止内存访问问题。 @yourfriendzak:我指的是在startTimerstopTimer 中构造的NSDate 对象;它们是自动释放的,因此它们的保留计数为零,并且它们可以随时由自动释放池释放。我可能会将startend 设为@property (nonatomic,retain),然后使用self.start = [NSDate date]self.end = [NSDate date]。在dealloc 中,需要通过覆盖dealloc 方法(当然应该在最后的超类中调用dealloc)来释放[start release][end release]start and end`。

以上是关于使用STM32CubeIDE编写EC11 定时器中断方式的主要内容,如果未能解决你的问题,请参考以下文章

STM32CubeIDE+FreeRTOS软件定时器实验

如何为协作项目设置 STM32CubeIDE?

STM32CubeIDE 中的 CMSIS DSP

STM32CubeIDE中文乱码

STM32CubeIDE 连接W5500模块作为TCPClient

傻瓜式教程:如何使用“多合一”开发工具STM32CubeIDE