@[TOC]目录
ABZ编码器 4096线
买的是这个
AB相代表计数方向,Z代表过零点
cubemx配置
定时器Encoder
也可以选上DMA
中断
Z相GPIO中断
找一个空闲管脚
打开对应中断
代码
不用DMA
int main(void)
{
short Enc_cnt = 0;
HAL_TIM_Encoder_Start_IT(&htim4,TIM_CHANNEL_1|TIM_CHANNEL_2); //开启定时器的编码器模式中断
while (1)
{
Enc_cnt = (short)__HAL_TIM_GET_COUNTER(&htim4);
float angle = 360.0/4.0/4096.0*(float)Enc_cnt;
}
}
//GPIO中断,过零点清零
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == GPIO_PIN_13){/* KEY */
/* 翻转LED */
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
// __HAL_TIM_SET_COUNTER(&htim4, 0);
if(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim4)){
htim4.Instance->CNT+=16384; //4*4096
}
else{
htim4.Instance->CNT-=16384;
}
}
}
用DMA
int main(void)
{
short Enc_cnt = 0;
uint32_t encoderValue[2];
HAL_TIM_Base_Start(&htim4);
HAL_TIM_Encoder_Start_DMA(&htim4,TIM_CHANNEL_1|TIM_CHANNEL_2,&encoderValue[0],&encoderValue[1],2);
while (1)
{
Enc_cnt = (short)__HAL_TIM_GET_COUNTER(&htim4);
float angle = 360.0/4.0/4096.0*(float)Enc_cnt;
}
}
//GPIO中断,过零点清零
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == GPIO_PIN_13){/* KEY */
/* 翻转LED */
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
// __HAL_TIM_SET_COUNTER(&htim4, 0);
if(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim4)){
htim4.Instance->CNT+=16384;
}
else{
htim4.Instance->CNT-=16384;
}
}
}
效果
过机械零点就+/-360