STM32读取伺服电机编码器信号
本人所搭建的平臺包括電源,STM32F103開發板,copley驅動器和maxon伺服直流電機,開發板通過驅動器讀取電機編碼器的信號,所用定時器為定時器8,同時讀取編碼器AB相,自動重裝載值為3999,故電機軸旋轉一圈,定時器從0計數到3999,但由于電機前端安裝有減速箱,即輸出軸為減速器的軸,減速比為128:1,故輸出軸旋轉一圈,定時器8的計數值應為128X4000=512000。
代碼如下:
void TIM8_Encoder_Init(void)
{
?? ?GPIO_InitTypeDef ?GPIO_InitTypestruct;
?? ?TIM_TimeBaseInitTypeDef ?TIM_TimeBaseInitTypestruct;
?? ?TIM_ICInitTypeDef ?TIM_ICInitTypestruct;
?? ?NVIC_InitTypeDef ?NVIC_InitTypestruct;
?? ?
?? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_TIM8,ENABLE);
//?? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
?? ?GPIO_InitTypestruct.GPIO_Mode=GPIO_Mode_IPD;
?? ?GPIO_InitTypestruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
?? ?GPIO_InitTypestruct.GPIO_Speed=GPIO_Speed_50MHz;?
?? ?GPIO_Init(GPIOC,&GPIO_InitTypestruct);
?? ?TIM_TimeBaseInitTypestruct.TIM_Period=3999;
?? ?TIM_TimeBaseInitTypestruct.TIM_Prescaler=0;
?? ?TIM_TimeBaseInitTypestruct.TIM_CounterMode=TIM_CounterMode_Up;
?? ?TIM_TimeBaseInitTypestruct.TIM_ClockDivision=TIM_CKD_DIV1;
?? ?TIM_TimeBaseInitTypestruct.TIM_RepetitionCounter=0;
?? ?TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInitTypestruct);
?? ?
?? ?TIM_EncoderInterfaceConfig(TIM8,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);??
// ?TIM_ICStructInit(&TIM_ICInitTypestruct);
?? ?TIM_ICInitTypestruct.TIM_Channel=TIM_Channel_1;
?? ?TIM_ICInitTypestruct.TIM_ICFilter=15;
//?? ?TIM_ICInitTypestruct.TIM_ICPolarity=TIM_ICPolarity_BothEdge;
? TIM_ICInitTypestruct.TIM_ICPolarity=TIM_ICPolarity_Rising;
?? ?TIM_ICInitTypestruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;
?? ?TIM_ICInitTypestruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
?? ?TIM_ICInit(TIM8,&TIM_ICInitTypestruct);
//?? ?TIM_ICInitTypestruct.TIM_Channel=TIM_Channel_2;
//?? ?TIM_ICInitTypestruct.TIM_ICFilter=15;
?? ?TIM_ICInitTypestruct.TIM_ICPolarity=TIM_ICPolarity_BothEdge;
// ?TIM_ICInitTypestruct.TIM_ICPolarity=TIM_ICPolarity_Rising;
//?? ?TIM_ICInitTypestruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;
//?? ?TIM_ICInitTypestruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
//?? ?TIM_ICInit(TIM8,&TIM_ICInitTypestruct);
// ?TIM8->CR1&=~(3<<5);
//?? ?TIM8->CCMR1|=1<<0;
//?? ?TIM8->CCMR1|=1<<8;
//?? ?TIM8->CCER&=~(2<<0);
//?? ?TIM8->CCER&=~(1<<5);
?? ?NVIC_InitTypestruct.NVIC_IRQChannel=TIM8_UP_IRQn;
?? ?NVIC_InitTypestruct.NVIC_IRQChannelCmd=ENABLE;
?? ?NVIC_InitTypestruct.NVIC_IRQChannelPreemptionPriority=0;
?? ?NVIC_InitTypestruct.NVIC_IRQChannelSubPriority=0;
?? ?NVIC_Init(&NVIC_InitTypestruct);
?? ?
?? ?TIM_ARRPreloadConfig(TIM8,ENABLE);
?? ?TIM_ClearFlag(TIM8,TIM_FLAG_Update);
?? ?TIM_ClearITPendingBit(TIM8,TIM_IT_Update);
?? ?TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE);?
?? ?TIM_SetCounter(TIM8,0);
?? ?TIM_Cmd(TIM8,ENABLE);? ??
}
總結
以上是生活随笔為你收集整理的STM32读取伺服电机编码器信号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记本键盘扣安装注意事项(小技巧)
- 下一篇: 机器学习算法之线性回归