使用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]
在startTimer
和stopTimer
中自动释放,因此无法保证这些对象在稍后尝试使用它们之前由自动释放池释放,例如timeElapsedInSeconds
。您应该将它们保留在startTimer
和stopTimer
中,并在其中释放之前的实例(以及在dealloc
方法中)以防止内存访问问题。
@yourfriendzak:我指的是在startTimer
和stopTimer
中构造的NSDate
对象;它们是自动释放的,因此它们的保留计数为零,并且它们可以随时由自动释放池释放。我可能会将start
和end
设为@property (nonatomic,retain)
,然后使用self.start = [NSDate date]
和self.end = [NSDate date]
。在dealloc
中,需要通过覆盖dealloc
方法(当然应该在最后的超类中调用dealloc
)来释放[start release]
和[end release]
的start and
end`。 以上是关于使用STM32CubeIDE编写EC11 定时器中断方式的主要内容,如果未能解决你的问题,请参考以下文章