---
title: Where are you?
author: Gildong Hong ([email protected])
date: 2018-01-30
[๊ธฐ์ ํ ๋ด์ฉ๋ค - ๊ธฐ์ ํ๊ณ ๋๋ฉด ํด๋น ํญ๋ชฉ ์ง์ฐ๊ธฐ]
* ํ์ ์ฒด์ ์์น ์ธก์ ๋ฐฉ๋ฒ:
* Gpt12 Encoder config
* iLLD
EXAMPLE:
MyIlldModule_TC23A - Gpt12
InfineonRacer_TC23A - TestGtp12
---
- ๋ชจํฐ์ ์๋๋ฅผ ์ธก์ ํ๋ ค๋ฉด ๋ฌด์จ ์ผ์๋ฅผ ์จ์ผํ์ง? ์๋์ผ์๋ผ๋ ๊ฒ์ด ์๋? ๋น์ฐํ ์๊ฒ ์ง! ์๋์ฐจ์ ๊ณ๊ธฐํ์ ์ฐจ์๊ณผ ์์ง rpm์ ๋ณด์ฌ์ฃผ๋ ๋ถ๋ถ์ด ์์์? ๊ทธ ์๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ํ๋ ๋ชจํฐ์ ์๋๋ ์์ ๋ผ ์ ์๊ณ , ๋ฌ๋ฆฌ๋ ์ฐจ๋์ ์๋๋ ์์๋ผ ์ ์์๊ฑฐ์ผ.
์์ง์ด๋ ๋ฌผ์ฒด์ ์๋๋ฅผ ์ธก์ ํ๋ ๊ฒ์ ๊ทธ๋ ๊ฒ ์ฌ์ด ์ผ์ ์๋๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์์น์ ๋ณํ๋ฅผ ์ธก์ ํด์ ๊ทธ ๊ฐ์ ๋ฏธ๋ถํด์ ์๋๋ฅผ ์์๋ด๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ฐ๋จํ๊ฒ๋ ํ์ ์ถ์ ๋ฐ์ฌํ ๊ด์ผ์๋ ํ์ผ์ ๋ฑ์ ๋ถ์ฌ ํ์ ๊ณผ ๋๊ธฐํ๋ ํ์ค ์ ํธ๋ฅผ ๋ง๋ค์ด ๋ด๊ณ , ๊ทธ ์ ํธ์ ์ฃผ๊ธฐ๋ฅผ ์ธก์ ํด์ ๊ฐ์ ์ ์ผ๋ก ํ์ ์๋๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ํ๊ฑธ์ ๋ ๋์๊ฐ ํ์ ์ฒด์ ์๋ ๋ฟ๋ง ์๋๋ผ ํ์ ์ฒด์ ์์น, ์ฆ ๊ฐ๋๋ฅผ ์์๋ด์ผ ํ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ๋ํ์ ์ผ๋ก ์๋์ฐจ ์์ง์ ํฌ๋ญํฌ ์ถ, ๋๋ ๋๊ธฐ์ ๋๊ธฐ์ ํ์ ์ถ์ ์์น๋ฅผ ์์์ผ ์ ์ด๋ฅผ ํ ์ ์์ต๋๋ค. ์ด๋ฐ ๋ชฉ์ ์ผ๋ก ์ฆ๋ถํ ์์ฝ๋(incremental encoder)๋ผ๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค. ์์ ์๋ ์ธก์ ๋ฐฉ๋ฒ๊ณผ์ ์ฐจ์ด๋ ํจ์ฌ ๋ ๋ง์ ํ์ค ์ ํธ๋ฅผ ๋ฐ์ํ๋๋ก ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด ๋ 1ํ์ ๋น ๋ช๊ฐ์ ํ์ค๋ฅผ ๋ฐ์์ํค๋๊ฐ(PPR: Pulse Per Revolution)๋ก ์์ฝ๋์ ์ฌ์์ ๊ฒฐ์ ํ๋ ์ค์ํ ์ ๋ณด๊ฐ ์์ต๋๋ค.
- General Purpose Timer ์ดํด
- Input Capture์ Pulse Accumulator๋ฅผ ์ฌ์ฉํ ์๋ ์ธก์ ๋ฐฉ๋ฒ ์ต๋
- TC23x TC22x Family User's Manual v1.1 - Chap 26 GPT12
- iLLD_TC23A Help / Modules/ GPT12
[Example Code]
- MyIlldModule_TC23A - GPT12
- Desired frequency ๋ฅผ ๊ฐ์ง Pulse ๋ฅผ ์ถ๋ ฅํ๋ค.
- ์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ pulse๋ฅผ counting ํ์ฌ ์๋๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
- ์๋ ์ธก์ ๋ฐฉ๋ฒ
- Input capture: ์ ๋ ฅ๋ ์ ํธ์ edge๊ฐ ๋ฐ์ํ์ ๋ ๋ง๋ค time stamp๋ฅผ ์ฐ๊ณ , ํ์ฌ์ ์ง์ time stamp ๊ฐ์ ์ฐจ์ด๋ฅผ ํตํด ์๋๋ฅผ ๊ณ์ธกํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- Pulse accumulator: ์ผ์ ํ ์๊ฐ๋์ ์ ๋ ฅ๋ pulse ์ ๋ณด๋ฅผ countingํ๊ณ , pulse ๊ฐฏ์๋ฅผ ํตํด ์๋๋ฅผ ๊ณ์ธกํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- Encoder
- ์๋ ๊ณ์ธก์ ์ํด ์ฌ์ฉ๋๋ ์ผ์๋ก ํ์ ์ถ์ ์ํ์ ์ค์นํ๊ณ ์ํ ๋๋ ์ ์์ slip์ ๋ด์ด ๋น์ด ํต๊ณผํ๊ฒ ๋ง๋ค๊ณ , ์ํ ์๋ค๋ก ๋ฐ๊ด/์๊ด ์์๋ฅผ ์ฅ์ฐฉํฉ๋๋ค. ์ํ์ด ์ค์น๋ ์ถ์ด ํ์ ํ๊ฒ ๋๋ฉด slip์ ์ํด ๋ฐ๊ด์์์์ ๋ฐ์๋ ๋น์ด ์๊ฐ์ ์ผ๋ก ์๊ด์์์ ๋๋ฌํ๊ฒ ๋๋ ๋ฐ, ์ด๋ ๋ฐ์๋๋ ์ ํธ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด Encoder์ ์๋ฆฌ๊ฐ ๋๊ฒ ์ต๋๋ค. ๋ง์ฝ ์ถ์ด ๋น ๋ฅด๊ฒ ํ์ ํ๊ฒ ๋๋ฉด ์๊ด์์์ ๋น์ด ๋๋ฌํ๋ ํ์๊ฐ ์ฆ๊ฐํ๊ฒ ๋จ์ผ๋ก, ์งง์ ์๊ฐ๋์ ๋ง์ ์์ pulse๊ฐ ๋์ค๊ฒ ๋๋ฉฐ, ๋ฐ๋๋ก ์ ์์ผ๋ก ํ์ ํ๋ฉด pulse ๋ฐ์ ์ฃผ๊ธฐ๊ฐ ๋๋ ค์ง๊ฒ ๋ฉ๋๋ค.
-
Overview
- General Purpose Timer (GPT)๋ ์๊ฐ ์ธก์ , ์ด๋ฒคํธ ์นด์ดํ , ํ์ค ํญ ์ธก์ , ํ์ค ์์ฑ ๋ฑ ๋ค์ํญ ๋ชฉ์ ์ ๋ง๊ฒ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด 5๊ฐ์ 16 bits Timer๊ฐ ์กด์ฌํ๋๋ฐ ์ด Timer๋ค์ 2๊ฐ์ Timer ๋ธ๋ญ์ผ๋ก ๋๋๊ฒ ๋ฉ๋๋ค(GPT1, GPT2). ๊ฐ Timer๋ ๋ค์ํ ๋ชจ๋ ์ค ํ๋๋ก ์ค์ ํ ๋ ๋ฆฝ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ฐ์ Timer ๋ธ๋ญ ๋ด์์๋ ํ๋์ Timer๊ฐ ๋ค๋ฅธ Timer์ ํฉ์ณ์ ธ์ ๊ตฌ๋๋๊ธฐ๋ ํฉ๋๋ค.
- GPT1
- GPT1 ๋ธ๋ญ์ 3๊ฐ์ Timer๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. Core timer์ธ T3์ ๋ ๊ฐ์ auxiliary timer T2์ T4๊ฐ ์์ต๋๋ค. Auxiliary timer๋ค์ ์ค์ ์ ๋ฐ๋ผ core timer๋ฅผ ์ํ reload๋ capture register๋ก๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ต๋ ํด์๋๋ ์ด๊ณ , ์ด ๋ ๋ GPT12 ๋ธ๋ญ์ clock์ ๋ํ๋ ๋๋ค.
- 4๊ฐ์ ๋ชจ๋๋ฅผ ์ง์ํ๋ฉฐ ๋ชจ๋ ์ข
๋ฅ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Timer Mode
- Gated Timer Mode
- Counter Mode
- Incremental Interface Mode
- Capture/Reload ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- GPT2
- GPT2 ๋ธ๋ญ์ 2๊ฐ์ Timer๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. Core timer์ธ T6์ auxiliary timer T5๊ฐ ์์ต๋๋ค.
- ์ต๋ ํด์๋๋ ์ด์ ๋๋ค.
- 3๊ฐ์ ๋ชจ๋๋ฅผ ์ง์ํ๋ฉฐ ๋ชจ๋ ์ข
๋ฅ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Timer Mode
- Gated Timer Mode
- Counter Mode
- Capture/Reload ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
-
GPT1
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ Timer๋ count๋ฅผ up ๋๋ down ์ํต๋๋ค.
- ๊ฐ Timer๋ ์ ๋ ฅ ํ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ Gated Timer Mode์์๋ gate control๋ก, Counter Mode์์๋ count input์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- Timer๋ฅผ Up ์ํฌ ์ง, Down์ํฌ ์ง๋ ์ฌ์ฉ์๊ฐ ์ค์ ํ ์ ์์ต๋๋ค.
- Core Timer์ overflow๋ underflow ๋ฐ์ ์ฌ๋ถ๋ Output Toggle Latch T3OTL์ ํตํด ์์๋ผ ์ ์์ต๋๋ค.
- GPT1๊ณผ ๊ด๋ จ๋ Interrupt๋ SR0, SR1, SR2๋ฅผ ํตํด ์ ๋ฌ๋ฉ๋๋ค.
โ
-
Modes
- Timer Mode: ๋ฅผ Prescaler๋ฅผ ํตํด ์กฐ์ ํ ๋ค์ ์ถ๋ ฅ clock์ ๋ํด count๋ฅผ up ๋๋ down ํฉ๋๋ค. T3R์ ์ค์์น๋ก์ count๋ฅผ ๋ด๋ณด๋ผ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- Gated Timer Mode: ๋์ ๋ฐฉ์์ Timer Mode์ ๋์ผํ๋, Prescaler ์ถ๋ ฅ์ Gate Control์ด ์ถ๊ฐ๋ ํํ ์ ๋๋ค. Gate Control์ ์ธ๋ถ ์ ๋ ฅ T3IN์ ๋ฐ์์ clock์ ๋ด๋ณด๋ผ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์, T3IN์ ๋ฐ๋์ ์ค์ ์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค. ์์ปจ๋, T3IN๊ณผ T3R์ด Enable ๋ ๋๋ง count๊ฐ ๋ฐ์๋ฉ๋๋ค.
- Counter Mode: Timer Mode์์ ์ฌ์ฉ๋์๋ ๋ฅผ ์ธ๋ถ ์ ๋ ฅ (T3IN)์ผ๋ก ๋ณ๊ฒฝํ ๊ฒ์ ๋๋ค. ๊ทธ ์ธ ๋ค๋ฅธ ๋์์ Timer Mode์ ๊ฐ์ต๋๋ค. T3IN์ rising๊ณผ falling edges ๋ค ์ค ์ด๋ค ๊ฒ์ count๋ฅผ ํ ๊ฑด์ง ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
- Incremental Interface Mode: T3IN๊ณผ T3EUD์ ์
๋ ฅ ์์ ๋ฐ edge ๋ณ์ด๋ฅผ ๋ฐ๋ผ count๋ฅผ upํ๊ฑฐ๋ down ์ํค๋ ๋ชจ๋์
๋๋ค. ๋ ์
๋ ฅ์ ์
๋ ฅ ์์์ ๋ฐ๋ผ ๋ฐฉํฅ์ ๊ฐ์งํ ์ ์๋ ์ฅ์ ์ด ์๊ณ , ๋ ์
๋ ฅ ๊ฐ์ ์์์ฐจ๋ฅผ ํตํด ๋จ์ผ ์
๋ ฅ ๋๋น 2๋ฐฐ ๋๋ 4๋ฐฐ ์ ๋์ ํด์๋๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- Up ๋๋ down count๋ฅผ ์ํ ์กฐ๊ฑด์ ๋ ์ ๋ ฅ ์ค ํ๋์ ์ ๋ ฅ์์ edge๊ฐ ๋ฐ์ํ์ ๋ ๋ค๋ฅธ ์ ๋ ฅ์ level์ ํ์ธํ์ฌ ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค. ์ด๋, ๋ฐ์๋ edge์ ์ข ๋ฅ๋ ๊ณ ๋ คํฉ๋๋ค. ์๋ ํ๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ์ ์ ๋ ฅ์ edge ์ ๋ณด๋ฅผ ์ฌ์ฉํ ๊ฑด์ง์ ๋ฐ๋ผ up / down์ ํ์๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
โ
โ Up/Down Count ๋ฐ์ ์กฐ๊ฑด
โ 2๊ฐ์ ์ ๋ ฅ edge๋ฅผ ๋ชจ๋ count์ ๋ฐ์ํ์์ ๊ฒฝ์ฐ
โ
โ 1๊ฐ์ ์ ๋ ฅ edge๋ง count์ ๋ฐ์ํ์์ ๊ฒฝ์ฐ
-
GPT2
- ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ GPT1๊ณผ ์ ์ฌํฉ๋๋ค.
- 2๊ฐ์ Timer (T5, T6)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ง์๋๋ ๋ชจ๋๋ Timer Mode, Gated Timer Mode, Counter Mode์ด๋ฉฐ, ๋์ ๋ฐฉ์์ ์์ ์ค๋ช ํ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
- Core Timer๋ T6์ด๋ฉฐ, Auxiliary Timer๋ T5์ ๋๋ค.
โ
void Gpt12Demo_init(void)
{
// printf("Gpt12_init() called. \n");
initTime();
/* Initialize global clocks */
/* FIXME Global prescaller should not be set by the driver as they are global resources */
IfxGpt12_enableModule(&MODULE_GPT120);
// Gpt1 block clock ์ค์
IfxGpt12_setGpt1BlockPrescaler(&MODULE_GPT120, IfxGpt12_Gpt1BlockPrescaler_8);
// Gpt2 block clock ์ค์
IfxGpt12_setGpt2BlockPrescaler(&MODULE_GPT120, IfxGpt12_Gpt2BlockPrescaler_4);
// Encoder๋ก ๋ค์ด์ค๋ pulse๋ฅผ ์ธ๊ธฐ ์ํ Gpt configuration ์์ฑ
IfxGpt12_IncrEnc_Config config;
// Gpt Configuration ์ด๊ธฐํ
IfxGpt12_IncrEnc_initConfig(&config, &MODULE_GPT120);
#if 1
{
/* Test implementation with T3 as core */
config.base.offset = 0;
config.base.reversed = FALSE;
config.base.resolution = 32; // 2048; for test purpose
config.base.periodPerRotation = 1;
config.base.resolutionFactor = IfxStdIf_Pos_ResolutionFactor_fourFold;
config.base.updatePeriod = 100e-6;
config.base.speedModeThreshold = 200;
config.base.minSpeed = 10;
config.base.maxSpeed = 500;
config.zeroIsrPriority = ISR_PRIORITY(INTERRUPT_INCRINC_ZERO);
config.zeroIsrProvider = ISR_PROVIDER(INTERRUPT_INCRINC_ZERO);
config.pinA = &IfxGpt120_T3INA_P02_6_IN;
config.pinB = &IfxGpt120_T3EUDA_P02_7_IN;
config.pinZ = &IfxGpt120_T4INA_P02_8_IN;
config.pinMode = IfxPort_InputMode_noPullDevice;
config.base.speedFilterEnabled = TRUE;
config.base.speedFilerCutOffFrequency = config.base.maxSpeed / 2 * IFX_PI * 2;
}
#else
{
/* Test implementation with T2 as core */
config.base.offset = 100;
config.base.reversed = FALSE;
config.base.resolution = 2048;
config.base.periodPerRotation = 1;
config.base.resolutionFactor = IfxStdIf_Pos_ResolutionFactor_fourFold;
config.base.updatePeriod = 100e-6;
config.base.speedModeThreshold = 200;
config.base.minSpeed = 10;
config.base.maxSpeed = 500;
config.zeroIsrPriority = ISR_PRIORITY(INTERRUPT_INCRINC_ZERO);
config.zeroIsrProvider = ISR_PROVIDER(INTERRUPT_INCRINC_ZERO);
config.pinA = &IfxGpt120_T2INA_P00_7_IN;
config.pinB = &IfxGpt120_T2EUDA_P00_8_IN;
config.pinZ = &IfxGpt120_T4EUDA_P00_9_IN;
config.pinMode = IfxPort_InputMode_noPullDevice;
config.base.speedFilterEnabled = TRUE;
config.base.speedFilerCutOffFrequency = config.base.maxSpeed / 2 * IFX_PI * 10;
}
#endif
IFX_VALIDATE(IFX_VERBOSE_LEVEL_ERROR, IfxGpt12_IncrEnc_init(&g_Gpt12.incrEnc, &config));
g_Gpt12.control.run = TRUE;
g_Gpt12.control.direction = IfxStdIf_Pos_Dir_forward;
g_Gpt12.control.resolution = config.base.resolution;
g_Gpt12.control.step = 3;
g_Gpt12.control.rawPosition = config.base.offset;
g_Gpt12.control.speed = IFX_PI * 2.0;
g_Gpt12.control.multiplicationFactor = config.base.resolutionFactor;
g_Gpt12.control.updatePeriod = config.base.updatePeriod;
g_Gpt12.control.positionMask = g_Gpt12.control.resolution * g_Gpt12.control.multiplicationFactor - 1;
g_Gpt12.interface.A = config.pinA->pin;
g_Gpt12.interface.B = config.pinB->pin;
g_Gpt12.interface.Z = config.pinZ->pin;
/* Overwrite port configuration to enable feature check */
IfxPort_setPinModeOutput(g_Gpt12.interface.A.port, g_Gpt12.interface.A.pinIndex, IfxPort_OutputMode_pushPull,
IfxPort_OutputIdx_general);
IfxPort_setPinModeOutput(g_Gpt12.interface.B.port, g_Gpt12.interface.B.pinIndex, IfxPort_OutputMode_pushPull,
IfxPort_OutputIdx_general);
IfxPort_setPinModeOutput(g_Gpt12.interface.Z.port, g_Gpt12.interface.Z.pinIndex, IfxPort_OutputMode_pushPull,
IfxPort_OutputIdx_general);
}
// ์์ฝ๋ ์ธํฐํ์ด์ค ํ
์คํธ๋ฅผ ์ํ์ฌ ์ธ์์ ์ผ๋ก pulse๋ฅผ ๋ง๋ค์ด์ค๋ค
void Gpt12Demo_step(void)
{
if (g_Gpt12.control.run)
{
sint32 rawPosition;
rawPosition = g_Gpt12.control.rawPosition;
if (g_Gpt12.control.direction == IfxStdIf_Pos_Dir_forward)
{
g_Gpt12.control.step++;
g_Gpt12.control.step &= 0x3;
rawPosition++;
}
else
{
g_Gpt12.control.step--;
g_Gpt12.control.step &= 0x3;
rawPosition--;
}
rawPosition &= g_Gpt12.control.positionMask;
g_Gpt12.control.rawPosition = rawPosition;
#if 1
// Encoder ์ค์์๋ Z์์ด ์๋ ๊ฒ ์๊ณ ์๋ ๊ฒ ์์ผ๋ฏ๋ก ์ ํ์ ์ผ๋ก Z์์ ๋ง๋ ๋ค.
if (g_Gpt12.control.direction == IfxStdIf_Pos_Dir_forward)
{
if (rawPosition == 0)
{
IfxPort_setPinHigh(g_Gpt12.interface.Z.port, g_Gpt12.interface.Z.pinIndex);
}
else if (rawPosition == 1)
{
IfxPort_setPinLow(g_Gpt12.interface.Z.port, g_Gpt12.interface.Z.pinIndex);
}
}
else
{
if (rawPosition == g_Gpt12.control.positionMask)
{
IfxPort_setPinHigh(g_Gpt12.interface.Z.port, g_Gpt12.interface.Z.pinIndex);
}
else if (rawPosition == g_Gpt12.control.positionMask - 1)
{
IfxPort_setPinLow(g_Gpt12.interface.Z.port, g_Gpt12.interface.Z.pinIndex);
}
}
#endif
// 4๋ถํ ๋ก ์ชผ๊ฐ์ A์ B์์ Pulse๋ฅผ ๋ง๋ค์ด๋
switch (g_Gpt12.control.step)
{
case 0:
IfxPort_setPinLow(g_Gpt12.interface.A.port, g_Gpt12.interface.A.pinIndex);
IfxPort_setPinLow(g_Gpt12.interface.B.port, g_Gpt12.interface.B.pinIndex);
break;
case 1:
IfxPort_setPinLow(g_Gpt12.interface.A.port, g_Gpt12.interface.A.pinIndex);
IfxPort_setPinHigh(g_Gpt12.interface.B.port, g_Gpt12.interface.B.pinIndex);
break;
case 2:
IfxPort_setPinHigh(g_Gpt12.interface.A.port, g_Gpt12.interface.A.pinIndex);
IfxPort_setPinHigh(g_Gpt12.interface.B.port, g_Gpt12.interface.B.pinIndex);
break;
case 3:
IfxPort_setPinHigh(g_Gpt12.interface.A.port, g_Gpt12.interface.A.pinIndex);
IfxPort_setPinLow(g_Gpt12.interface.B.port, g_Gpt12.interface.B.pinIndex);
break;
}
}
}
void Gpt12Demo_run(void)
{
printf("Gpt12_run() called \n");
Ifx_TickTime tickPeriod;
Ifx_TickTime tickRefresh;
Ifx_TickTime refreshDeadLine;
Ifx_TickTime tickDeadLine;
tickRefresh = g_Gpt12.control.updatePeriod * TimeConst_1s;
refreshDeadLine = now();
tickDeadLine = refreshDeadLine;
while (1)
{
g_Gpt12.control.run = g_Gpt12.control.speed != 0.0;
if (!g_Gpt12.control.run)
{}
else
{
float32 roundDuration_s = (2.0 * IFX_PI) / g_Gpt12.control.speed;
float32 tickDuration_s = roundDuration_s / (g_Gpt12.control.positionMask + 1);
tickPeriod = tickDuration_s * TimeConst_1s;
if (isDeadLine(tickDeadLine))
{
tickDeadLine = addTTime(tickDeadLine, tickPeriod);
Gpt12Demo_step();
}
}
if (isDeadLine(refreshDeadLine))
{
refreshDeadLine = addTTime(refreshDeadLine, tickRefresh);
// Gpt12 ์ฌ์ฉํ์ฌ ์์ฝ๋ ์ ํธ ์ธํฐํ์ด์ค ํ์ธ
// Update ๋ ์ ํธ๋ g_Gpt12.incrEnc์ ์ ์ฅ
IfxGpt12_IncrEnc_update(&g_Gpt12.incrEnc);
// update๋ ์์ฝ๋ ์ ํธ๋ฅผ ์ด์ฉํด speed, position, direction ์ ๋ณด๋ฅผ ๊ตฌํ๋ ํจ์
g_Gpt12.status.speed = IfxGpt12_IncrEnc_getSpeed(&g_Gpt12.incrEnc);
g_Gpt12.status.rawPosition = IfxGpt12_IncrEnc_getRawPosition(&g_Gpt12.incrEnc);
g_Gpt12.status.direction = IfxGpt12_IncrEnc_getDirection(&g_Gpt12.incrEnc);
}
}
}
์์ฝ๋ ์ธํฐํ์ด์ค๋ฅผ ํ ์คํธ ํ๋ ค๋ฉด ์์ฝ๋ ์ ํธ๊ฐ ํ์
encoder emulation ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ์์ฝ๋ ์ ํธ๋ฅผ ๋ฐ์ ์ํค๊ณ
Gpt12 ๋ฅผ ์ฌ์ฉํด์ ์์ฝ๋ ์ ํธ ์ธํฐํ์ด์ค ๊ธฐ๋ฅ ํ์ธ
#define ENCODER_EMUL // 65 ํ Configuration.h ํ์ผ in InfineonRacer ํ๋ก์ ํธ์์
์ ์ ์ ํ๋ฉด emulation ํ ์ ์๋ค.
ํ์ ํ๋ ์ถ์ ์์น์ ์๋๋ฅผ ์ธก์ ํ๋ ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจํฐ์ ์์ง ๋ฑ์ ์ฌ์ฉํ๋ ์ ์ด ์์คํ ์์ ๊ผญ ํ์ํ ๊ธฐ๋ณธ์ ์ธ ์ ๋ณด ์ ๋๋ค. ์ด ๊ฐ์ ์ธก์ ํ ์ ์๋ค๋ฉด ๋์์ ์ผ๋ก๋ ๊ด์ธก๊ธฐ ๋ฑ์ ๋ง๋ค์ด์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ, ๊ด์ธก๊ธฐ๋ฅผ ์๋ฌด๋ฆฌ ์ ๋ง๋ ๋ค๊ณ ํ๋๋ผ๋ ์์คํ ์ ์ ์ฒด ๋์๊ธฐ๊ฐ ๋์ ํ์ฉํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ์ธก์ ํ ์ ์๋ค๋ฉด ๊ฐ๋ฅํ ์ ๋ฐํ๊ฒ ์ด ์ ๋ณด๋ฅผ ์์๋ด๋ ๊ฒ์ด ์์คํ ์ ์์ ์ ์ผ๋ก ๊ตฌ์ฑํ๋ ์ฒซ ๊ฑธ์์ด ๋ฉ๋๋ค.
ํ์ ์ถ์ ์์น, ํน์ ์๋๋ฅผ ์์๋ด๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ์ง๊ด์ ์ผ๋ก ๋ช ํํฉ๋๋ค. ์์ฝ๋์ ๊ฐ์ด ํ์ ์ฒด์ ํน์ ์์น๋ง๋ค ํ์ค๋ฅผ ๋ฐ์ํ๋ ์ผ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ํ๋ง ์ฃผ๊ธฐ ์ด๋ด์ ํ์ค ์ ํธ๊ฐ ๋ฐ์๋๋ ๋ณํ๊ฐ ์์ด์ผ ์ธก์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์คํ ์์ ํ์๋ก ํ๋ PPR์ ๊ฐ๋ ์์ฝ๋๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์์น์ ๋ณด๋ก ์๋๋ฅผ ์ป๋ ๊ฒ๋ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ๋ง์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ๋ ์์น์ ๋ณด๋ฅผ ๋ฏธ๋ถํด์ ์๋๋ฅผ ์ป์ ์ ์์ง๋ง ์ด ๊ฒฝ์ฐ ๋ ธ์ด์ฆ๊ฐ ์ฆํญ๋์ด ๋ถ์ ํํ ์๋๋ฅผ ๋ง๋ค์ด ๋ด๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ํํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์ ํธ์ฒ๋ฆฌ ๊ธฐ๋ฒ๋ค์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ต๊ทผ angle tracking observer ๋ผ ๋ถ๋ฆฌ๋ ํํฐ๋ฅผ ์ฌ์ฉํด์ ์์น์ ๋ณด๋ฅผ ํํฐ๋งํ๊ณ ์๋์ ๋ณด๋ฅผ ์ป๋ ๊ธฐ๋ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.