新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2017-8-5
- 在线时间
- 4 小时
|
发表于 2017-8-5 09:56:26
|
显示全部楼层
楼主你好,谢谢你分享的代码。有几个问题想请教一下。
1.我的代码里面 TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising ,TIM_ICPolarity_Rising); 是这样设置的,a,b相上升沿和下降沿都会产生计数,那么我的定时器的预设值是否应该是4*线数-1?
2.通过定时器得到了脉冲数之后,怎么计算速度?
3.能否楼主帮我看一下这段代码如何获取角度的?我刚开始学32,对于最后的中断处理程序搞不懂。。。
static int count=0;
static unsigned char firstflagcount=1;
/////初始化程序省略
/*******************************************************************************
* Function Name : ENC_Get_Electrical_Angle
* Description : Returns the absolute electrical Rotor angle
* Input : None
* Output : None
* Return : Rotor electrical angle: 0 -> 0 degrees,
* S16_MAX-> 180 degrees,
* S16_MIN-> -180 degrees
*******************************************************************************/
float ENC_Get_Electrical_Angle(void)
{
float temp;
temp = (TIM_GetCounter(ENCODER_TIMER)*1.0) *( 180.0/ (ENCODER_PPR))+180.0*count; //ÎÊÌâ5£ºÕâÀïΪʲҪ´ó·ÑÖÜÕÛÕâÑù×ö
return(temp);
}
/*******************************************************************************
* Function Name : LCD_Display
* Description : This function handles the display of timer counter, theta and
electronical frequency:
theta --- resolution: 1 degree; //resolution ·Ö±æÂÊ
electronical frequency --- resolution: 0.1Hz.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void LCD_Display(void)
{
float Theta;
u16 pulse;
char str[9];
pulse=TIM_GetCounter(ENCODER_TIMER);
Theta = ENC_Get_Electrical_Angle();
sprintf(str,"%6.2f",Theta);
LcdPutString(0,8,(char *)str);
sprintf(str,"%6d",rev);
LcdPutString(1,6,(char *)str);
sprintf(str,"%6d",pulse);
LcdPutString(2,6,(char *)str);
}
/*******************************************************************************
* Function Name : TIM3_IRQHandler
* Description : This function handles TIMx Update interrupt request.
Encoder unit connected to TIM3
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void TIM3_IRQHandler(void)
{
/* Clear the interrupt pending flag */
TIM_ClearITPendingBit(ENCODER_TIMER, TIM_FLAG_Update);
if((TIM3->CR1 & 0x0010)==0x0010) //Èç¹ûΪÏòϼÆÊý
{
if(count==0) //Èç¹ûTIM3Ϊ
{
count=1;
if(firstflagcount ==1)
{
firstflagcount=0;
}
else
{
rev--;
}
}
else
count--;
}
else //Èç¹ûΪÏòÉϼÆÊý
{
count++;
if(count >= 2)
{
count=0;
rev++;
}
}
}
|
|