STM32控制舵机精准角度

这篇具有很好参考价值的文章主要介绍了STM32控制舵机精准角度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、舵机原理

二、程序介绍

三、精准角度控制原理

四、程序分享

        网上很多教程,都只是控制舵机0°,45°,90°等特定的角度,比如1°,很多程序都做不到,即使有也少得可怜,更不会详解介绍是怎么实现精准控制每一度的,因此,这篇文章的意义就在这里。


一、舵机原理       

 我们以SG90、MG90等舵机为例,舵机有三个PIN,分别是VCC,GND,PWM,PWM引脚需要一个20ms周期信号,通过不同的占空比来控制不同角度,具体参数如下:

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

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

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

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

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

        动态原理如下,源自网上。

stm32 舵机,电路设计,硬件设计,单片机,stm32

二、程序介绍

        产生PMW的方法很多,典型的就是用单片机,这里以STM32F1举例

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);	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  
	
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);   
 
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
 

	TIM_TimeBaseStructure.TIM_Period = arr; 
	TIM_TimeBaseStructure.TIM_Prescaler =psc; 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
	

	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  

	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  
 
	TIM_Cmd(TIM3, ENABLE);  
	
}

主函数:

void Servo_Control(float angle)
{
	float temp;
	u16 led0pwmval=0;
//	temp = 195- 0.11*(float)angle;
//	TIM_SetCompare2(TIM3, (float)temp);
	 pwmval = (int)(2000*(1-((0.5+angle/90.0)/20.0))) -5;
	TIM_SetCompare2(TIM3, pwmval);//
}


int main(void)
 {	
	 float i;
	Servo_Control(0);
	delay_init();	    
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 
 	LED_Init();		
 	//TIM3_PWM_Init(199,7199);	 //(199+1)*(7199+1)/72*10^6  0.02S  20MS
	TIM3_PWM_Init(1999,719);

   	while(1)
	{		
			Servo_Control(0);

		/*
	 for(i=0;i<=179;i++)
			{
				Servo_Control(i);
					delay_ms(2);
			}
			delay_ms(2);
		 for(i=180;i>=1;i--)					
				{		
					Servo_Control(i);
				  delay_ms(2);														
				}  
				delay_ms(2);
		*/		
	}
} 

这里分为两部分:

 	//TIM3_PWM_Init(199,7199);	 //(199+1)*(7199+1)/72*10^6  0.02S  20MS
	TIM3_PWM_Init(1999,719);

        首先两个定时器都能产生20ms周期的脉冲,但是网上很多网友使用的都是第一种方式:TIM3_PWM_Init(199,7199),这个的弊端是,由于计数的数量太少了,才199,导致在控制舵机角度的时候,即使我最小修改一个单位的数值,表现出来的变化脉冲宽度都比较大,导致舵机旋转了大于一个度数,换句话说,这个代码调节的精度太差。

        因此,我们需要想办法让计数器计数得尽量多,在我们修改前期的数值时,后面的脉宽变化很小很小,小于舵机旋转1°所需的变化脉宽,我们就成功了。

因此,我们使用:TIM3_PWM_Init(1999,719);

三、精准角度控制原理

        精准角度控制,主要在下面这两行代码

	
    pwmval = (int)(2000*(1-((0.5+angle/90.0)/20.0))) -5;
	TIM_SetCompare2(TIM3, pwmval);

        假设我们需要舵机旋转45°,则占空比为1ms/20ms=5%,则TIM_SetCompare2TIMx 捕获比较 1 寄存器值就是2000-2000*5%=1900;

那这个数值跟角度有什么关系呢,就来到了这个代码:  

pwmval = (int)(2000*(1-((0.5+angle/90.0)/20.0))) -5;

        占空比从0.5开始为0°,因此需要以0.5开始相加,我们假设把45°为angle带进去,则最里面的括号为1,正好对标舵机45°时候的1ms。

        那为什么我后面要减5呢,这个是我舵机的误差,因为在我设定为0°的时候,我发现舵机的角度并不是完完全全的水平,因此这个相当于一个校准系数,根据实际情况而定,如果舵机质量很好,没有误差,那不需要-5,就是这个意思。

我这里还写了一个for循环,供大家参考,作用是使得舵机以1°的步进正反旋转。

for(i=0;i<=179;i++)
			{
				Servo_Control(i);
					delay_ms(2);
			}
		delay_ms(2);
for(i=180;i>=1;i--)					
				{		
					Servo_Control(i);
				  delay_ms(2);														
				}  
		delay_ms(2);

四、程序分享

        这里附上下载链接,或者去我的主页

        STM32控制舵机精准角度程序,精确到某一度-嵌入式文档类资源-CSDN下载

你的点赞或收藏是我创作的动力~~文章来源地址https://www.toymoban.com/news/detail-616336.html

到了这里,关于STM32控制舵机精准角度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Stm32最小系统板电路图设计、PCB设计

    复位电路,就是指单片机芯片可以通过外部外部引脚输入复位电平信号,从而使单片机除备份区以外的所有寄存器都恢复为默认值,且芯片内烧录的程序会重新执行。对于STM32103C8T6芯片来说,其复位引脚是7号引脚,也就是NRST引脚。 通过复位电路对Stm32芯片系统进行的复位是

    2024年02月10日
    浏览(36)
  • 基于STM32的最小系统电路设计(手把手零基础教学)

       在上篇介绍完《STM32的核心板制作流程》后,本篇我们将开始学习STM32最小系统电路的设计。具体包括 复位电路 、 晶振电路 、 电源转换电路 、 SWD下载电路 、 LED测试电路 、 芯片外扩引脚 和 STM32微控制电路 ,核心板原理图如下所示。 一个简单的复位电路图,如下所

    2024年02月03日
    浏览(42)
  • STM32——舵机控制

    一、舵机控制原理 (一)概述         舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就会保持相对的角度位置不变。如果控制信号发生变化,输出轴的位

    2024年04月23日
    浏览(41)
  • STM32F103RCT6电路设计及绘制方法和学习体会

    目录 1电路图各部分原理分析 1.1通信-下载板块接口电路 1.1.1 通信模块 1.1.2 显示灯 1.2电源转化电路 1.2.1 电源转化 1.3晶振电路 1.4 OLED显示屏接口电路 1.5 独立按键电路 1.6 JTAG/SWD调试接口电路 1.7 STM32微控制器电路 1.7.1 副芯片原理 1.7.2 主芯片原理 1.8 外扩引脚 1.9 显示灯 2图纸的

    2024年02月14日
    浏览(57)
  • stm32同时控制两个舵机

    硬件准备:stm32,两个舵机   舵机pwm波形输出,使用TIM2中的两个通道进行输出。 pwm.c pwm,h 为了更加直观的使用,用Servo函数对pwm输出占空比与舵机旋转角度进行封装。 Servo,c Servo,h 主函数 同时分享一位大佬的视频,我也是跟着他学习,一步一步总结的。 https://www.bilibili.com/vi

    2024年02月13日
    浏览(35)
  • 用STM32单片机ADC+NTC热敏电阻采集温度的设计思路 | 附参考电路

    目录 前言 一、热敏电阻NTC 二、参考电路  三、激励电压选择 记录一些我在工作和学习过程中遇到的问题 NTC:在淘宝随便买的 单片机型号:STM32G030C8T6 目的:用单片机采集NTC温度 本文主要是介绍关于NTC激励电压的选择        热敏电阻 NTC(Negative Temperature Coefficient) , 直

    2024年02月02日
    浏览(45)
  • 基于STM32 SG90 9g舵机控制

    产品参数 名称:9克舵机180度 尺寸:23mm X 12.2mm X 29mm 重量:9克 扭矩:1.5kg/cm 工作电压:4.2 - 6V 温度范围:0 - 55℃ 运行速度:0.3s/60℃ 死带宽:10ms 舵机有三条线定义: 暗灰:GND 红色:VCC 4.8V - 7.2V 橙黄线:脉冲输入 在机器人机电控制系统中,舵机控制效果是性能的重要影响

    2024年02月14日
    浏览(44)
  • STM32输出PWM波控制180°舵机

    时间记录:2024/2/8 (1)脉冲宽度调制 (2)占空比:高电平时间占整个周期时间的比例 (3)STM32通过定时器实现PWM时具有两种模式 PWM1模式:向上计数模式下,CNT当前计数寄存器的值小于CCR比较寄存器的值时输出有效电平,大于时输出无效电平,向下计数模式下,CNT当前计数

    2024年02月21日
    浏览(48)
  • 基于STM32F1的舵机控制

    一、SG90舵机介绍 SG90是有三个版本的,90度版、180度版和360度版,前两个只是舵机旋转角度的范围不一样,可以在这个范围内任意的控制舵机所转的角度,而360版本的是一直旋转的,我们不能控制它旋转的角度,只能控制它旋转的速度,这里我们在买的时候就要注意一点,根

    2023年04月25日
    浏览(278)
  • stm32中如何使用PCA9685控制舵机(详解)

    最近在公司实习,都说跨入职场是让人进步最快的方式,记录一下我自学加同学指点学到新知识。 PCA9685是一个基于IIC通信的16路PWM输出模块,可以在单片机资源不足的情况下进行扩展使用。 i2c通信,只需要2根i2c线就可以控制16路pwm,周期和占空比都可控。 可以多个模块级联

    2024年02月06日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包