请教下论坛里有没有哪位大神用SYM32的编码器接口做过编码器位置控制的?小弟刚刚学习这一块,遇到了一些问题,我的程序是这样的:
//TIME3 编码器接口模式
//编码器模式初始化
void encoder_Init(u16 ENCODER_TIM_PERIOD,u16 COUNTER_RESET)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0X00FFFFFF;
GPIOA->CRL|=0X4400000;//PA6,7浮空输入
TIM3->DIER|=1<<0; //允许更新中断
TIM3->DIER|=1<<6; //允许触发中断
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);
/* Timer configuration in Encoder mode */
TIM3->
SC = 0x0;//预分频器
TIM3->ARR = ENCODER_TIM_PERIOD;//设定计数器自动重装值
TIM3->CR1 &=~(3<<8);// 选择时钟分频:不分频
TIM3->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式
TIM3->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
TIM3->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2
TIM3->CCER &= ~(1<<1);
//CC1P='0'
IC1FP1不反相,IC1FP1=TI1
TIM3->CCER &= ~(1<<5);
//CC2P='0'
IC2FP2不反相,IC2FP2=TI2
TIM3->CCMR1 |= 3<<4; //
IC1F='1000' 输入捕获1滤波器
TIM3->SMCR |= 3<<0;
//SMS='011' 所有的输入均在上升沿和下降沿有效
TIM3->CNT = COUNTER_RESET; //计数器初始值
TIM3->CR1 |= 0x01; //CEN=1,使能定时器
}
然后在主函数里读出计数器的值:
encoder_Init(1999,0);
while(1)
{
delay_ms(100);
currentCount=TIM3->CNT;
}
现在是当电机转动时,要么读不出数据,currentCount一直为0 ,要么就是读出的数据为ENCODER_TIM_PERIOD(即是1999).而且之后也一直是这个值不会变化。不知是什么情况?望有这方面经验的兄弟们指教。还有就是我想用编码器来做定位,该怎么来实现呢?
---------------------------------
问题是解决了,但是具体是什么样的原因我也不是很清楚,程序也基本没变,就是可以了。
//TIME4 编码器接口模式
//编码器模式初始化
void encoder_Init()
{
RCC->APB1ENR|=1<<2;//TIM4时钟使能
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOB->CRL&=0XF0FFFFFF;//PB6
GPIOB->CRL|=0X04000000;//浮空输入
GPIOB->CRL&=0X0FFFFFFF;//PB7
GPIOB->CRL|=0X40000000;//浮空输入
TIM4->DIER|=1<<0; //允许更新中断
TIM4->DIER|=1<<6; //允许触发中断
MY_NVIC_Init(1,3,TIM4_IRQChannel,2);
/* Timer configuration in Encoder mode */
TIM4->SC = 0x00;//预分频器
TIM4->ARR = 2000;//设定计数器自动重装值
TIM4->CR1 &=~(3<<8);// 选择时钟分频:不分频
TIM4->CR1 &=~(3<<5);// 选择计数模式:边沿对齐模式
TIM4->CCMR1 |= 1<<0; //CC1S='01' IC1FP1映射到TI1
TIM4->CCMR1 |= 1<<8; //CC2S='01' IC2FP2映射到TI2
TIM4->CCER &= ~(1<<1); //CC1P='0' IC1FP1不反相,IC1FP1=TI1
TIM4->CCER &= ~(1<<5); //CC2P='0' IC2FP2不反相,IC2FP2=TI2
TIM4->CCMR1 |= 3<<4; // IC1F='1000' 输入捕获1滤波器
TIM4->SMCR |= 3<<0; //SMS='011' 所有的输入均在上升沿和下降沿有效
TIM4->CNT = 0; //计数器初始值
TIM4->CR1 |= 1<<0; //CEN=1,使能定时器
}
主程序里:
while(1)
{
delay_us(50);
currentCount=TIM4->CNT;
}
一周热门 更多>