|
/*- TIM5編碼器模式配置 -*/
//TIM_DeInit(TIM5);
TIM_TimeBaseStructure.TIM_Period = 65535;//計(jì)次數(shù);
TIM_TimeBaseStructure.TIM_Prescaler = 0;//
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge); //配置編碼器模式觸發(fā)源和極性
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 選擇輸入端 IC1映射到TI2上
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; //上升沿捕獲
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI2上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置輸入分頻,不分頻?
TIM_ICInitStructure.TIM_ICFilter = 0x01;//IC1F=0000 配置輸入濾波器 不濾
TIM_ICInit(TIM5, &TIM_ICInitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//搶占優(yōu)先級(jí)2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優(yōu)先級(jí)3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
TIM_SetCounter(TIM5,0);
TIM_Cmd(TIM5, ENABLE); //啟動(dòng)TIM5定時(shí)器
}
/**************************************************************************
函數(shù)功能:?jiǎn)挝粫r(shí)間讀取編碼器計(jì)數(shù),此函數(shù)在定時(shí)器中斷里面用我的是定時(shí)器6每隔5ms讀取一次
入口參數(shù):定時(shí)器
返回 值:計(jì)數(shù)值
**************************************************************************/
int x=0;
int Read_Encoder(u8 TIMX)
{
int Encoder_TIM;
switch(TIMX)
{
case 3: Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0;break;//
case 4: Encoder_TIM= (short)TIM4 -> CNT; TIM4 -> CNT=0;break;
case 5: Encoder_TIM= (short)TIM5 -> CNT; TIM5 -> CNT=0;break;
default: Encoder_TIM=0;
}
return Encoder_TIM;
}
初始化編碼選擇編碼模式
TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);主函數(shù),距離可通過串口打印出來
int main(void)
{
uart_init(115200); //USART1_TX PA9 USART1_RX PA10
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
delay_init();
MOTOR_Init(); //PC0,1 2 3
TIM6_Mode_Config_Init(); //使能定時(shí)器6 5ms中斷一次
TIM4_Encoder_Init(); //使能TIM4對(duì)應(yīng)的編碼器 //PB6 PB7
TIM5_Encoder_Init(); //使能TIM5對(duì)應(yīng)的編碼器 //PA0 PA1
while(1)
{
;
}
}
void TIM6_IRQHandler(void) //定是時(shí)間不能太長(zhǎng)否則計(jì)數(shù)器溢出了就會(huì)測(cè)量錯(cuò)誤
{
if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
{
danweilenth( Read_Encoder(4),Read_Encoder(5)); //每隔5ms中斷一次 讀取對(duì)應(yīng)CNT的值,并計(jì)算路程
printf("Encoder.M1Lneth=%f\r\n",Encoder.M1Lneth);//打印出電機(jī)1的路程
printf("Encoder.M2Lneth=%f\r\n",Encoder.M2Lneth);//打印出電機(jī)2的路程
}
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
}
相關(guān)代碼下面有下載可自行下:
兩個(gè)編碼器測(cè)距代碼.7z
(191.89 KB, 下載次數(shù): 25)
2021-6-28 02:23 上傳
點(diǎn)擊文件名下載附件
|
|