STM32在定時器中控制步進電機

寫WEB程序的時候,發現若是加上步進電機控制的話,就會出現問題。緣由是若是把電機控制放在uip循環中處理的話,由於控制電機涉及到時間問題。因此必須解決,想到的方法就是多任務的思想。把步進電機的處理放在定時器中斷裏面。這樣的話就能避免問題了。順便學習了庫函數操做定時器。這裏用到的定時器功能簡單,只須要產生更新中斷。函數

下面是定時器初始化代碼學習

//定時器3初始化
//arr:定時重裝值
//psc:分頻值
void TIM3_Init(uint16_t arr, uint16_t psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//開啓TIM3時鐘
	
	//定時器3配置,重載值、分頻值、分頻係數、計數模式
	TIM_TimeBaseStructure.TIM_Period = arr;
	TIM_TimeBaseStructure.TIM_Prescaler = psc;
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); 	//容許定時更新中斷
	
	//中斷配置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM3, ENABLE); 	//使能定時器3
}


定時器中斷處理函數ui

void TIM3_IRQHandler(void)
{
  	static uint8_t i;	//相序計數器
	
	if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
		Motorcw(i);		//電機正轉
		i++;
		if(i==4)
		  i = 0;
	}
}


電機正傳代碼函數code

void Motorcw(uint8_t i)
{
	GPIO_Write(GPIOC,phasecw[i]);
}


這樣的話就不能干擾到uip的正常事件處理了。
事件

相關文章
相關標籤/搜索