STM32F103驅動舵機

舵機是通過高電平的佔空比來調節輸出軸的角度,舵機的驅動信號是50Hz的方波信號,每個週期爲20ms,其中高電平的佔比在0.5ms-2.5ms之間,對應關係如下:

       0.5ms--------------0度;

  1.0ms------------45度;

  1.5ms------------90度;

  2.0ms-----------135度;

  2.5ms-----------180度;

所以我們可以通過控制控制信號的高電平長度來調節輸出角度,從而實現方向的控制。

STM32內有很多定時器,可以利用定時器的PWM輸出功能輕鬆地調出我們需要的50Hz脈衝信號,通過調節PWM輸出的時長來調節舵機的角度,定時器的配置代碼如下:

void TIM3_PWM_Init(u16 arr,u16 psc)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//使能定時器3時鐘
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外設和AFIO複用功能模塊時鐘
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    
 
   //設置該引腳爲複用輸出功能,輸出TIM3 CH2的PWM脈衝波形	GPIOB.5
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //複用推輓輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
   //初始化TIM3
	TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄存器週期的值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作爲TIMx時鐘頻率除數的預分頻值 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位
	
	//初始化TIM3 Channel2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈衝寬度調製模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性低
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根據T指定的參數初始化外設TIM3 OC2

	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的預裝載寄存器
 
	TIM_Cmd(TIM3, ENABLE);  //使能TIM3
	

}

主函數如下:

 int main(void)
 {		
 	u16 led0pwmval=0;
	u8 dir=1;	
	delay_init();	    	 //延時函數初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	uart_init(115200);	 //串口初始化爲115200
 	LED_Init();			     //LED端口初始化
 	TIM3_PWM_Init(19999,71);	 //72分頻。PWM頻率=72000000/72/20000=50hz
   	while(1)
	{
 		delay_ms(5);	 
		if(dir)led0pwmval++;
		else led0pwmval--;

 		if(led0pwmval>2500)dir=0;//設定最長高電平爲2.5ms
		if(led0pwmval<=500)dir=1;//設定最短高電平爲0.5ms										 
		TIM_SetCompare2(TIM3,led0pwmval);		   
	}	 
 }

 

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