STM32 Encoder

Michal Grunt michal.grunt na vynet.cz
Pátek Únor 15 14:07:19 CET 2013


Zkousel jsem u STM32F0 nastavit TIM3 do rezimu encoder a po premapovani GPIO pripojit na PA6,PA7 rotacni encoder (cast kodu nize). Jeste mam na MCU pripojen 4x 7segment LED. Neco to dela, resp. kdyz tocim enkoderem, ctu TIM3->CNT nebo TIM_GetCounter(TIM3) a inkrementuji promenou, kterou si nechavam vypsat na LED tak to na encoder reaguje (promena se inkrementuje) - na USART jsem se zatim nedostal, abych si toho mohl nechat vypsat vice. Ale je to takove vseljake. Bud se promena inkrementuje silene rychle, nebo se hodnota pricita i kdyz s encoderem netocim resp. pootocim s nim a kdyz ho pustim, tak se promena samostatne inkrementuje do te doby nez treba kousicek pohnu enkoderem (ne o cely jeden krok). Ze by nejake ruseni nebo blbe testuju otoceni? Enkoder ma pripojenej primo na PA6,PA7, stred na zem (bez rezistoru nebo dalsi bizuterie). A nebo presne nevim v jake casti programu testovat zda bylo s enkoderem pootoceno. Zkousel jsem to v preruseni jineho casovace kde mam multiplex segmentu a jede to cca 1Khz. Jedine jestli by se dalo udelat preruseni na casovac enkoderu, ze pokud s nim pohnu tak se bude neco dit, ale tam si nejsem uplne jist jak to preruseni nadefinovat a zda to pak umi rozlisit otoceni doprava a doleva.

Predstavuji si to tak, by se mi po jednom kroku enkoderu (ma jich asi 30 na jednu otocku) do promene pricetla jednicka nebo jine cislo to je jedno, ale nesmelo by se pricitat samostatne kdyz je encoder v mezikroku jako se mi to asi deje ted...

V preruseni casovaci multiplexu jsem zkousel toto:

curCount: vycitani a pricitani TIM3->CNT
totalCount: to co se vypisuje na LED segmentech
MAX_COUNT: takovy pokus, aby se to pricitalo pomaleji, mel jsem tam hodontu 1000

curCount += TIM3->CNT;
if (curCount >= MAX_COUNT) {
	totalCount++;
	curCount=0;
}

Diky za rady
MG


RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

// GPIO config pro encoder
GPIO_StructInit(&GPIO_InitStructure); // reset GPIO structure
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_PinAFConfig(GPIOA,GPIO_PinSource6 | GPIO_PinSource7,GPIO_AF_1); //alternativni vystup PA6,PA7 pro tim3
GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

//start - tim3 encoder init
TIM_DeInit(TIM3);

TIM_TimeBaseInitStruct.TIM_Prescaler = 0x0; // No prescaling
TIM_TimeBaseInitStruct.TIM_Period = 0xF;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,
TIM_ICPolarity_Falling, TIM_ICPolarity_Rising);

TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
//end - tim3 encoder init

//TIM_GetCounter(TIM3) = 0;
TIM3->CNT = 0;
TIM_Cmd( TIM3, ENABLE);


Další informace o konferenci Hw-list