打印

stm32输出一个脉冲数和频频率都可调的最少用几个Timer?

[复制链接]
15169|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
目前正在做一个东西,用stm32给电机发脉冲,电机要求可定位,可调速,有编码器反馈,完成这东西最少要用几个定时器呢?
沙发
香水城| | 2010-6-28 19:12 | 只看该作者
你最好具体点,要求什么样的波形。没做个电机,我不知道要求可定位、可调速的电机需要什么的波形。

使用特权

评论回复
板凳
worldsing|  楼主 | 2010-6-28 19:53 | 只看该作者
电机是个小的伺服机,需要高速转时输入为300K的方波,在高速转时需要平滑起动和停止;
定位在低速定位,转时要发30K的方波,30K方波的输出个数要求可设置,之后要与编码器的反馈作比较

使用特权

评论回复
地板
worldsing|  楼主 | 2010-6-28 20:44 | 只看该作者
算了一下得用4个才够。。。

使用特权

评论回复
5
香水城| | 2010-6-28 21:53 | 只看该作者
电机是个小的伺服机,需要高速转时输入为300K的方波,在高速转时需要平滑起动和停止;
定位在低速定位,转时要发30K的方波,30K方波的输出个数要求可设置,之后要与编码器的反馈作比较 ...
worldsing 发表于 2010-6-28 19:53


如果是这样,应该最多3个TIM。

使用特权

评论回复
6
worldsing|  楼主 | 2010-6-28 22:53 | 只看该作者
我现在对TIM的同步还是不太理解, 香水城可否说个大体的框架,手册上说触发事件(计数器启动、停止、初始化或者同内部/外部触发计数)可以产生中断,但是在中断允许寄存器没有发现这些东西是可以控制的,比如,说编码器的0位信号、位移传感器、接近开关信号,如果用这些信号来启动、复位、停止、初始化定时器或是生产中断的话,应该用什么模式呢?

使用特权

评论回复
7
worldsing|  楼主 | 2010-6-29 08:55 | 只看该作者
香主,有没有关于类似的应用案例,我今天得好好看一下手册

使用特权

评论回复
8
worldsing|  楼主 | 2010-6-29 10:17 | 只看该作者
TIM1输出脉冲,TIM2对TIM1进行计数,但是TIM2的启动、停止、复位外部控制,这个怎么实现呢?

使用特权

评论回复
9
香水城| | 2010-6-29 10:35 | 只看该作者
关于定时器的同步问题,首先要先看STM32参考手册上的相关说明,然后再看看STM32固件库中的例子,在最新的STM32固件库中有4个有关同步定时器的例子:

STM32_FWLib_TIM_Example.gif (138.01 KB )

STM32_FWLib_TIM_Example.gif

使用特权

评论回复
10
worldsing|  楼主 | 2010-6-29 21:43 | 只看该作者
白天上不方便

使用特权

评论回复
11
worldsing|  楼主 | 2010-6-29 21:49 | 只看该作者
我要对输出脉冲个数控制的话,如果用TIM1输出脉冲,用TIM2计TIM1输出脉冲的个数,需要把TIM1的输出管脚边到CH1连到TIM2的管脚CH1上吗?

在中断里计数上不了频率,用RCR的话,个数满足不了

使用特权

评论回复
12
worldsing|  楼主 | 2010-6-29 22:21 | 只看该作者


我看了一下香主提的那几个例子,但是有几点不明白的地方:
举一个例子:我以TIM1以比较输出方式输出30K的脉冲,用TIM2来计数输出的脉冲个数,到达5000个脉冲(假设)后,关闭TIM1。首先配置TIM1为主模式,输出触发源CH1REF,而后配置TIM2为从模式,输入的TS位以TIM1的ITR0, TIM2的模式位就有点不明白了,不知道应该那个模式
1、TS触发源给到TIM2后是是作CEN启、停用还是作TIM2的时钟输入呢?
2、TIM2应该什么模式,从模式寄存器的SMS位为111时手册上写的是外部时钟模式1,而书上写的外部时钟模式2?设置为从模式时时钟是谁给的?PCLK?
3、TIM2计到5000后,不经中断可以关TIM1么?
4、以上说的按照给定的脉冲个数输出,还有300K输出脉冲频率平滑启动和停止,这种方法是不是最佳的?有没有更好的方法呢?

第一次用stm32,希望能得到香主和各位网友的指点,谢谢

使用特权

评论回复
13
worldsing|  楼主 | 2010-6-29 22:43 | 只看该作者
今天先试了stm32的编码器接口,编码器是一家德国出的,一转是5000个细分点,A、B、Z相接口,即sin、cos、zero接口的。用zero的下降沿触发外部中断,然后,起动TIM5的编码器接口,开始计数。计数值为5000*4-1,这样可以做到低速下的绝对位置反馈

我感觉用zero信号触发中断再开TIM5的编码计数器,是不是有点多余了,怎么设置能不能直接用它来启动TIM5呢,不过有一个问题:zero信号是一转有一个脉冲的哦,用它来直接起动TIM5,编码器每转一转,来一个CEN会不会出乱呢?

使用特权

评论回复
14
worldsing|  楼主 | 2010-6-30 08:54 | 只看该作者
stm32的TIM很强大,但是手册写得有点散乱

使用特权

评论回复
15
无冕之王| | 2010-6-30 10:33 | 只看该作者
同意楼上的观点

使用特权

评论回复
16
无冕之王| | 2010-6-30 10:34 | 只看该作者
这手册有时挺难看明白

使用特权

评论回复
17
32446975| | 2010-6-30 18:22 | 只看该作者
一个定时器即可。请参考:

<转>张明峰的Bloghttp://www.myhcs08.com/blog/info/article_detail.aspx?id=248
实现多路任意延时的一种方法2007-11-27
一个单片机系统的设计经常会用到多种不同目的和用图的定时,例如系统需要输出一个指示“心跳正常”的秒闪信号,间隔0.5s;按键检测时临时需要约20ms的消抖;蜂鸣器需要发声延时;用户菜单选择时可能需要对应的发光管或LCD点阵(字段)闪烁;通讯时需要设定应答超时判别,等等。是不是要抱怨一个单片机上的若干个定时器不够用了?其实,用一个定时器资源就可以搞定所有的这一切定时要求。
1)首先,选定一个你喜欢的定时器,按所需应用的定时精度要求设定其定时中断频率。一般人机界面的定时精度为ms级就足够了,所以可以设定定时中断时间间隔为1ms,5ms或10ms;例如我的选择:
//==============================================================
// TPM2 overflow interrupt service routine
// Interrupt at every 1ms
//==============================================================
void interrupt 14 TPM2_Overflow_ISR(void)
{
TPM2SC_TOF = 0; //reset interrupt flag
msTimeoutCount++; //1ms increment
}
变量msTimeoutCount是一个16位word型的静态变量,在中断服务程序中简单地对它递增,无需考虑溢出。如果你的中断时间间隔为Nms,则在中断中对其递增的方法为“msTimeoutCount += N”。它在程序模块的前面被声明,为了提高中断服务程序的效率,其被定位在直接寻址区:
。。。。。。。。。。。。

使用特权

评论回复
18
worldsing|  楼主 | 2010-6-30 19:38 | 只看该作者
一个定时器即可。请参考:

张明峰的Bloghttp://www.myhcs08.com/blog/info/article_detail.aspx?id=248
实现多路任意延时的一种方法2007-11-27
一个单片机系统的设计经常会用到多种不同目的和用图的定时,例如系统 ...
32446975 发表于 2010-6-30 18:22


你的做法我能理解,但是以什么样的算法从0Hz到300kHz,实现一个平滑的起停过程,要求加速时间和减速时间可设置,可固定于任意频率,任意的脉冲数。中断方式可能会影响系统的时实性,系统中还有很多传感器呢,且在这个系统中一共是3个电机,如果在3个电机同时加减速呢。。。。。

使用特权

评论回复
19
xwj| | 2010-6-30 19:45 | 只看该作者
300kHz???

什么电机能跑到300kHz?

使用特权

评论回复
20
worldsing|  楼主 | 2010-6-30 22:11 | 只看该作者
伺服电机,输入频率与转速比有关系,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

346

帖子

0

粉丝