한시간이면 될것을 몇일 걸린 이유...
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.
//타이머카운터의 기본기능이 아닌 다른 기능을 사용하기 위한 함수라는데 모르겠다.
[출처] LS7166 encoder counter|작성자 얼굴빨개
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 |