STM32串口控制舵机

首先我们要解决

硬件问题:

舵机工作电压是多少?
一般供电范围是4.8V-6.0V电压,我这种舵机3V、5V不影响使用,个人觉得不要太大就行了。
舵机的三根线代表什么意思?
红色的是电源正极,黑色的是电源负极,白色的是信号线。有些舵机线是红棕橘三色,分别对应红黑白。
STM32开发板可以直接连接舵机吗?
有人可以直接连接,没有出现什么问题,但是有人可能会出现单片机复位的情况,可能是舵机瞬间驱动电流太大,使供电电压下降,引起单片机复位,我试验一下确实是电压太低了,舵机一开,电压就开始下降,从4点多降到3点多,最好还是分成两个电源,舵机一个,STM32一个,然后再把他们共地,单片机电压就会非常稳定,不会再复位。
我通过一个稳压模块给舵机供电
舵机发烫可能是什么问题?
接线接反了,或者是舵机受到阻碍了。

舵机代码

我的代码总体框架是:

***PWM(主要)***

***LCD显示(次要)***

***串口改变占空比***

1、 PWM
简单的配置就不说了。

/*******************************************************************************
* 函 数 名         : TIM3_CH1_PWM_Init
* 函数功能		   : TIM3通道1 PWM初始化函数
* 输    入         : per:重装载值
					 psc:分频系数
* 输    出         : 无
*******************************************************************************/
void TIM3_CH1_PWM_Init(u16 per,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/* 开启时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	/*  配置GPIO的模式和IO口 */
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
//	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射	
	
	TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);	
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 10;							//确定占空比,这个值决定了有效电平的时间
	TIM_OC1Init(TIM3,&TIM_OCInitStructure); //输出比较通道1初始化
	
	TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIMx在 CCR1 上的预装载寄存器
	TIM_ARRPreloadConfig(TIM3,ENABLE);//使能预装载寄存器
	
	TIM_Cmd(TIM3,ENABLE); //使能定时器
		
}

接下来是设置自动装载值和分频系数,因为舵机的控制一般需要一个20ms左右的时基脉冲,我们需要一个20ms的PWM周期。

TIM3_CH1_PWM_Init(200-1,7200-1);	

分频系数7200-1是什么意思?
我们用的是TIM3,TIM3挂载在APB1时钟上。
在这里插入图片描述
默认情况下,系统和APB2都是72MHz,APB1是36MHz。
在这里插入图片描述
如果预分频系数不为1,那么定时器的时钟频率被设为与其相连的APB总线频率的2倍,所以TIM3的时钟频率应该算72MHz。那为什么要减1呢,因为它默认加1。1MHz的频率,脉冲周期就是1us,分频7200-1就是100us。
自动装载值200-1是什么意思?
就是数到199就清零了,重新开始了,0~199就可以看做一个周期啦。这样一个周期就是200*100us=20ms。

TIM_SetCompare1(TIM3, num);

这个函数用来设置占空比,只要计数比num小,就会产生有效的高电平。(由我们的配置决定的。)
在这里插入图片描述
在这里插入图片描述

2、 LCD显示(次要)

完成初始化后

LCD_ShowNum(50,50,num,3,16);

显示占空比达到的值

3、 串口改变占空比

/*******************************************************************************
* 函 数 名         : USART1_IRQHandler
* 函数功能		   : USART1中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/ 
void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 r;
	static char pwm[4];
	static int i=0;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		r =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		if(r!=0x0D&&r!=0x0A)
		{
			pwm[i]=r;
			i++;
		}
		else
		{
			i=0;
			num=(atoi(pwm));
			TIM_SetCompare1(TIM3, num);
		}
		USART_SendData(USART1,r);
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
	} 
	USART_ClearFlag(USART1,USART_FLAG_TC);
}

总的来说就是把ASCII码一个个接住储存在数组中,直到检测到回车键和换行键,把数组中的ASCII码变成一个数字,赋给num,从而改变占空比。

实验

舵机最大最小可以转多少度?
真的通过占空比改角度吗?

在这里插入图片描述
这是理论上高电平的周期可以实现舵机的角度,我们来试验一下。
一个脉冲周期是100us,那么5个就是500us=0.5ms。
在这里插入图片描述
我们在串口助手发送05,要记得加上回车,转换成16进制是这样的
在这里插入图片描述
舵机转成这样
在这里插入图片描述
在逻辑分析仪上观察到的PWM是这样的
在这里插入图片描述
周期是20ms,频率是50Hz,脉冲宽度500us,这就是我们所输出的PWM。
现在我们串口发送25,
舵机转成这样
在这里插入图片描述
在逻辑分析仪上观察到的PWM是这样的
在这里插入图片描述
尴尬了,我这个是270度的
在这里插入图片描述
市面有90-180-270-360度,觉得道理应该差不多的。
下面是main.c:
在这里插入图片描述

总的代码可以参考一下

  • 38
    点赞
  • 269
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: 要使用STM32控制舵机,首先需要连接STM32串口舵机进行通信。通常,舵机使用PWM信号进行控制,而STM32串口是数字信号,所以需要一个PWM转换模块。 首先,将舵机的信号线连接到STM32的一个PWM引脚。然后,通过编程配置该引脚为PWM输出模式,并设置合适的频率和占空比。通常,舵机的控制信号频率为50Hz,占空比范围在5%到10%之间。 接下来,在主程序中初始化串口PWM模块。通过配置串口的波特率、数据位、停止位和校验位等参数,确保与舵机通信的正确性。同时,设置PWM的频率和占空比,并启用PWM输出。 接着,在主循环中,可以通过串口接收数据来控制舵机的角度。首先,通过串口接收函数获取到接收到的数据,并进行相应的解析。例如,可以约定接收到的数据为一个介于0到180的角度值。然后,将接收到的角度值转换为对应的占空比,计算公式为: 占空比 = 最小占空比 + (角度值 / 最大角度值) * 占空比范围 最后,将计算得到的占空比值写入PWM输出寄存器,即可控制舵机的角度。 需要注意的是,舵机通常需要精确的控制信号才能保持稳定的角度。因此,在编程过程中,需要根据具体的舵机型号和要求进行调试和优化。 通过以上步骤,就可以实现使用STM32控制舵机的功能了。当然,具体的实现细节还需要根据实际情况进行调整和优化,但以上的步骤可以作为一个基本的指导。 ### 回答2: STM32是一款功能强大的单片机,可以通过串口控制舵机。要实现串口控制舵机的功能,我们需要按照以下步骤进行操作。 首先,我们需要选择一个可用的串口引脚来进行通信。在STM32的开发环境中,可以通过设置相关的寄存器来配置串口引脚。 接下来,我们需要连接舵机舵机通常需要接入电源和信号线。电源一般通过外部电源供应,而信号线则连接到STM32的GPIO引脚上。 然后,我们需要编写代码来实现串口控制舵机的功能。首先,我们需要初始化串口并设置相应的波特率、数据位数、停止位数和校验位等参数。然后,我们可以使用串口发送指令给舵机舵机通常接收角度数据,我们可以通过串口发送特定格式的数据来控制舵机的运动。具体的指令格式需要根据舵机的通信协议来确定。 最后,在代码中我们需要循环发送指令给舵机,以达到控制舵机运动的效果。可以根据需要编写不同的控制指令,实现舵机的旋转、停止等功能。 总的来说,通过STM32串口功能,我们可以方便地实现对舵机的控制。需要注意的是,具体的操作和指令格式可能会因舵机的型号和通信协议而有所不同,所以在实际应用中需要根据具体的情况进行调整和修改。 ### 回答3: 要使用STM32控制舵机,首先需要将舵机的信号线连接到STM32的一组GPIO引脚上,并将该引脚配置为UART模式。然后,在STM32的代码中,需要初始化串口模块并设置相关参数,例如波特率、数据位、停止位和校验位等。 接着,在代码中可以使用串口发送函数向舵机发送指令。舵机一般采用PWM信号进行控制,可以通过串口发送指令来改变舵机的位置。具体来说,可以通过发送不同角度或脉宽的数据来控制舵机的转动方向和角度。 需要注意的是,舵机STM32之间的通信协议通常是特定的,可能需要根据舵机厂家提供的文档来编写相应的控制程序。一般情况下,可以通过发送特定的控制指令来实现舵机的转动。例如,可以通过发送一个特定的脉冲宽度来控制舵机的角度,或者通过发送一个角度值来实现相应的转动。 在编写控制程序时,还可以根据需要添加一些额外的功能,例如角度限制或舵机速度控制。这些功能可根据具体需求在控制程序中添加。 总之,通过使用STM32串口功能和相应的控制程序,可以实现对舵机的控制。舵机的转动通过串口发送特定的指令,实现对舵机角度的控制,从而满足各种控制舵机的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值