智能车学习日记(四)Encoder_demo

该代码片段展示了如何使用GPT12编码器来检测车速。通过初始化不同的GPT12定时器(如T2、T3、T4、T5和T6),设置计数和方向引脚,并配置为上升沿触发的计数模式。之后,可以读取计数值以计算车速,并通过清除计数器来重置。示例中使用了T2定时器,编码器的LSB引脚为P33_7,DIR引脚为P33_6。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值