stm32f103 編碼器模式總結(jié)
/**************************************************************************
函數(shù)功能:把TIM2初始化為編碼器接口模式
入口參數(shù):無
返回 值:無
**************************************************************************/
void Encoder_Init_TIM2(void)
{
RCC->APB1ENR|=1<<0; //TIM2時鐘使能
RCC->APB2ENR|=1<<2; //使能PORTA時鐘
GPIOA->CRL&=0XFFFFFF00;//PA0 PA1
GPIOA->CRL|=0X00000044;//浮空輸入
/* 把定時器初始化為編碼器模式 */
TIM2->DIER|=1<<0; //允許更新中斷
TIM2->DIER|=1<<6; //允許觸發(fā)中斷
MY_NVIC_Init(1,3,TIM2_IRQn,1);
/* Timer configuration in Encoder mode */
TIM2->PSC = 0x0;//預(yù)分頻器
TIM2->ARR = 65535;//設(shè)定計(jì)數(shù)器自動重裝值
TIM2->CR1 &=~(3<<8);// 選擇時鐘分頻:不分頻
TIM2->CR1 &=~(3<<5);// 選擇計(jì)數(shù)模式:邊沿對齊模式,計(jì)數(shù)器依據(jù)方向位DIR向上向下計(jì)數(shù)
//這里的計(jì)數(shù)方向根據(jù)TI1和TI2脈沖前后硬件決定
TIM2->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
TIM2->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2
TIM2->CCER &= ~(1<<1); //CC1P='0' IC1FP1不反相,IC1FP1=TI1
TIM2->CCER &= ~(1<<5); //CC2P='0' IC2FP2不反相,IC2FP2=TI2
TIM2->CCMR1 |= 3<<4; // IC1F='1000' 輸入捕獲1濾波器
TIM2->SMCR |= 3<<0; //SMS='011' 所有的輸入均在上升沿和下降沿有效
if(Menu_MODE==1) TIM2->CNT = 10000; //位置模式
else TIM2->CNT = 0; //速度模式
TIM2->CR1 |= 0x01; //CEN=1,使能定時器
}
/**************************************************************************
函數(shù)功能:把TIM2編碼器接口模式中斷
--
--
**************************************************************************/
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0X0001)//溢出中斷
{
}
TIM2->SR&=~(1<<0);//清除中斷標(biāo)志位
}
/**************************************************************************
函數(shù)功能:單位時間讀取編碼器計(jì)數(shù)
入口參數(shù):定時器
返回 值:速度值 重點(diǎn)在于清零CNT寄存器的值
**************************************************************************/
int Read_Velocity(u8 TIMX)
{
int Encoder_TIM;
switch(TIMX)
{
case 2: Encoder_TIM= (short)TIM2 -> CNT; TIM2 -> CNT=0; break;
case 3: Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0; break;
case 4: Encoder_TIM= (short)TIM4 -> CNT; TIM4 -> CNT=0; break;
default: Encoder_TIM=0;
}
}
/**************************************************************************
函數(shù)功能:讀取位置信息
入口參數(shù):定時器
返回 值:位置值 重點(diǎn)在于不清零CNT寄存器的值
**************************************************************************/
int Read_Position(u8 TIMX)
{
int Encoder_TIM;
switch(TIMX)
{
case 2: Encoder_TIM= (short)TIM2 -> CNT; break;
case 3: Encoder_TIM= (short)TIM3 -> CNT; break;
case 4: Encoder_TIM= (short)TIM4 -> CNT; break;
default: Encoder_TIM=0;
}
return Encoder_TIM;
}