最近在搞STM32F429控制电机,用的增量编码器,使用TIMx(1-8)对编码器的值进行采集,终于调试成功了,将配置代码和大家分享一下!
用的TIM8的CH1和CH2通道(CH3和CH4通道不可以),其他几个定时器(TIM3和TIM5等的CH1和CH2都测试过,可以的)
#define Encoder_Val TIM8->CNT
void TIM8_Encoder_Init(void)//TIM8_Encoder_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<1; //TIM8时钟使能
RCC->AHB1ENR|=1<<2;//使能PORTC时钟
GPIO_Set(GPIOC,PIN6,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
GPIO_AF_Set(GPIOC,6,3); //PC6,AF3
GPIO_Set(GPIOC,PIN7,GPIO_MODE_AF,GPIO_OTYPE_OD,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
GPIO_AF_Set(GPIOC,7,3);//PC7,AF3
TIM8->CCMR1&=0xFCFC; // CC1S=1;CC2S=1;
TIM8->CCMR1|=1<<0;
TIM8->CCMR1|=1<<8;
TIM8->CCER&=0xFF55; //CC1P=0;CC2P=0;
TIM8->CCER|=0<<0;
TIM8->CCER|=0<<4;
TIM8->SMCR&=0xFFF8; //SMS=011; 这里需不需要使能呢?
TIM8->SMCR|=1<<0;
TIM8->CR1|=0<<7; //ARPE使能
MY_NVIC_Init(1,3,TIM8_UP_TIM13_IRQn,2);//0 2 2
TIM8->CR1|=1<<0; //使能定时器8
TIM8->CNT=1000;
}
然后读Encoder_Val的值就可以啦
也可以定义#define Direction 0x0001&(TIM8->CR1>>4)去判断电机的转向,0反转 1正转
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
感谢分享,希望对以后用到的人能有所帮助!不过真心发现寄存器版的相关帖子太少!
一周热门 更多>