stm32學習札記——使用GPIO和定時器,模擬光電編碼器信號輸出


//模擬光電編碼器1khz定時週期。
//這裏僅僅模擬了AB編碼器,如果需要還可以增加ABZ編碼器。暫時不模擬Z軸信號了。

#define encoder_pa  ??? //PA0
#define encoder_pb  ??? //PA1
#define tim_freq 1000//hz 使用定時器的頻率

u16 freq;
u16 period;
s16 dir;


void sim_encoder(void)
{
	static u16 t=0;

	freq   = 1*4;// hz 最大1000hz的頻率 必須是4的倍數才準確。
	period = (tim_freq/freq)/4;// 1 freq = 250hz
	dir    = 1;//方向

	if(dir==1)
	{
		t++;
	}
	else if(dir==-1)
	{
		t--;
	}
	if(t>=period*4) t=0;
	if(t<0)       	t=period*4;


	if(t<period)
	{
		encoder_pa=1;
		encoder_pb=0;
	}
	else if(t< period*2)
	{
		encoder_pa=1;
		encoder_pb=1;
	}
	else if(t< period*3)
	{
		encoder_pa=0;
		encoder_pb=1;
	}
	else if(t< period*4)
	{
		encoder_pa=0;
		encoder_pb=0;
	}
	else
	{
		t=0;
	}

}

//模擬光電編碼器1khz定時週期。

//這裏僅僅模擬了AB編碼器,如果需要還可以增加ABZ編碼器。暫時不模擬Z軸信號了。

 

#define encoder_pa ??? //PA0

#define encoder_pb ??? //PA1

#define tim_freq 1000//hz 使用定時器的頻率

 

u16 freq;

u16 period;

s16 dir;

 

 

void sim_encoder(void)

{

static u16 t=0;

 

freq = 1*4;// hz 最大1000hz的頻率 必須是4的倍數才準確。

period = (tim_freq/freq)/4;// 1 freq = 250hz

dir = 1;//方向

 

if(dir==1)

{

t++;

}

else if(dir==-1)

{

t--;

}

if(t>=period*4) t=0;

if(t<0) t=period*4;

 

 

if(t<period)

{

encoder_pa=1;

encoder_pb=0;

}

else if(t< period*2)

{

encoder_pa=1;

encoder_pb=1;

}

else if(t< period*3)

{

encoder_pa=0;

encoder_pb=1;

}

else if(t< period*4)

{

encoder_pa=0;

encoder_pb=0;

}

else

{

t=0;

}

 

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章