stm32 HAL库 4096线ABZ编码器
2023-12-30 16:00:21
@[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
文章来源:https://blog.csdn.net/baidu_41704597/article/details/135304708
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!