한시간이면 될것을 몇일 걸린 이유...


1. 선이 끊어져 있는데 이걸 발견하지 못했다..    :단선 확인은 필수다

2. GND끼리 연결하지 않았다.

MCU랑 연계해서 값을 읽는다고 한다면 하나의 회로를 이루어야 한다. 전원은 따로더라도 엔코더쪽 GND따로 MCU쪽 GND따로가 아니라는 말씀. 두 GND를 연결해주자. 그러지 않으면 값이 불규칙적이다.


엔코더가 제대로 돌아가는지 확인하는법.

엔코더에 전원을 연결해 주고, 엔코더의 A B상 출력과 GND사이에 각각 LED를 연결해준다.

엔코더를 돌릴때 두 LED가 깜빡여야 한다. 계속 켜져있거나 계속 꺼져있으면 불량이다.


//******************************************************************

헤더


#include <stm32f10x_it.h>


void Encoder_RCC(void);

void Encoder_GPIO(void);

void Encoder_TIM(void);

void Encoder_Setting(void);

void Encoder_NVIC(void);


void Encoder_Disable(void);


저번과 같은 맥락의 함수들이다

//*********************************************************************

본문


1. TIM3 사용, PortC로 Remapping할것임. 본래 타이머 외의 용도를 사용하기 위해서 AFIO를 Enable

void Encoder_RCC(void){

  //PortC TIM3

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

}


2. TIM3를 Full-Remap하여 PortC의 핀6~9를 TIM3로 사용

void Encoder_GPIO(void){

  GPIO_InitTypeDef GPIO_InitStructure;


  GPIO_PinRemapConfig ( GPIO_FullRemap_TIM3, ENABLE );

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IN_FLOATING;//

  GPIO_Init(GPIOC,&GPIO_InitStructure); 

}


3.

TIM_EncoderInterfaceConfig : 엔코더 설정 함수. 타이머, 엔코더 모드, A B 상의 펄스읽는 방식 설정

TIM_ARRPreloadConfig : Enables or disables the TIM peripheral Preload register on ARR.

//타이머카운터의 기본기능이 아닌 다른 기능을 사용하기 위한 함수라는데 모르겠다.

TIM_ClockDivision : 분주비. 본인은 4분주 사용

TIM_ITConfig : 타이머 인터럽트 활성화


void Encoder_TIM(void){

  TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);

  TIM_ARRPreloadConfig(TIM3, ENABLE);

  TIM_Cmd(TIM3, ENABLE);

  //***************************************************************

  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


  TIM_TimeBaseStructure.TIM_Period = 500;//260;//624;

  TIM_TimeBaseStructure.TIM_Prescaler = 1;//576;

  //

  

  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4;//TIM_CKD_DIV1;//TIM_CKD_DIV4;//

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //upcounting mode

  //TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; 


  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); 

}


void Encoder_NVIC(void){

  NVIC_InitTypeDef NVIC_InitStructure;

  

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;            


    //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;


    //NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;


    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


    NVIC_Init(&NVIC_InitStructure);

}


void Encoder_Setting(void){

  Encoder_RCC();

  Encoder_GPIO();

  //Encoder_NVIC(); //인터럽트 없었음.. 그 자체로 모터의 펄스값을 읽어들였음. 전에 시험테스트 해볼때도

  Encoder_TIM();

}


void Encoder_Disable(void){

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,DISABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,DISABLE);

  

  TIM_ARRPreloadConfig(TIM3, DISABLE);

  TIM_Cmd(TIM3, DISABLE);

  TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE); 

}



'중도연재종료 > CORTEX M3' 카테고리의 다른 글

Cortex M3 블루투스 설정  (0) 2013.09.02
Bluetooth 사용기(팁 포함)  (0) 2013.09.02
스텝모터 돌리기  (0) 2013.09.02
진행방식을 바꾼다...  (0) 2013.06.23
함수표 참조 설명  (0) 2013.06.23
Posted by 십자성군