先谢谢各位大侠了。。
#include "Encinput.h"
/* Struct Define ------------------------------------------------------------*/
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
/*************************************
typedef unsigned int DWORD;
typedef unsigned short int WORD;
typedef unsigned char BYTE;
typedef signed int SDWORD;
typedef signed short int SWORD;
typedef signed char SBYTE;
**************************************/
BYTE FloorQuantity = 3;
DWORD floorhigh = 19600; //
WORD Vanequarter = 163; //
DWORD floorstate; //
/* Variable Define -----------------------------------------------------------*/
BYTE F_EncodeDir;
DWORD GetCounter;
DWORD GetCounterNew;
DWORD GetCounterOld;
BYTE F_GetCounter;
DWORD Location = LocationBottom;
BYTE F_Location; // typedef unsigned char BYTE;
void encoder(void)
{
TIM_ICInitTypeDef TIMICInitStructure;
/* TIM4 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
/* GPIOA clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_TimeBaseInitStructure.TIM_Prescaler = 0x0; //No precaling
TIM_TimeBaseInitStructure.TIM_Period = 65535;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV4;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4 , &TIM_TimeBaseInitStructure);
F_EncodeDir = 1;
GPI12E_T3CON_T3UD(F_EncodeDir); //GPT12E_T3UD(p.posdir);/*ser incremental encoder direction*/
TIMICInitStructure.TIM_ICFilter = 6;
TIM_ICInit(TIM4 ,&TIMICInitStructure);
TIM_ClearFlag(TIM4 ,TIM_FLAG_Update);
TIM_SetCounter(TIM4 ,Location); /* time 4 count register */ //设置TIMx计数器寄存器值
TIM_Cmd(TIM4 ,ENABLE);
GetCounter = TIM_GetCounter(TIM4); //获得TIMx计数器的值
}
/*******************************************************************************
* Function Name : position
* Description : output position signal
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void position(void)
{
/* Count encoder ----------------------------------------------------------*/
if(GetCounter != TIM_GetCounter(TIM4))
{
GetCounter = TIM_GetCounter(TIM4);
}
GetCounterNew = GetCounter; //读取当前位置
GetCounterOld = Location & 0xFFFF; //???????
if(GetCounterNew > GetCounterOld) //???????
{
if(GetCounterNew - GetCounterOld > 0x8000) //???????
{
Location -= 0x00010000; //???????
}
}
else //???????
{
if(GetCounterOld - GetCounterNew > 0x8000) //???????
{
Location += 0x00010000; //???????
}
}
Location &= 0xFFFF0000; //???????
Location |= GetCounterNew; //??????? |