/*
* File: APP_Coder.c
* Author: xiaobuding
* Comments: 旋转编码器
* Data: 2023/11/3
* Revision history: V0.1
*/
/* Includes -----------------------------------------------------------------*/
#include "App_Coder.h"
/* Defines ------------------------------------------------------------------*/
/* Variables Define ---------------------------------------------------------*/
struct ST_CODER Coder_State;
/* Function prototypes ------------------------------------------------------*/
/*******************************************************************************
* 函数名:User_Coder_Init
* 描述 :编码器初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void User_Coder_Init(void)
{
Coder_GPIO_Init();
Coder_Data_Init();
}
/*******************************************************************************
* 函数名:Coder_GPIO_Init
* 描述 :编码器引脚初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void Coder_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(CODER1_GPIO_RCC, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = A1_Pin | B1_Pin;//PD1,PD2
GPIO_Init(CODER1_GPIO, &GPIO_InitStructure);//GPIOD
}
/*******************************************************************************
* 函数名:Coder_Data_Init
* 描述 :编码器相关变量初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void Coder_Data_Init(void)
{
Coder_State.Count = 1000;
Coder_State.bits.Spin = 0;
Coder_State.bits.Left_Spin = 0;
Coder_State.bits.Right_Spin = 0;
Coder_State.bits.A_Last_State = Read_A1_State(); // 首次启动,防止编码器误判;
}
/*******************************************************************************
* 函数名:Coder_Scan
* 描述 :编码器动作扫描
* 输入 :void
* 输出 :void
* 调用 :1ms
* 备注 :
*******************************************************************************/
void Coder_Scan(void)
{
if(Read_A1_State() != Coder_State.bits.A_Last_State) //A相出现跳变,表示编码器开始被转动
{
Coder_State.bits.Spin = 1; // 转动标志
Coder_State.Count = 500;
if (Read_A1_State() == Read_B1_State()) // 根据编码器波形,AB同相表示顺时针转动
{
Coder_State.bits.Left_Spin = 1; // 左转----逆时针
Coder_State.bits.Right_Spin = 0;
Uart1Prints("\r\n*anticlocwise$");//打印逆时针
}
else
{
Coder_State.bits.Left_Spin = 0;
Coder_State.bits.Right_Spin = 1; // 右转----顺时针
Uart1Prints("\r\n*clockwise$");//打印顺时针
}
Coder_State.bits.A_Last_State = Read_A1_State(); // 记录A相上一次状态,用于下一次判定
}
if (Coder_State.Count == 0)
{
Coder_State.bits.Spin = 0; // 停止转动
}
else
{
Coder_State.Count--;
}
}
/*******************************************************************************
* 函数名:Read_A1_State
* 描述 :1号编码器A相识别
* 输入 :void
* 输出 :uint8_t
* 调用 :
* 备注 :
*******************************************************************************/
uint8_t Read_A1_State(void)
{
if(GPIO_ReadInputDataBit(CODER1_GPIO,A1_Pin) == 0)
{
return 0;
}
else
{
return 1;
}
}
/*******************************************************************************
* 函数名:Read_B1_State
* 描述 :1号编码器B相识别
* 输入 :void
* 输出 :uint8_t
* 调用 :
* 备注 :
*******************************************************************************/
uint8_t Read_B1_State(void)
{
if(GPIO_ReadInputDataBit(CODER1_GPIO,B1_Pin) == 0)
{
return 0;
}
else
{
return 1;
}
}
中空轴型编码器的示例代码
需积分: 5 111 浏览量
2023-11-28
13:29:08
上传
评论
收藏 5KB ZIP 举报
xiaobuding_QAQ
- 粉丝: 2812
- 资源: 37
最新资源
- 基于MATLAB自然图像的随机数发生器的设计与实现
- 基于MATLAB的图像分割源码+详细文档+全部数据(高分课程设计).zip
- 基于MATLAB的图像分割源码+详细文档+全部数据(高分课程设计).zip
- 基于MINST数据库的手写体数字识别CNN设计,MATLAB实现源码+全部资料.zip
- 基于MINST数据库的手写体数字识别CNN设计,MATLAB实现源码+全部资料(高分项目)
- stata 经纬度计算反距离矩阵的方法.docx
- ORACLE数据库面试题解答DBA数据库管理员JAVA程序员架构师必看.docx
- stata 经纬度计算反距离矩阵的方法.zip
- ORACLE数据库面试题解答DBA数据库管理员JAVA程序员架构师必看.zip
- 华为-华为od题库练习题之密码截取.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈