GPT12_编码器的使用(检测车速)
zf_gpt12.c
//-------------------------------------------------------------------------------------------------------------------
// @brief GPT12初始化(编码器采集)
// @param gptn 选择所使用的GPT12定时器
// @param count_pin 设置计数引脚
// @param dir_pin 设置计数方向引脚
// @return void
// Sample usage: gpt12_init(GPT12_T2, GPT12_T2INA_P00_7, GPT12_T2EUDA_P00_8);//使用T2定时器 P00_7引脚进行计数 计数方向使用P00_8引脚
//-------------------------------------------------------------------------------------------------------------------
void gpt12_init(GPTN_enum gptn, GPT_PIN_enum count_pin, GPT_PIN_enum dir_pin)
{
IfxGpt12_enableModule(&MODULE_GPT120);
IfxGpt12_setGpt1BlockPrescaler(&MODULE_GPT120, IfxGpt12_Gpt1BlockPrescaler_4);
IfxGpt12_setGpt2BlockPrescaler(&MODULE_GPT120, IfxGpt12_Gpt2BlockPrescaler_4);
gpt12_mux(gptn, count_pin, dir_pin);
switch(gptn)
{
case GPT12_T2:
{
IfxGpt12_T2_setCounterInputMode(&MODULE_GPT120, IfxGpt12_CounterInputMode_risingEdgeTxIN);
IfxGpt12_T2_setDirectionSource(&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
IfxGpt12_T2_setMode(&MODULE_GPT120, IfxGpt12_Mode_counter);
IfxGpt12_T2_run(&MODULE_GPT120, IfxGpt12_TimerRun_start);
}break;
case GPT12_T3:
{
IfxGpt12_T3_setCounterInputMode(&MODULE_GPT120, IfxGpt12_CounterInputMode_risingEdgeTxIN);
IfxGpt12_T3_setDirectionSource(&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
IfxGpt12_T3_setMode(&MODULE_GPT120, IfxGpt12_Mode_counter);
IfxGpt12_T3_run(&MODULE_GPT120, IfxGpt12_TimerRun_start);
}break;
case GPT12_T4:
{
IfxGpt12_T4_setCounterInputMode(&MODULE_GPT120, IfxGpt12_CounterInputMode_risingEdgeTxIN);
IfxGpt12_T4_setDirectionSource(&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
IfxGpt12_T4_setMode(&MODULE_GPT120, IfxGpt12_Mode_counter);
IfxGpt12_T4_run(&MODULE_GPT120, IfxGpt12_TimerRun_start);
}break;
case GPT12_T5:
{
IfxGpt12_T5_setCounterInputMode(&MODULE_GPT120, IfxGpt12_CounterInputMode_risingEdgeTxIN);
IfxGpt12_T5_setDirectionSource(&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
IfxGpt12_T5_setMode(&MODULE_GPT120, IfxGpt12_Mode_counter);
IfxGpt12_T5_run(&MODULE_GPT120, IfxGpt12_TimerRun_start);
}break;
case GPT12_T6:
{
IfxGpt12_T6_setCounterInputMode(&MODULE_GPT120, IfxGpt12_CounterInputMode_risingEdgeTxIN);
IfxGpt12_T6_setDirectionSource(&MODULE_GPT120, IfxGpt12_TimerDirectionSource_external);
IfxGpt12_T6_setMode(&MODULE_GPT120, IfxGpt12_Mode_counter);
IfxGpt12_T6_run(&MODULE_GPT120, IfxGpt12_TimerRun_start);
}break;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPT12计数读取(编码器采集)
// @param gptn 选择所使用的GPT12定时器
// @return void
// Sample usage: speed = gpt12_get(GPT12_T2);//使用T2定时器
//-------------------------------------------------------------------------------------------------------------------
int16 gpt12_get(GPTN_enum gptn)
{
switch(gptn)
{
case GPT12_T2: return (int16)IfxGpt12_T2_getTimerValue(&MODULE_GPT120);
case GPT12_T3: return (int16)IfxGpt12_T3_getTimerValue(&MODULE_GPT120);
case GPT12_T4: return (int16)IfxGpt12_T4_getTimerValue(&MODULE_GPT120);
case GPT12_T5: return (int16)IfxGpt12_T5_getTimerValue(&MODULE_GPT120);
case GPT12_T6: return (int16)IfxGpt12_T6_getTimerValue(&MODULE_GPT120);
default: return 0;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 清除GPT12计数(编码器采集)
// @param gptn 选择所使用的GPT12定时器
// @return void
// Sample usage: gpt12_clear(GPT12_T2);//使用T2定时器
//-------------------------------------------------------------------------------------------------------------------
void gpt12_clear(GPTN_enum gptn)
{
switch(gptn)
{
case GPT12_T2: IfxGpt12_T2_setTimerValue(&MODULE_GPT120, 0); break;
case GPT12_T3: IfxGpt12_T3_setTimerValue(&MODULE_GPT120, 0); break;
case GPT12_T4: IfxGpt12_T4_setTimerValue(&MODULE_GPT120, 0); break;
case GPT12_T5: IfxGpt12_T5_setTimerValue(&MODULE_GPT120, 0); break;
case GPT12_T6: IfxGpt12_T6_setTimerValue(&MODULE_GPT120, 0); break;
}
}
主函数
int16 speed;
int core0_main(void)
{
disableInterrupts();
get_clk();//获取时钟频率 务必保留
//用户在此处调用各种初始化函数等
//第一个参数 表示选择使用的定时器
//第二个参数 表示选择的计数引脚 计数引脚与方向引脚不可交换
//第三个参数 表示选择的方向引脚
gpt12_init(GPT12_T2, GPT12_T2INB_P33_7, GPT12_T2EUDB_P33_6);
enableInterrupts();
while (TRUE)
{
speed = gpt12_get(GPT12_T2);
gpt12_clear(GPT12_T2);
//打印采集到的编码器数据,可以先学习printf例程,了解如何使用printf
printf("speed: %d\n", speed);
systick_delay_ms(STM0, 100);
//旋转编码器越快显示的数据越大,正转数值为正,反正数值为负
}
}
有五个定时器
推荐使用t2,t4,t5,t6四个口
四个编码器
LSB:33_7 DIR:33_6
LSB:02_8 DIR:00_9
LSB:10_3 DIR:10_1
LSB:20_3 DIR:20_0