STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口

这篇具有很好参考价值的文章主要介绍了STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口

1.使用到的工具介绍
2.整个简单介绍
3.程序的介绍
1.使用到的工具介绍:
keil5,烧写软件FlyMcu.exe,硬件为STM32F103C8T6板,SG90舵机还有按键。

2.整个简单介绍:
通过对舵机的了解我这里使用的是sg90舵机可旋转180度,使用的芯片是stm32f103c8t6。在配置2个按键来进行舵机角度加减,通过加减来改变舵机的角度变化;

STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口

SG90舵机红线 VCC线(接5v)
SG90舵机棕线 GND线
SG90舵机黄线 控制信号线

STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口

需要通过PWM来配置出各种角度的占空比,STM32F103的PWM可配置的IO口如下图,对TIM2,TIM3,TIM4都进行了配置也对各种重映射情况下的IO口配置。
简单方便使用时调用即可。再配置2个按键来改变TIM_SetCompare4(TIM3, i);中的i变量,就可以改变舵机的角度;i变量的取值范围在175-195之间变化对应0-180角度的范围。

TIM_SetCompare4(TIM3, i);//改变i的变量就可以改变舵机角度

STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口
(1)根据STM32F103C8T6型号对TIM2的配置
①没有重映射 可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PA2,CH4 PA3;
②部分重映射1 可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PA2,CH4 PA3;
TIM2的部分重映射1使用到了PA15和PB3所以需要禁用掉JTAG功能,代码里加入

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,
ENABLE);//这条是关闭PB3,PB4,PA15做普通IO

③部分重映射2 可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PB10,CH4 PB11;
④完全重映射 可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PB10,CH4 PB11;
TIM2的完全重映射使用到了PA15和PB3所以需要禁用掉JTAG功能,代码里加入

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,
ENABLE);//这条是关闭PB3,PB4,PA15做普通IO

(2)根据STM32F103C8T6型号对TIM3的配置
①没有重映射 可以配置的IO口有CH1 PA6,CH2 PA7,CH3 PB0,CH4 PB1;
②部分重映射 可以配置的IO口有CH1 PB4,CH2 PB5,CH3 PB0,CH4 PB1;
TIM3的部分重映射使用到了PB4所以需要禁用掉JTAG功能,代码里加入

GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);//单独关闭PB4的JTAG功能

(3)根据STM32F103C8T6型号对TIM4的配置
①TIM4_REMAP = 0 没有重映射 可以配置的IO口有CH1 PB6,CH2 PB7,CH3 PB8,CH4 PB9;

3.程序的介绍
SG90.H中的代码

#ifndef __SG90_H
#define __SG90_H	 
#include "sys.h"
//这里使用到的是stm32f103c8t6  有些io口配置不到
//这里只配置了普通定时器 TIM2 TIM3 TIM4


//SG90舵机驱动 0-180 角度
//通过变量来改变i这个数值就能改变舵机的角度
//这里的i的变量为175-195之中间就是0-180度的角度了
//	TIM_SetCompare1(TIM3, i);
//	TIM_SetCompare2(TIM3, i);	
//	TIM_SetCompare3(TIM3, i);
//	TIM_SetCompare4(TIM3, i);
//  在key.h中有使用到
//  通过两按键实现加和键这个变量,进行角度的变化


//mode 0 1 2 3 有这4中模式
//0 没有重映射   可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PA2,CH4 PA3;
//1 部分重映射1  可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PA2,CH4 PA3;
//2 部分重映射2  可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PB10,CH4 PB11;
//3 完全重映射   可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PB10,CH4 PB11;
void TIM2_PwmSG90_Init(u8 mode);
//mode 0 1 2 有这3中模式模式
//0 没有重映射  可以配置的IO口有CH1 PA6,CH2 PA7,CH3 PB0,CH4 PB1;
//1 部分重映射  可以配置的IO口有CH1 PB4,CH2 PB5,CH3 PB0,CH4 PB1;
//2 完全重映射  在stm32f103c8t6上没有这些pin口所以这里没有配置 可以配置的IO口有CH1 PC6,CH2 PC7,CH3 PC8 ,CH4 PC9;
void TIM3_PwmSG90_Init(u8 mode);

//mode 0 1 有这2中模式模式
//0 TIM4_REMAP = 0 没有重映射  可以配置的IO口有CH1 PB6,CH2 PB7,CH3 PB8,CH4 PB9;
//1 TIM4_REMAP = 1 部分重映射  在stm32f103c8t6上没有这些pin口所以这里没有配置 可以配置的IO口有CH1 PD12,CH2 PD13,CH3 PD14,CH4 PD15;
void TIM4_PwmSG90_Init(u8 mode);





#endif

SG90.c中的代码

#include "SG90.H"
//这里我使用的是stm32f103c8t6



//mode 0 1 2 3 有这4中模式
//0 没有重映射   可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PA2,CH4 PA3;
//1 部分重映射1  可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PA2,CH4 PA3;
//2 部分重映射2  可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PB10,CH4 PB11;
//3 完全重映射   可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PB10,CH4 PB11;
void TIM2_PwmSG90_Init(u8 mode)
{
	GPIO_InitTypeDef PWM_Initstructure;  //定义GPIO端口结构体
	TIM_TimeBaseInitTypeDef TIM_Initstructure;	//定义TIM结构体
	TIM_OCInitTypeDef OC_Initstructure;	//定义输出比较结构体
	
	if(mode==0)
	{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//打开定时器的时钟
  		
	//这里设置的是没有重映射的设置所以可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PA2,CH4 PA3;			
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &PWM_Initstructure);		
	}
	
	
	if(mode==1)
	{	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//打开定时器的时钟
  
	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);//设置端口重映射:
	//这里设置的是部分重映射1 可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PA2,CH4 PA3;
	
//  //	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);; //使用PA15,PB3所需要关掉的下载口需要禁用JTAG才能使用 这条是关闭5个IO口
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//这条是关闭PB3,PB4,PA15做普通IO
   
  //GPIO_Remap_SWJ_Disable 关闭所有跟JTAG有关的引脚
	
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_2|GPIO_Pin_3;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &PWM_Initstructure);
		
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_3;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &PWM_Initstructure);
		
	}
	if(mode==2)
	{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//打开定时器的时钟
  
	GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE);//设置端口重映射:
	//这里设置的是部分重映射2 可以配置的IO口有CH1 PA0,CH2 PA1,CH3 PB10,CH4 PB11;
	
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &PWM_Initstructure);
		
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &PWM_Initstructure);	
	}
	if(mode==3)
	{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//打开定时器的时钟
  
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);//设置端口重映射:
	//这里设置的是部分重映射2 可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PB10,CH4 PB11
	
//  //	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);; //使用PA15,PB3所需要关掉的下载口需要禁用JTAG才能使用 这条是关闭5个IO口
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//这条是关闭PB3,PB4,PA15做普通IO
   
  //GPIO_Remap_SWJ_Disable 关闭所有跟JTAG有关的引脚
	
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_15;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &PWM_Initstructure);
		
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_10|GPIO_Pin_11;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &PWM_Initstructure);		
	}	
	

//下面的配置都一样
	
	TIM_Initstructure.TIM_ClockDivision = TIM_CKD_DIV1;   //不分频
	TIM_Initstructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
	TIM_Initstructure.TIM_Period = 200-1;
	TIM_Initstructure.TIM_Prescaler = 7200-1;
	TIM_TimeBaseInit(TIM2, &TIM_Initstructure);
	TIM_Cmd(TIM2, ENABLE);	//使能时钟

	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC1Init(TIM2, &OC_Initstructure);		//输出比较初始化
	TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。
	
	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC2Init(TIM2, &OC_Initstructure);		//输出比较初始化
	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。

	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC3Init(TIM2, &OC_Initstructure);		//输出比较初始化
	TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。
	
	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC4Init(TIM2, &OC_Initstructure);		//输出比较初始化
	TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。
}



//mode 0 1 2 有这3中模式
//0 没有重映射  可以配置的IO口有CH1 PA6,CH2 PA7,CH3 PB0,CH4 PB1;
//1 部分重映射  可以配置的IO口有CH1 PB4,CH2 PB5,CH3 PB0,CH4 PB1;
//2 完全重映射  在stm32f103c8t6上没有这些pin口所以这里没有配置 可以配置的IO口有CH1 PC6,CH2 PC7,CH3 PC8 ,CH4 PC9;
void TIM3_PwmSG90_Init(u8 mode)
{
	GPIO_InitTypeDef PWM_Initstructure;  //定义GPIO端口结构体
	TIM_TimeBaseInitTypeDef TIM_Initstructure;	//定义TIM结构体
	TIM_OCInitTypeDef OC_Initstructure;	//定义输出比较结构体
	
	if(mode==0)
	{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//打开定时器的时钟
  
	//这里设置的是没有重映射的设置所以可以配置的IO口有CH1 PA6,CH2 PA7,CH3 PB0,CH4 PB1;			
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &PWM_Initstructure);		
		
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &PWM_Initstructure);
	}
	
	if(mode==1)
	{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//打开定时器的时钟
  
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//设置端口重映射:
	//这里设置的是部分重映射可以配置的IO口有CH1 PB4,CH2 PB5,CH3 PB0 ,CH4 PB1; 
	
 	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//使用PB4所需要关掉的下载口需要禁用JTAG才能使用
	//GPIO_Remap_SWJ_Disable 关闭所有跟JTAG有关的引脚
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);//单独关闭PB4的JTAG功能 
	
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &PWM_Initstructure);
  }
	
//下面的配置都一样
	TIM_Initstructure.TIM_ClockDivision = TIM_CKD_DIV1;   //不分频
	TIM_Initstructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
	TIM_Initstructure.TIM_Period = 200-1;
	TIM_Initstructure.TIM_Prescaler = 7200-1;
	TIM_TimeBaseInit(TIM3, &TIM_Initstructure);
	TIM_Cmd(TIM3, ENABLE);	//使能时钟

	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC1Init(TIM3, &OC_Initstructure);		//输出比较初始化
	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。
	
	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC2Init(TIM3, &OC_Initstructure);		//输出比较初始化
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。

	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC3Init(TIM3, &OC_Initstructure);		//输出比较初始化
	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。
	
	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC4Init(TIM3, &OC_Initstructure);		//输出比较初始化
	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。
}




//mode 0 1 有这2中模式
//0 TIM4_REMAP = 0 没有重映射  可以配置的IO口有CH1 PB6,CH2 PB7,CH3 PB8,CH4 PB9;
//1 TIM4_REMAP = 1 部分重映射  在stm32f103c8t6上没有这些pin口所以这里没有配置 可以配置的IO口有CH1 PD12,CH2 PD13,CH3 PD14,CH4 PD15;
void TIM4_PwmSG90_Init(u8 mode)
{
	GPIO_InitTypeDef PWM_Initstructure;  //定义GPIO端口结构体
	TIM_TimeBaseInitTypeDef TIM_Initstructure;	//定义TIM结构体
	TIM_OCInitTypeDef OC_Initstructure;	//定义输出比较结构体
	
	if(mode==0)
	{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); //打开端口和复用时钟	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);	//打开定时器的时钟
  		
	//这里设置的是没有重映射的设置所以可以配置的IO口有CH1 PB6,CH2 PB7,CH3 PB8,CH4 PB9;			
	PWM_Initstructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
	PWM_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
	PWM_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &PWM_Initstructure);		
		
	}

//下面的配置都一样
	TIM_Initstructure.TIM_ClockDivision = TIM_CKD_DIV1;   //不分频
	TIM_Initstructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
	TIM_Initstructure.TIM_Period = 200-1;
	TIM_Initstructure.TIM_Prescaler = 7200-1;
	TIM_TimeBaseInit(TIM4, &TIM_Initstructure);
	TIM_Cmd(TIM4, ENABLE);	//使能时钟

	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC1Init(TIM4, &OC_Initstructure);		//输出比较初始化
	TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。
	
	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC2Init(TIM4, &OC_Initstructure);		//输出比较初始化
	TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。

	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC3Init(TIM4, &OC_Initstructure);		//输出比较初始化
	TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。
	
	OC_Initstructure.TIM_OCMode = TIM_OCMode_PWM1;	//采用PWM1模式
	OC_Initstructure.TIM_OutputState = TIM_OutputState_Enable;  //配置输出使能OR使能
	OC_Initstructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性
	TIM_OC4Init(TIM4, &OC_Initstructure);		//输出比较初始化
	TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);		//启用CCR2上的TIM3外围预加载寄存器。
}

key.h中的代码

#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"
  	 
#define KEY0 PAin(0) 
#define KEY1 PAin(7)	
void KEY_Init(void);//IO初始
u8 KEY_OUT(void);
void TIM3_PWMSG90_RUN(void);
void TIM4_PWMSG90_RUN(void);
void TIM2_PWMSG90_RUN(void);


#endif

key.c中的代码

#include "stm32f10x.h"
#include "key.h"
#include "sys.h" 
#include "delay.h"
  

u8 KEY_jia_jian=195;

//按键初始化函数
void KEY_Init(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA,PORTE时钟

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_7;//KEY0-KEY2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOE2,3,4

}



//返回KEY_jia_jian按键加减数据

u8 KEY_OUT(void)//
{
	if(KEY0==0)
	{
		if(KEY_jia_jian<196)
		{
		KEY_jia_jian++;
			return KEY_jia_jian;
		}
		if(KEY_jia_jian==196)
		{
			KEY_jia_jian=175;
			return KEY_jia_jian;
		}
	}
	if(KEY1==0)
	{
		if(KEY_jia_jian==174)
		{
			KEY_jia_jian=195;
			return KEY_jia_jian;
		}
		if(KEY_jia_jian>174)
		{
		  KEY_jia_jian--;
			return KEY_jia_jian;
		}
	}
  return KEY_jia_jian;
}



void TIM3_PWMSG90_RUN(void)
{
	u8 i;
	i=KEY_OUT();//设置一个变量来带提他
	TIM_SetCompare1(TIM3, i);
	TIM_SetCompare2(TIM3, i);	
	TIM_SetCompare3(TIM3, i);
	TIM_SetCompare4(TIM3, i);
		
}

void TIM4_PWMSG90_RUN(void)
{
	u8 i;
	i=KEY_OUT();//设置一个变量来带提他
	TIM_SetCompare1(TIM4, i);
	TIM_SetCompare2(TIM4, i);	
	TIM_SetCompare3(TIM4, i);
	TIM_SetCompare4(TIM4, i);
		
}

void TIM2_PWMSG90_RUN(void)
{
	u8 i;
	i=KEY_OUT();//设置一个变量来带提他
	TIM_SetCompare1(TIM2, i);
	TIM_SetCompare2(TIM2, i);	
	TIM_SetCompare3(TIM2, i);
	TIM_SetCompare4(TIM2, i);
		
}

mian.c中的代码

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "SG90.H"
#include "key.h" 






 int main(void)
 {	
	 delay_init();	    //延时函数初始化	  
	 TIM3_PwmSG90_Init(1);//pwm函数初始化	  
	 //TIM4_PwmSG90_Init(0);
	 //TIM2_PwmSG90_Init(1);
	 KEY_Init();//按键初始化
	while(1)
	{		
		   TIM3_PWMSG90_RUN();
		  // TIM3_PWMSG90_RUN();
		   //TIM2_PWMSG90_RUN();
			 delay_ms(500);


	}
 }

以后就是全部的代码了

源码下载地址文章来源地址https://www.toymoban.com/news/detail-416935.html

到了这里,关于STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32F103C8T6继电器驱动篇

    由于设计的东西是一个电机,但是stm32端口输出电流太小,所以采用继电器控制,通过实际接线测试发现,单片机的IO口驱动不了继电器,当继电器接到IO口上时,端口电压会将至2.2V左右,更加驱动不了继电器了。 所以,为了可以驱动继电器,重新设计了电路,通过三极管来

    2024年02月12日
    浏览(26)
  • STM32F103C8T6 驱动 oled 4针篇

    大部分买的STM32F103C8T6属于国产的,会导致程序烧录报错,如果出现问题参考另一篇STM32F103C8T6程序烧录方法_流浪法师解剖鱼的博客-CSDN博客 环境配置好后,编写程序烧录就可以了。 测试了增加上拉电阻不行。测试了厂家给的程序还是不行。查看器件参数,写的3.3-6V供电,当时

    2024年02月07日
    浏览(17)
  • STM32F103C8T6驱动LCD1602液晶篇

    1 电路连接 LCD1602有5V供电和3.3V供电,此次采用3.3V供电。 LCD1602共有16个引脚,不做一一介绍,其中主要的是第3引脚,3.3V背光电源供电时,接100-1K电阻,5V供电时,接2k-4.7k电阻。其余正常连接就行。 2 遇到的问题 2.1 液晶不显示 仿真验证时可以显示的,但是实物连接后还是不

    2024年02月07日
    浏览(22)
  • STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    串口屏是一个集成了单片机的屏幕模块,采用的是TTL串口协议,可以直接通过对应指令控制屏幕, 本文采用的串口屏是陶晶驰T0系列的基本型,目的是通过单片机的串口来控制串口屏 上面仅是一部分常用的基础指令,更多更仔细的指令或者函数可以访问陶晶驰资料官网。 硬

    2024年02月13日
    浏览(16)
  • 学习记录之STM32F103C8T6最小系统板驱动MPU6050串口打印数据

    1.使用到的工具介绍 2.MPU6050和整体和简单介绍 3.程序的介绍 1.使用到的工具介绍 硬件方面:STM32F103C8T6最小系统板核心板,MPU6050模块三维角度传感器,经典的CH340烧写和串口作用,和若干个杜邦线。 软件方面:keil5编写程序软件,烧写软件FlyMcu.exe烧写工具,sscom.exe串口调试工

    2023年04月09日
    浏览(24)
  • Qt实现安卓手机蓝牙通信并控制stm32f103c8t6驱动VFD屏

    Qt具有跨平台的特性所以非常适合写通信的demo,但是在这个例程中Qt蓝牙部分不支持Windows平台,安卓平台使用没问题。 Qt蓝牙主要涉及到三个类的使用: QBluetoothDeviceDiscoveryAgent //扫描周围蓝牙设备 QBluetoothLocalDevice //扫描本地蓝牙 QBluetoothSocket //建立蓝牙的socket读写 安卓不支

    2024年02月08日
    浏览(24)
  • STM32 F103C8T6学习笔记5:定时器输出不同占空比PWM驱动舵机旋转角度

    现在学习使用STM32 F103C8T6的定时器PWM模式,使用PWM驱动舵机转动不同角度,文章提供源码,测试工程,测试动态效果图。 目录 基础原理:  实验目标: 测试视频结果: 测试工程下载: 这次依旧拿出之前学习过的舵机DS3115,它的基础原理不多加介绍,在往期讲MSP432的文章有所

    2024年02月13日
    浏览(20)
  • 直流减速编码电机的使用(STM32f103c8t6)L298N电机驱动模块

    直接减速电机就是在直流电机上加上霍尔编码器,霍尔编码器可用于电机转动的测速,A、B相会产生相位相差90°的方波信号。stm32可以使用硬件资源或者软件模拟来捕获编码器信号。这里我介绍的是stm32自带的编码器模式来使用直流减速电机。 以下是直流减速电机的商品图 ​

    2024年02月13日
    浏览(33)
  • 功耗测评 | STM32F103C8T6

    STM32F103C8T6 MCU越来越广泛的应用在生产生活的各个领域,外接丰富的传感器、功能模块、通信模块、显示存储等可以形成各种可样的产品项目应用。对于功耗要求比较高的产品,一般会选择STM32L系列的MCU,但是从功耗的评测角度,逻辑上是基本相似的。 在很多应用场合中都对

    2024年02月07日
    浏览(18)
  • STM32F103C8T6串口通信

      首先来看一下需要操作的函数,以及配置的步骤: 图1                                                  图2   Code: usart.c #include \\\"usart.h\\\" void ustart_Init(void ) { GPIO_InitTypeDef GPIO_Init_Ustar ; // 定义输出端口TX的结构体对象 USART_InitTypeDef USTART_Init; // 定义串口初始化结构体对象

    2024年02月16日
    浏览(23)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包