|
发表于 2017-7-26 16:32:40
|
显示全部楼层
本帖最后由 yufanyufan77 于 2017-7-27 09:03 编辑
刚刚写了个加油机编码器程序不知道能用不
#include "Encode.h"
#define T1_PORT GPIOI
#define T0_PORT GPIOI
#define T1_PIN GPIO_Pin_2
#define T0_PIN GPIO_Pin_3
#define T1_READ() ((T1_PORT->IDR & T1_PIN)?1:0)
#define T0_READ() ((T0_PORT->IDR & T0_PIN)?1:0)
static unsigned long EncodeCounts = 0;//正转脉冲数
static unsigned long EncodePluseErrorCounts = 0;//非加油状态正转脉冲数
static unsigned long DropEncodeCounts = 0;//丢失脉冲数
static unsigned long RbackEncodeCounts = 0;//反转脉冲数
static unsigned char EncodeError = 0;//编码器异常标志
//设置编码器故障代码
void SetEncodeError(unsigned char EncodeErrors)
{
EncodeError = EncodeErrors;
}
//获取编码器错误代码 0:正常 1:反转 2:脉冲丢失 3:T0或T1故障 4:停机还出油 5:脉冲停止
unsigned char GetEncodeError(void)
{
return EncodeError;
}
//设置编码器脉冲数
void SetEncodeCounts(unsigned long EncodeCount)
{
EncodeCounts = EncodeCount;
}
//获取编码器脉冲数
unsigned long GetEncodeCounts(void)
{
return EncodeCounts;
}
void EncodeParmInit(void)
{
SetEncodeCounts(0);
}
//Beep端口初始化
void EncodeInterfaceInit(void)
{
//定义一个接口配置结构
GPIO_InitTypeDef GPIO_InitStruct_Encode;
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOI, ENABLE);//初始化时钟
GPIO_InitStruct_Encode.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;//对应管脚
GPIO_InitStruct_Encode.GPIO_Mode = GPIO_Mode_IN;//输出模式
GPIO_InitStruct_Encode.GPIO_OType = GPIO_OType_PP; //推挽
GPIO_InitStruct_Encode.GPIO_Speed = GPIO_High_Speed;
GPIO_Init(GPIOI, &GPIO_InitStruct_Encode);
EncodeParmInit();
}
//相位判断
//返回值:0:正常 1:脉冲丢失 2:编码器反转
static unsigned char JudgeEncodeRound(unsigned char T0_val ,unsigned char T1_val)
{
unsigned short temp = 0;
temp = T0_val;
temp = (temp<<2) | T1_val;
switch(temp)
{
//正转
case 0:
case 7:
case 14:
case 8:
return 0;
//反转
case 11:
case 13:
case 4:
case 2:
return 2;
}
//丢脉冲
return 1;
}
//读取编码器
//00 01 11 10
void EncodeProcess(void)
{
unsigned char temp = 0;
unsigned char T0_val = 0;
unsigned char T1_val = 0;
unsigned char EncodeTemp_val = 0;
static unsigned char Encode_val = 0;
static unsigned long EncodeStopCountsTime = 0;//正转脉冲停止时间
T0_val = T0_READ();
T1_val = T1_READ();
EncodeTemp_val = (T0_val<<1) | T1_val;
if(Encode_val == EncodeTemp_val)//此时间段内没有转动
{
//开始计时
EncodeStopCountsTime++;
if(EncodeStopCountsTime>10000)
{
SetEncodeError(5);
EncodeStopCountsTime = 0;
}
return ;
}
else
EncodeStopCountsTime = 0;
temp = JudgeEncodeRound(Encode_val ,EncodeTemp_val);
switch(temp)
{
//正转
case 0:
Encode_val = EncodeTemp_val;
EncodeCounts++;
if(!GetnozzleNumFuelState())//非加油状态
EncodePluseErrorCounts++;
if(EncodePluseErrorCounts>100)
SetEncodeError(4);//停机状态还出油
break;
case 1:
//脉冲丢失需修正
DropEncodeCounts++;
if(DropEncodeCounts>10&&DropEncodeCounts<20)
{
SetEncodeError(2);//丢脉冲
return;
}
if(DropEncodeCounts>20)
{
SetEncodeError(3);//T0或T1故障
return;
}
break;
case 2://反转
Encode_val = EncodeTemp_val;
RbackEncodeCounts++;
if(RbackEncodeCounts>20)
{
SetEncodeError(1);
return;
}
break;
}
} |
|