呼叫原子哥,究竟用什么方法读取编码器的脉冲频率?

2019-07-20 21:41发布

我只需要读取编码器的脉冲频率,因为编码器的脉冲频率与电机转速成正比。所以我只需要读取两个编码器的脉冲频率,至于电机的方向,我通过看自己给的PWM控制波来查看。
但是我看好多人说用输入捕获不准确?那用什么办法?定时器编码器模式?还是外部时钟?我要读取编码器的脉冲频率,从而通过pid算法来设定电机pwm控制信号的占空比。
用编码器模式和外部时钟我不会,操作指南上面也没有看到历程,新手,求原子哥指教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
yyx112358
1楼-- · 2019-07-21 13:51
22599967 发表于 2016-6-15 10:46
编码器相当于外部时钟模式的计数器,所以不能用?这句话我听的不是太懂,能不能说下?我现在用的定时器的 ...

就是说编码器模式的时钟不是内部时钟,而是把外部的编码器信号输入作为了时钟,是“计数器模式”。因此,它只有计数功能,计数值只和外部编码器脉冲数有关,不能同时进行编码器计数和定时。所以必须要另外加上一个定时器,软件硬件定时器都行。
你的这个方案完全可行。我这个代码就是计数,测速是用ucos的一个任务来做的。硬件定时器也是可以的
22599967
2楼-- · 2019-07-21 14:01
 精彩回答 2  元偷偷看……
yyx112358
3楼-- · 2019-07-21 15:18
22599967 发表于 2016-6-15 10:59
多谢,我再自己看书再自己尝试下,现在就是不是很清楚,怎么实现让编码器模式的定时器用另外个定时器的时 ...

不需要用另外一个时钟啊。只需要定时读取编码器计数值就好了,比如这是我在ucos任务里面的代码:
[mw_shl_code=c,true]#define        ENCODER_READ_PERIOD        (1000)
void        Encoder_Task(void        *pdat)
{
        static int32_t        Encoder_Speed=0;
        ENCODER_Init();
       
        while(1)
        {
                Encoder_Speed=ENCODER_Read()/(ENCODER_READ_PERIOD/1000);//读取计数器值并计算
                ENCODER_Reset();//重置计数值
                OSMboxPost(mbox_speed,(void*)(&Encoder_Speed));//发送速度值
                delay_ms(ENCODER_READ_PERIOD);//延时
        }
}[/mw_shl_code]
写在定时器中断里面也差不多,只要把定时器周期设定成ENCODER_READ_PERIOD,然后再溢出中断里面进行计算和重置。Encoder_Speed用全局变量代替就行了
xinjiandianzi
4楼-- · 2019-07-21 19:37
 精彩回答 2  元偷偷看……
22599967
5楼-- · 2019-07-21 21:52
本帖最后由 22599967 于 2016-6-17 10:17 编辑
xinjiandianzi 发表于 2016-6-15 15:55
大哥你说的这个编码器是  电机上的光电编码器吗??

......
22599967
6楼-- · 2019-07-21 22:29
yyx112358 发表于 2016-6-15 11:30
不需要用另外一个时钟啊。只需要定时读取编码器计数值就好了,比如这是我在ucos任务里面的代码:
[mw_sh ...

ucos这个真的看不懂

一周热门 更多>