良心分享:STM32F103C8T6驱动16路舵机

一、所需硬件:

01、STM32F103C8T6最小系统板。
02、ST-LINK V2下载器。
03、CH340。
04、16个SG90舵机。
05、杜邦线。
06、STM32F103C8T6舵机驱动板(有的话接线方便,没有亦可)。

二、所需软件:

01、MDK5。
02、串口调试助手XCOM。

三、配套代码:(已免费分享,在文章顶部即可下载)

01、四个按键触发16路舵机进行偏转:

/********************************************************************************************************************************************
2022.07.30    基础知识储备:
							TIM1_ETR     PA12            
							TIM1_CH1     PA8            TIM2_CH1_ETR PA0            TIM3_CH1     PA6            TIM4_CH1     PB6 
							TIM1_CH2     PA9            TIM2_CH2     PA1            TIM3_CH2     PA7            TIM4_CH2     PB7
							TIM1_CH3     PA10           TIM2_CH3     PA2            TIM3_CH3     PB0            TIM4_CH3     PB8 
							TIM1_CH4     PA11           TIM2_CH4     PA3            TIM3_CH4     PB1            TIM4_CH4     PB9  
							
		 SG90舵机控制方法:
                         --高电平时间为T1--                          总周期20ms:
                            —— —— —— ——
                           |           |                              高电平时间T1为 0.5ms     舵机转动0°
						   |           |                              高电平时间T1为   1ms     舵机转动45°
						   |           |                              高电平时间T1为 1.5ms     舵机转动90°
						   |           |                              高电平时间T1为   2ms     舵机转动135°
									   —— —— —— —— —— ——              高电平时间T1为 2.5ms     舵机转动180°
                           --------总周期 T2为20ms--------
												 
		代码思路:1、Ctrl + c  然后  Ctrl + v     哈哈哈哈!				

			
		以180度舵机为例定义:高电平时间T1为 1.5ms     舵机转动90°    相对位置为     0°    参数为1850  
				   相对而言:高电平时间T1为 0.5ms     舵机转动0°     相对位置为   -90°    参数为1945  
                            高电平时间T1为   1ms     舵机转动45°    相对位置为   -45°    参数为1900  
							高电平时间T1为 1.5ms     舵机转动90°    相对位置为     0°    参数为1850  
                            高电平时间T1为   2ms     舵机转动135°   相对位置为   +45°    参数为1800  
							高电平时间T1为 2.5ms     舵机转动180°   相对位置为   +90°    参数为1750  
																		 
																		 
		//-90°
		//TIM_SetCompare1(TIM4,1945);//占空比(2000-1945)/2000*20ms=0.5ms 
		
		//-45°
		//TIM_SetCompare1(TIM4,1900);//占空比(2000-1900)/2000*20ms=1ms
		
		//0°
		//TIM_SetCompare1(TIM4,1850);//占空比(2000-1850)/2000*20ms=1.5ms
		
		//+45°
		//TIM_SetCompare1(TIM4,1800);//占空比(2000-1800)/2000*20ms=2ms
		
		//+90°
		//TIM_SetCompare1(TIM4,1750);//占空比(2000-1750)/2000*20ms=2.5ms




2022.07.31			1、机械狗项目需要用到的引脚有:
                          
									 TIM1_CH1     PA8            TIM2_CH1_ETR PA0            TIM3_CH1     PA6            TIM4_CH1     PB6 
									 TIM1_CH2     PA9            TIM2_CH2     PA1            TIM3_CH2     PA7            TIM4_CH2     PB7
									 TIM1_CH3     PA10           TIM2_CH3     PA2            TIM3_CH3     PB0            TIM4_CH3     PB8 
									 TIM1_CH4     PA11           TIM2_CH4     PA3            TIM3_CH4     PB1            TIM4_CH4     PB9  
											
								2、测试按键IO为:
								
							        KEY0 PAin(4)   	
										  KEY1 PAin(5)	 
										  KEY2 PCin(15)     
										  KEY3 PCin(14)

2023.12.03 20:40  继续推进 16路全部可以按键驱动,测试没有问题。
******************************************************************************************************************************************************/
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "pwm1.h"
#include "pwm2.h"
#include "pwm3.h"
#include "pwm4.h"


int main(void)
 {	
	u8 t=0;	  
	delay_init();	    	 //延时函数初始化	  
	LED_Init();		  	 	//初始化与LED连接的硬件接口
	KEY_Init();          	//初始化与按键连接的硬件接口
	 
	TIM1_PWM_Init(1999,719);   //PWM频率=72000000/(719+1)/(1999+1)=50hz=20ms
    TIM2_PWM_Init(1999,719);
	TIM3_PWM_Init(1999,719);
    TIM4_PWM_Init(1999,719);	
	 
	LED0=0;					//点亮LED
	while(1)
	{
		LED_Blink_1();
		t=KEY_Scan(0);		//得到键值
		switch(t)
		{				 
			case KEY0_PRES:		//PA4
			
			         TIM_SetCompare1(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH1     PA8  
					 TIM_SetCompare1(TIM1,1900);delay_ms(500);LED_Blink_1();
						 				 							 
					 TIM_SetCompare2(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH2     PA9  
					 TIM_SetCompare2(TIM1,1900);delay_ms(500);LED_Blink_1();											
												 
					 TIM_SetCompare3(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH3     PA10  
					 TIM_SetCompare3(TIM1,1900);delay_ms(500);LED_Blink_1();

					 TIM_SetCompare4(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH4     PA11 
					 TIM_SetCompare4(TIM1,1900);delay_ms(500);LED_Blink_1();			
			     break;
			
			case KEY1_PRES:  //PA5
				   							
										
					TIM_SetCompare1(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH1     PB6 
					TIM_SetCompare1(TIM4,1900);delay_ms(500);LED_Blink_1(); 
												 
					TIM_SetCompare2(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH2     PB7
					TIM_SetCompare2(TIM4,1900);delay_ms(500);LED_Blink_1();
			
					TIM_SetCompare3(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH3     PB8 
					TIM_SetCompare3(TIM4,1900);delay_ms(500);LED_Blink_1();
												 
					TIM_SetCompare4(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH4     PB9  
					TIM_SetCompare4(TIM4,1900);delay_ms(500);LED_Blink_1();
	         break;
			
			case KEY2_PRES:	    //PC15
				    TIM_SetCompare1(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH1     PA6  
					TIM_SetCompare1(TIM3,1900);delay_ms(500);LED_Blink_1();
												 
					TIM_SetCompare2(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH2     PA7   
					TIM_SetCompare2(TIM3,1900);delay_ms(500);LED_Blink_1();
												 
					TIM_SetCompare3(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH3     PB0
					TIM_SetCompare3(TIM3,1900);delay_ms(500);LED_Blink_1();
												 
					TIM_SetCompare4(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH4     PB1 
					TIM_SetCompare4(TIM3,1900);delay_ms(500);LED_Blink_1();
			     break;
			
			case KEY3_PRES: 	 //PC14
					TIM_SetCompare1(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH1_ETR PA0 
					TIM_SetCompare1(TIM2,1800);delay_ms(500);LED_Blink_1();
						 
					TIM_SetCompare2(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH2     PA1  
					TIM_SetCompare2(TIM2,1800);delay_ms(500);LED_Blink_1();
						 
					TIM_SetCompare3(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH3     PA2 
					TIM_SetCompare3(TIM2,1800);delay_ms(500);LED_Blink_1();
						 
					TIM_SetCompare4(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH4     PA3  
					TIM_SetCompare4(TIM2,1800);delay_ms(500);LED_Blink_1();
					 break;	
			
			default:delay_ms(10);
		} 
	}		 
}


02、串口3接收到数据触发16路舵机偏转:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "pwm1.h"
#include "pwm2.h"
#include "pwm3.h"
#include "pwm4.h"
#include "usart3.h"


 int main(void)
 
 {	
	u8 t=0;	  
	delay_init();	    	 //延时函数初始化	  
	LED_Init();		  	 	//初始化与LED连接的硬件接口
	KEY_Init();          	//初始化与按键连接的硬件接口
	 
	TIM1_PWM_Init(1999,719);   //PWM频率=72000000/(719+1)/(1999+1)=50hz=20ms
    TIM2_PWM_Init(1999,719);
	TIM3_PWM_Init(1999,719);
    TIM4_PWM_Init(1999,719);	
	 
	usart3_Init(9600);	
	 
	LED0=0;					//点亮LED
	while(1)
	{
		
		if(USART3_RX_STA==1)                // 串口1:PA9-TX PA10-RX    串口2:PA2-TX PA3-RX     串口3:PB10-TX PB11-RX
		  {
              switch(USART3_RX_CMD)          
				   {	
						 	//用01文件夹来存储需要应答的语句					  //7E FF 06 0F 00 01 01 EF       播放01文件夹01首
						  case	0x01: Uart3_SendCMD2(0X01,0X01,0X01,0X01);LED_Blink_1();
						              TIM_SetCompare1(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH1     PA8  
									  TIM_SetCompare1(TIM1,1900);delay_ms(500);LED_Blink_1();
																								 
									  TIM_SetCompare2(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH2     PA9  
									  TIM_SetCompare2(TIM1,1900);delay_ms(500);LED_Blink_1();											
																			 
									  TIM_SetCompare3(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH3     PA10  
									  TIM_SetCompare3(TIM1,1900);delay_ms(500);LED_Blink_1();

									  TIM_SetCompare4(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH4     PA11 
							          TIM_SetCompare4(TIM1,1900);delay_ms(500);LED_Blink_1();
									  Uart3_SendCMD2(0X01,0X01,0X01,0X01);break;
										
												
                          case 0x02:  Uart3_SendCMD2(0X02,0,0X02,0X02);LED_Blink_1();
						              TIM_SetCompare1(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH1_ETR PA0 
									  TIM_SetCompare1(TIM2,1800);delay_ms(500);LED_Blink_1();
													 
									  TIM_SetCompare2(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH2     PA1  
									  TIM_SetCompare2(TIM2,1800);delay_ms(500);LED_Blink_1();
													 
								      TIM_SetCompare3(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH3     PA2 
								      TIM_SetCompare3(TIM2,1800);delay_ms(500);LED_Blink_1();
													 
								      TIM_SetCompare4(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH4     PA3  
								   	  TIM_SetCompare4(TIM2,1800);delay_ms(500);LED_Blink_1();
									  Uart3_SendCMD2(0X02,0,0X02,0X02);break;

												 
                          case 0x03:  Uart3_SendCMD2(0X03,0X03,0X03,0X03);LED_Blink_1();
						              TIM_SetCompare1(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH1     PA6  
							          TIM_SetCompare1(TIM3,1900);delay_ms(500);LED_Blink_1();
																			 
							 		  TIM_SetCompare2(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH2     PA7   
									  TIM_SetCompare2(TIM3,1900);delay_ms(500);LED_Blink_1();
																			 
									  TIM_SetCompare3(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH3     PB0
							 		  TIM_SetCompare3(TIM3,1900);delay_ms(500);LED_Blink_1();
																			 
								      TIM_SetCompare4(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH4     PB1 
								      TIM_SetCompare4(TIM3,1900);delay_ms(500);LED_Blink_1();
									  Uart3_SendCMD2(0X03,0X03,0X03,0X03);break;
												 
                          case 0x04:  Uart3_SendCMD2(0X04,0X04,0X04,0X04);LED_Blink_1();
						              TIM_SetCompare1(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH1     PB6 
								      TIM_SetCompare1(TIM4,1900);delay_ms(500);LED_Blink_1(); 
																			 
												 TIM_SetCompare2(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH2     PB7
												 TIM_SetCompare2(TIM4,1900);delay_ms(500);LED_Blink_1();
										
												 TIM_SetCompare3(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH3     PB8 
												 TIM_SetCompare3(TIM4,1900);delay_ms(500);LED_Blink_1();
																			 
												 TIM_SetCompare4(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH4     PB9  
												 TIM_SetCompare4(TIM4,1900);delay_ms(500);LED_Blink_1();
												 Uart3_SendCMD2(0X04,0X04,0X04,0X04);break;	

                          case	0x05: Uart3_SendCMD2(0X05,0X05,0X05,0X05);LED_Blink_1();
						              TIM_SetCompare1(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH1     PA8  
												 TIM_SetCompare1(TIM1,1900);delay_ms(500);LED_Blink_1();
																								 
												 TIM_SetCompare2(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH2     PA9  
												 TIM_SetCompare2(TIM1,1900);delay_ms(500);LED_Blink_1();											
																			 
												 TIM_SetCompare3(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH3     PA10  
												 TIM_SetCompare3(TIM1,1900);delay_ms(500);LED_Blink_1();

												 TIM_SetCompare4(TIM1,1800);delay_ms(500);LED_Blink_1();       //TIM1_CH4     PA11 
												 TIM_SetCompare4(TIM1,1900);delay_ms(500);LED_Blink_1();
										
										
					 				             TIM_SetCompare1(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH1_ETR PA0 
												 TIM_SetCompare1(TIM2,1800);delay_ms(500);LED_Blink_1();
													 
												 TIM_SetCompare2(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH2     PA1  
												 TIM_SetCompare2(TIM2,1800);delay_ms(500);LED_Blink_1();
													 
												 TIM_SetCompare3(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH3     PA2 
												 TIM_SetCompare3(TIM2,1800);delay_ms(500);LED_Blink_1();
													 
												 TIM_SetCompare4(TIM2,1900);delay_ms(500);LED_Blink_1();       //TIM2_CH4     PA3  
												 TIM_SetCompare4(TIM2,1800);delay_ms(500);LED_Blink_1();
												 
												 
												 TIM_SetCompare1(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH1     PA6  
												 TIM_SetCompare1(TIM3,1900);delay_ms(500);LED_Blink_1();
																			 
												 TIM_SetCompare2(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH2     PA7   
												 TIM_SetCompare2(TIM3,1900);delay_ms(500);LED_Blink_1();
																			 
												 TIM_SetCompare3(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH3     PB0
												 TIM_SetCompare3(TIM3,1900);delay_ms(500);LED_Blink_1();
																			 
												 TIM_SetCompare4(TIM3,1800);delay_ms(500);LED_Blink_1();       //TIM3_CH4     PB1 
												 TIM_SetCompare4(TIM3,1900);delay_ms(500);LED_Blink_1();	
												 
												 
												 TIM_SetCompare1(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH1     PB6 
												 TIM_SetCompare1(TIM4,1900);delay_ms(500);LED_Blink_1(); 
																			 
												 TIM_SetCompare2(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH2     PB7
												 TIM_SetCompare2(TIM4,1900);delay_ms(500);LED_Blink_1();
										
												 TIM_SetCompare3(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH3     PB8 
												 TIM_SetCompare3(TIM4,1900);delay_ms(500);LED_Blink_1();
																			 
												 TIM_SetCompare4(TIM4,1800);delay_ms(500);LED_Blink_1();       //TIM4_CH4     PB9  
												 TIM_SetCompare4(TIM4,1900);delay_ms(500);LED_Blink_1();
												 
												
												 
												 
												 
												 Uart3_SendCMD2(0X05,0X05,0X05,0X05);break;
												 
												 
						  default:Uart3_SendCMD2(0XFF,0XFF,0XFF,0XFF);
          }	
				
				USART3_RX_STA=0;                    //注意改写此条
	    }	
	
	}		 
}

四、配套代码下载链接:

01、文章对应的资源绑定可以下载。

02、仓库也可以下载:https://gitee.com/ha-city/12345678910.git

五、完结撒花:

01、良心分享:项目已经过UP实际测试:验证通过。

02、免费分享:不需要乱七八糟这的那的才能下载。

03、期待对你有所帮助。
在这里插入图片描述

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要驱动STM32F103C8T6上的180°舵,可以通过PWM(脉冲宽度调制)信号来控制舵的旋转角度。以下是一个简单的步骤: 1. 首先,确保已经将舵的电源线(通常为红色线)连接到3.3V电源引脚,接地线(通常为黑色线)连接到GND引脚,信号线(通常为白色线)连接到STM32F103C8T6的GPIO引脚上。 2. 在STM32F103C8T6上选择一个适当的GPIO引脚作为PWM输出引脚。可以使用STM32CubeMX配置工具来进行引脚设置。 3. 初始化TIM(定时器)和GPIO引脚,以便生成PWM信号。TIM用于产生PWM波形,而GPIO引脚用于将PWM信号发送到舵。 4. 设置TIM的计时频率和分辨率。由于舵通常接受50Hz的PWM信号,因此可以将TIM的预分频系数设置为适当的值,以满足该频率要求。 5. 计算舵在180°范围内的脉冲宽度值。一般来说,左边极限位置的脉冲宽度为500μs,右边极限位置的脉冲宽度为2500μs。根据舵的规格,可以计算出中间位置的脉冲宽度值。 6. 在程序中编写代码,将计算得到的脉冲宽度值设置为TIM的占空比。可以使用PWM的占空比寄存器,例如TIM的CCR(捕获/比较寄存器),来设置舵的旋转角度。 7. 启动TIM定时器,并发送PWM信号到舵。可以使用TIM的启动函数和更新事件来启动和更新PWM波形。 8. 检查舵的旋转情况,并根据需要调整占空比值,以获得所需的旋转角度。 总之,通过使用STM32F103C8T6的PWM功能,可以轻松地驱动180°舵。只需将舵的信号线连接到适当的GPIO引脚,并编写适当的代码来生成PWM信号,以控制舵的旋转角度。 ### 回答2: 要驱动STM32F103C8T6上的180°舵,我们可以使用PWM输出,配合控制信号周期和占空比来精确控制舵的角度。 首先,我们需要使用STM32CubeMX工具进行引脚配置,将舵的控制信号线(例如TIM3_CH1)连接到合适的引脚上。然后选择合适的时钟模式和频率,以及合适的配置和初始化代码生成。 接下来,我们需要初始化定时器(Timer)和PWM输出。在代码中,我们可以使用HAL库函数进行初始化。根据舵的特性,我们需要设置一个适当的PWM周期和占空比范围来控制舵的角度。一般来说,PWM周期为20ms是一个常见的选择,对应的占空比范围是0.5ms到2.5ms,其中0.5ms对应0°,2.5ms对应180°。我们可以根据舵的规格表具体设置合适的数值。 接下来,我们可以使用HAL库函数的`HAL_TIM_PWM_Start()`函数来启动PWM输出。然后,我们可以使用`HAL_TIM_PWM_Start()`函数来改变PWM输出的占空比,从而控制舵的角度。具体来说,我们可以将占空比设置为对应于所需角度的占空比数值。 最后,我们需要在代码中实现舵的角度调整功能。可以使用按键中断、串口通信等方式来接收外部指令,根据指令调整占空比并控制舵的角度。 总结起来,驱动STM32F103C8T6上的180°舵需要使用PWM输出来控制舵的角度。通过合适的引脚配置、初始化定时器和PWM输出,并调整占空比来实现对舵的精确控制。 ### 回答3: 要驱动STM32F103C8T6控制的180°舵,我们需要做以下几步。 首先,连接舵STM32F103C8T6开发板。将舵的VCC引脚连接到开发板的5V引脚,将舵的GND引脚连接到开发板的GND引脚,将舵的信号引脚连接到开发板的一个GPIO引脚(例如PA0)。 接下来,在STM32CubeIDE或其他的STM32开发环境中创建一个工程。设置好工程的时钟和系统时钟,配置GPIO引脚为输出模式。 然后,在代码中设置舵的初始位置和转动范围。180°舵一般默认的初始位置是0°,转动范围为0°到180°。 接着,通过代码控制GPIO引脚的输出电平来控制舵的转动。舵控制的原理是通过脉冲宽度调制(PWM)信号控制舵的位置。其中,PWM信号的周期一般为20ms,高电平脉冲信号的宽度决定了舵的位置,具体数值范围要根据舵的规格而定。 最后,编译并下载代码到STM32F103C8T6开发板上进行测试。可以通过改变输出电平的方式来控制舵的位置,从而实现舵的转动。 总结起来,在使用STM32F103C8T6开发板驱动180°舵时,需要连接舵和开发板,配置GPIO引脚为输出模式,使用PWM信号来控制舵的位置,并通过改变脉冲宽度的方式来控制舵的转动。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值