基于stm32f407舵机的使用以及项目的具体的使用事项

一.前提

1舵机的基本概念

       首先要明白一点,舵机也分为很多种的,现在用的比较多的是模拟舵机和数字舵机他们的区别如下:

模拟舵机和数字舵机是两种常见的舵机类型,它们在控制方式、精确度和价格等方面存在差异。

模拟舵机(Analog Servo):

  1. 控制方式:模拟舵机通过脉冲宽度调制(PWM)信号进行控制,其脉冲宽度通常在1到2毫秒之间变化,用来控制舵机的旋转角度。
  2. 精确度:由于模拟信号容易受到干扰和噪声的影响,模拟舵机的精确度和重复精度相对较低。
  3. 成本:模拟舵机成本较低,适合对控制精度要求不是特别高的应用。

数字舵机(Digital Servo):

  1. 控制方式:数字舵机使用数字信号进行控制,可以通过微控制器精确地控制脉冲宽度,从而提高控制的准确性和响应速度。
  2. 精确度:数字舵机通常具有更好的精确度和重复精度,能够更精确地定位到特定的角度。
  3. 成本:由于采用数字控制技术,数字舵机的价格相对较高。

在选择舵机时,需要根据应用场景的需求来决定使用模拟舵机还是数字舵机。例如,在需要较高精确度和响应速度的场合,数字舵机会是更好的选择;而在成本敏感或者对精确度要求不高的场合,模拟舵机可能更加适合。

        我们平常做项目所用的是模拟舵机,也就是用PWM对其控制的。

然后得清楚控制舵机的一些基本原理:我们常用的一些舵机PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms~2.5ms之间时舵机就可以对应旋转到不同的角度。(以0~180°的舵机为例)1.5ms为90°,2.5ms为180°。

大概的一些常用是知识点就如上了,频率周期这些底层性的 原理东西这里就不在此述说了。

二.具体代码

定时器tim2初始化

//¶æ»úpwm¿ØÖÆ
void TIM2_PWM_Init(u32 arr,u32 psc)
{		 					 
	//´Ë²¿·ÖÐèÊÖ¶¯ÐÞ¸ÄIO¿ÚÉèÖÃ
	
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);  	//TIM13ʱÖÓʹÄÜ    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	//ʹÄÜPORTFʱÖÓ	
	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2); //GPIOF8¸´ÓÃΪ¶¨Ê±Æ÷13
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;           //GPIOF8
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //¸´Óù¦ÄÜ
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//ËÙ¶È100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //ÍÆÍ츴ÓÃÊä³ö
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;        //ÉÏÀ­
	GPIO_Init(GPIOA,&GPIO_InitStructure);              //³õʼ»¯PF8
	  
	TIM_TimeBaseStructure.TIM_Prescaler=psc;  //¶¨Ê±Æ÷·ÖƵ
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòÉϼÆÊýģʽ
	TIM_TimeBaseStructure.TIM_Period=arr;   //×Ô¶¯ÖØ×°ÔØÖµ
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//³õʼ»¯¶¨Ê±Æ÷13
	
	//³õʼ»¯TIM13 Channel1 PWMģʽ	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2   ͨµÀ1
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);  //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯Íâ333333333333333ÉèTIM1 4OC1

	TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);  //ʹÄÜTIM13ÔÚCCR1ÉϵÄԤװÔؼĴæÆ÷
 
  TIM_ARRPreloadConfig(TIM2,ENABLE);//ARPEʹÄÜ 
	
	TIM_Cmd(TIM2, ENABLE);  //ʹÄÜTIM13							  
}  

tim2的初值设置:

	TIM2_PWM_Init(20000,84);	

常规调用:

	TIM_SetCompare1(TIM2,1500);

你可能感兴趣的:(电设,stm32,嵌入式硬件,单片机,硬件工程,c语言)