现在可以用编码器读取计数器的值了,但是怎么去测速呢?

2019-08-14 18:49发布

编码器怎么去测速呢?怎么通过PWM去控制直流电机呢?求教各位大神!最近在用直流电机,希望大家可以帮帮忙!谢谢啦!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
joe_knight
1楼-- · 2019-08-16 07:05
使用另一个定时器中断来进行周期测速,高频计数脉冲就是M/T法的M2,编码器计数是M1,测速的公式N= (60 * f0*M1) / (P*M2),式中,
P在你项目里是400*4,f0是测速高频脉冲定时器的频率;编码器A和B相,相位差90,每一个边沿会进行一次计数,那么每一线就是4次计数了;
对于M/T法测速,这里说的还比较详细:http://www.61ic.com/Article/C2000/C24X/200407/129.html
张晓斌
2楼-- · 2019-08-16 12:02
回复【13楼】joe_knight:
---------------------------------
基本上明白了,太感谢了!
张晓斌
3楼-- · 2019-08-16 18:01
回复【13楼】joe_knight:
---------------------------------
思路是不是这样啊!我用TIM2产生5ms中断,TIM3作为编码器计数。进入TIM2中断后,使能TIM3,然后M1=TIM3->CNT,M2=TIM2->CNT。这样的话M2应该是确定的就是TIM2的计时器预装载值,这样对吗?
joe_knight
4楼-- · 2019-08-16 18:03
 精彩回答 2  元偷偷看……
张晓斌
5楼-- · 2019-08-16 18:03
回复【16楼】joe_knight:
---------------------------------
哦哦!如果还是TIM2产生5MS定时中断,那么进入TIM2中断后,应该使能TIM3和TIIM5,TIM5作为高频f0脉冲,这样就可以实现TIM3和TIM5的同步,然后M1=TIM3->CNT,M2=TIM5->CNT.测速的电机转速低,所以5MS应该可以了!通过M1计算得到弧长,也就是角位移,然后根据M2 f0可以得到脉冲时间,这样就可以得到转速。对了,在退出中断是得失能TIM3和TIM5.
张晓斌
6楼-- · 2019-08-16 19:49
回复【16楼】joe_knight:
---------------------------------
void TIM5_Configuration(void)
{
   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
   TIM_ClearITPendingBit(TIM5,TIM_IT_Update); 
   
   TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
   TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
   TIM_TimeBaseInitStructure.TIM_Period=1600;
   TIM_TimeBaseInitStructure.TIM_Prescaler=71;
    
   TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
    
   TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
    
   //TIM_Cmd(TIM5,ENABLE);
}//TIM5作为高速脉冲计数
void TIM2_Configuration(void)
{
   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
   TIM_ClearITPendingBit(TIM2,TIM_IT_Update); 
   
   TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
   TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
   TIM_TimeBaseInitStructure.TIM_Period=50-1;
   TIM_TimeBaseInitStructure.TIM_Prescaler=7199;//定时5ms
    
   TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
    
   TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    
   TIM_Cmd(TIM2,ENABLE);
}

void TIM2_IRQHandler(void)
{
  u16 M1=0,M2=0;
    
  TIM_Cmd(TIM3,ENABLE);
  TIM_Cmd(TIM5,ENABLE);
    
  M1=TIM3->CNT;
  M2=TIM5->CNT; 
  n=60*(1000000)*M1/(M2*4*400); 
  
  TIM_Cmd(TIM3,DISABLE);
  TIM_Cmd(TIM5,DISABLE);
    
  TIM_ClearITPendingBit(TIM2,TIM_IT_Update); 
    
}
这样有什么问题吗?为什么测得的n一直是0呢?是按照那个思路啊?哪里不对啊?

一周热门 更多>