stm32正交编码器学习.docx
《stm32正交编码器学习.docx》由会员分享,可在线阅读,更多相关《stm32正交编码器学习.docx(8页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、最近做一个项目,主控芯片用STM32RBT6,要用到光栅尺,本来带一个控制器的,通过控制器的232可以读取光栅尺的数据,但这个控制器太大,设备中放不下,于是,考虑自己做一个,网上看到很多有用CPLD的方案,后来无意间发现stm32的定时器可以配置成编码器,甚喜高兴之余,突然发现stm32的定时器是16位的,我的光栅尺的计数会超过65535,于是在21ic论坛上和几位高手请教,最终确定的方案工作过程是配置TIM3为正交编码器模式,并定一个10ms的中断,每10ms读取一次计数值,10ms的前提是在10ms内计数器不溢出(这个思想要感谢21ic的lxyppc)以下是部分代码:(这些代码修改于ST官
2、方的例程,但我的工程用的是V3的固件库,他们的例程貌似是0.3的,所以有些地方有改动)下面是初始化TIM3为正交编码器模式void ENC_Init(void)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;/* Encoder unit connected to TIM3, 4X mode */ GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;/* TIM3 clock sour
3、ce enable */ 使能端口时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);/* Enable GPIOA, clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_StructInit(&GPIO_InitStructure);/* Configure PA.06,07 as encoder input */设置端口为输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitSt
4、ructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Enable the TIM3 Update Interrupt */使能定时器3更新中断NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY;NVIC_InitStructure.NVIC_IRQChannelSubPriorit
5、y = TIMx_SUB_PRIORITY;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Timer configuration in Encoder mode */ 配置编码器模式TIM_DeInit(ENCODER_TIMER);TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0x0; / No prescaling TIM_TimeBaseStructu
6、re.TIM_Period = ENCODER_TIM_PERIOD; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(ENCODER_TIMER, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(ENCODER_TIMER, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_IC
7、Polarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;TIM_ICInit(ENCODER_TIMER, &TIM_ICInitStructure);/ Clear all pending interruptsTIM_ClearFlag(ENCODER_TIMER, TIM_FLAG_Update);TIM_ITConfig(ENCODER_TIMER, TIM_IT_Update, ENABLE);/Reset counterTIM2-CNT
8、= COUNTER_RESET;/ ENC_Clear_Speed_Buffer();TIM_Cmd(ENCODER_TIMER, ENABLE); 以下为获取一次计数值,此算法来自lxyppc,可以规避超过16位的情况,具体细节见s16 ENC_Get_Electrical_Angle(void)static u16 lastCount = 0;u16 curCount = ENCODER_TIMER-CNT;s32 dAngle = curCount - lastCount;if(dAngle = MAX_COUNT) dAngle -= ENCODER_TIM_PERIOD;else i
9、f(dAngle CNT;s32 dAngle = curCount - lastCount;if(dAngle = MAX_COUNT) dAngle -= ENCODER_TIM_PERIOD;elseif(dAngle 1000+5=5反转7 5-7=-2+1000 = 998最终值 998因此总共转了998-995 = 3个步长,与实际情况相同/* Function Name : TIM2_IRQHandler* Description : This function handles TIM2 global interrupt request.* Input : None* Outpu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stm32 正交 编码器 学习
限制150内