国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32F103C8T6驅(qū)動舵機SG90 配置定時器TIM2,TIM3,TIM4的多種重映射模式下的不同IO口

這篇具有很好參考價值的文章主要介紹了STM32F103C8T6驅(qū)動舵機SG90 配置定時器TIM2,TIM3,TIM4的多種重映射模式下的不同IO口。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

STM32F103C8T6驅(qū)動舵機SG90 配置定時器TIM2,TIM3,TIM4的多種重映射模式下的不同IO口

1.使用到的工具介紹
2.整個簡單介紹
3.程序的介紹
1.使用到的工具介紹:
keil5,燒寫軟件FlyMcu.exe,硬件為STM32F103C8T6板,SG90舵機還有按鍵。

2.整個簡單介紹:
通過對舵機的了解我這里使用的是sg90舵機可旋轉(zhuǎn)180度,使用的芯片是stm32f103c8t6。在配置2個按鍵來進行舵機角度加減,通過加減來改變舵機的角度變化;

STM32F103C8T6驅(qū)動舵機SG90 配置定時器TIM2,TIM3,TIM4的多種重映射模式下的不同IO口

SG90舵機紅線 VCC線(接5v)
SG90舵機棕線 GND線
SG90舵機黃線 控制信號線

STM32F103C8T6驅(qū)動舵機SG90 配置定時器TIM2,TIM3,TIM4的多種重映射模式下的不同IO口

需要通過PWM來配置出各種角度的占空比,STM32F103的PWM可配置的IO口如下圖,對TIM2,TIM3,TIM4都進行了配置也對各種重映射情況下的IO口配置。
簡單方便使用時調(diào)用即可。再配置2個按鍵來改變TIM_SetCompare4(TIM3, i);中的i變量,就可以改變舵機的角度;i變量的取值范圍在175-195之間變化對應(yīng)0-180角度的范圍。

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

STM32F103C8T6驅(qū)動舵機SG90 配置定時器TIM2,TIM3,TIM4的多種重映射模式下的不同IO口
(1)根據(jù)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);//這條是關(guān)閉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);//這條是關(guān)閉PB3,PB4,PA15做普通IO

(2)根據(jù)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);//單獨關(guān)閉PB4的JTAG功能

(3)根據(jù)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舵機驅(qū)動 0-180 角度
//通過變量來改變i這個數(shù)值就能改變舵機的角度
//這里的i的變量為175-195之中間就是0-180度的角度了
//	TIM_SetCompare1(TIM3, i);
//	TIM_SetCompare2(TIM3, i);	
//	TIM_SetCompare3(TIM3, i);
//	TIM_SetCompare4(TIM3, i);
//  在key.h中有使用到
//  通過兩按鍵實現(xiàn)加和鍵這個變量,進行角度的變化


//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端口結(jié)構(gòu)體
	TIM_TimeBaseInitTypeDef TIM_Initstructure;	//定義TIM結(jié)構(gòu)體
	TIM_OCInitTypeDef OC_Initstructure;	//定義輸出比較結(jié)構(gòu)體
	
	if(mode==0)
	{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //打開端口和復(fù)用時鐘	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//打開定時器的時鐘
  		
	//這里設(shè)置的是沒有重映射的設(shè)置所以可以配置的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); //打開端口和復(fù)用時鐘	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//打開定時器的時鐘
  
	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);//設(shè)置端口重映射:
	//這里設(shè)置的是部分重映射1 可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PA2,CH4 PA3;
	
//  //	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);; //使用PA15,PB3所需要關(guān)掉的下載口需要禁用JTAG才能使用 這條是關(guān)閉5個IO口
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//這條是關(guān)閉PB3,PB4,PA15做普通IO
   
  //GPIO_Remap_SWJ_Disable 關(guān)閉所有跟JTAG有關(guān)的引腳
	
	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); //打開端口和復(fù)用時鐘	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//打開定時器的時鐘
  
	GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE);//設(shè)置端口重映射:
	//這里設(shè)置的是部分重映射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); //打開端口和復(fù)用時鐘	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//打開定時器的時鐘
  
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);//設(shè)置端口重映射:
	//這里設(shè)置的是部分重映射2 可以配置的IO口有CH1 PA15,CH2 PB3,CH3 PB10,CH4 PB11
	
//  //	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);; //使用PA15,PB3所需要關(guān)掉的下載口需要禁用JTAG才能使用 這條是關(guān)閉5個IO口
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//這條是關(guān)閉PB3,PB4,PA15做普通IO
   
  //GPIO_Remap_SWJ_Disable 關(guān)閉所有跟JTAG有關(guān)的引腳
	
	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;  //向上計數(shù)
	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外圍預(yù)加載寄存器。
	
	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外圍預(yù)加載寄存器。

	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外圍預(yù)加載寄存器。
	
	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外圍預(yù)加載寄存器。
}



//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端口結(jié)構(gòu)體
	TIM_TimeBaseInitTypeDef TIM_Initstructure;	//定義TIM結(jié)構(gòu)體
	TIM_OCInitTypeDef OC_Initstructure;	//定義輸出比較結(jié)構(gòu)體
	
	if(mode==0)
	{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //打開端口和復(fù)用時鐘	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//打開定時器的時鐘
  
	//這里設(shè)置的是沒有重映射的設(shè)置所以可以配置的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); //打開端口和復(fù)用時鐘	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	//打開定時器的時鐘
  
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);//設(shè)置端口重映射:
	//這里設(shè)置的是部分重映射可以配置的IO口有CH1 PB4,CH2 PB5,CH3 PB0 ,CH4 PB1; 
	
 	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);//使用PB4所需要關(guān)掉的下載口需要禁用JTAG才能使用
	//GPIO_Remap_SWJ_Disable 關(guān)閉所有跟JTAG有關(guān)的引腳
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);//單獨關(guān)閉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;  //向上計數(shù)
	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外圍預(yù)加載寄存器。
	
	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外圍預(yù)加載寄存器。

	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外圍預(yù)加載寄存器。
	
	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外圍預(yù)加載寄存器。
}




//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端口結(jié)構(gòu)體
	TIM_TimeBaseInitTypeDef TIM_Initstructure;	//定義TIM結(jié)構(gòu)體
	TIM_OCInitTypeDef OC_Initstructure;	//定義輸出比較結(jié)構(gòu)體
	
	if(mode==0)
	{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); //打開端口和復(fù)用時鐘	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);	//打開定時器的時鐘
  		
	//這里設(shè)置的是沒有重映射的設(shè)置所以可以配置的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;  //向上計數(shù)
	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外圍預(yù)加載寄存器。
	
	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外圍預(yù)加載寄存器。

	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外圍預(yù)加載寄存器。
	
	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外圍預(yù)加載寄存器。
}

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;

//按鍵初始化函數(shù)
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; //設(shè)置成上拉輸入
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOE2,3,4

}



//返回KEY_jia_jian按鍵加減數(shù)據(jù)

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();//設(shè)置一個變量來帶提他
	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();//設(shè)置一個變量來帶提他
	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();//設(shè)置一個變量來帶提他
	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();	    //延時函數(shù)初始化	  
	 TIM3_PwmSG90_Init(1);//pwm函數(shù)初始化	  
	 //TIM4_PwmSG90_Init(0);
	 //TIM2_PwmSG90_Init(1);
	 KEY_Init();//按鍵初始化
	while(1)
	{		
		   TIM3_PWMSG90_RUN();
		  // TIM3_PWMSG90_RUN();
		   //TIM2_PWMSG90_RUN();
			 delay_ms(500);


	}
 }

以后就是全部的代碼了

源碼下載地址文章來源地址http://www.zghlxwxcb.cn/news/detail-416935.html

到了這里,關(guān)于STM32F103C8T6驅(qū)動舵機SG90 配置定時器TIM2,TIM3,TIM4的多種重映射模式下的不同IO口的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • STM32F103C8T6繼電器驅(qū)動篇

    STM32F103C8T6繼電器驅(qū)動篇

    由于設(shè)計的東西是一個電機,但是stm32端口輸出電流太小,所以采用繼電器控制,通過實際接線測試發(fā)現(xiàn),單片機的IO口驅(qū)動不了繼電器,當(dāng)繼電器接到IO口上時,端口電壓會將至2.2V左右,更加驅(qū)動不了繼電器了。 所以,為了可以驅(qū)動繼電器,重新設(shè)計了電路,通過三極管來

    2024年02月12日
    瀏覽(41)
  • STM32F103C8T6 驅(qū)動 oled 4針篇

    大部分買的STM32F103C8T6屬于國產(chǎn)的,會導(dǎo)致程序燒錄報錯,如果出現(xiàn)問題參考另一篇STM32F103C8T6程序燒錄方法_流浪法師解剖魚的博客-CSDN博客 環(huán)境配置好后,編寫程序燒錄就可以了。 測試了增加上拉電阻不行。測試了廠家給的程序還是不行。查看器件參數(shù),寫的3.3-6V供電,當(dāng)時

    2024年02月07日
    瀏覽(20)
  • STM32F103C8T6驅(qū)動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日
    瀏覽(26)
  • STM32驅(qū)動串口屏,STM32F103C8T6串口發(fā)送指令控制HMI串口屏

    STM32驅(qū)動串口屏,STM32F103C8T6串口發(fā)送指令控制HMI串口屏

    串口屏是一個集成了單片機的屏幕模塊,采用的是TTL串口協(xié)議,可以直接通過對應(yīng)指令控制屏幕, 本文采用的串口屏是陶晶馳T0系列的基本型,目的是通過單片機的串口來控制串口屏 上面僅是一部分常用的基礎(chǔ)指令,更多更仔細的指令或者函數(shù)可以訪問陶晶馳資料官網(wǎng)。 硬

    2024年02月13日
    瀏覽(29)
  • Qt實現(xiàn)安卓手機藍牙通信并控制stm32f103c8t6驅(qū)動VFD屏

    Qt實現(xiàn)安卓手機藍牙通信并控制stm32f103c8t6驅(qū)動VFD屏

    Qt具有跨平臺的特性所以非常適合寫通信的demo,但是在這個例程中Qt藍牙部分不支持Windows平臺,安卓平臺使用沒問題。 Qt藍牙主要涉及到三個類的使用: QBluetoothDeviceDiscoveryAgent //掃描周圍藍牙設(shè)備 QBluetoothLocalDevice //掃描本地藍牙 QBluetoothSocket //建立藍牙的socket讀寫 安卓不支

    2024年02月08日
    瀏覽(28)
  • 學(xué)習(xí)記錄之STM32F103C8T6最小系統(tǒng)板驅(qū)動MPU6050串口打印數(shù)據(jù)

    學(xué)習(xí)記錄之STM32F103C8T6最小系統(tǒng)板驅(qū)動MPU6050串口打印數(shù)據(jù)

    1.使用到的工具介紹 2.MPU6050和整體和簡單介紹 3.程序的介紹 1.使用到的工具介紹 硬件方面:STM32F103C8T6最小系統(tǒng)板核心板,MPU6050模塊三維角度傳感器,經(jīng)典的CH340燒寫和串口作用,和若干個杜邦線。 軟件方面:keil5編寫程序軟件,燒寫軟件FlyMcu.exe燒寫工具,sscom.exe串口調(diào)試工

    2023年04月09日
    瀏覽(22)
  • STM32 F103C8T6學(xué)習(xí)筆記5:定時器輸出不同占空比PWM驅(qū)動舵機旋轉(zhuǎn)角度

    現(xiàn)在學(xué)習(xí)使用STM32 F103C8T6的定時器PWM模式,使用PWM驅(qū)動舵機轉(zhuǎn)動不同角度,文章提供源碼,測試工程,測試動態(tài)效果圖。 目錄 基礎(chǔ)原理: ?實驗?zāi)繕?biāo): 測試視頻結(jié)果: 測試工程下載: 這次依舊拿出之前學(xué)習(xí)過的舵機DS3115,它的基礎(chǔ)原理不多加介紹,在往期講MSP432的文章有所

    2024年02月13日
    瀏覽(25)
  • 直流減速編碼電機的使用(STM32f103c8t6)L298N電機驅(qū)動模塊

    直流減速編碼電機的使用(STM32f103c8t6)L298N電機驅(qū)動模塊

    直接減速電機就是在直流電機上加上霍爾編碼器,霍爾編碼器可用于電機轉(zhuǎn)動的測速,A、B相會產(chǎn)生相位相差90°的方波信號。stm32可以使用硬件資源或者軟件模擬來捕獲編碼器信號。這里我介紹的是stm32自帶的編碼器模式來使用直流減速電機。 以下是直流減速電機的商品圖 ?

    2024年02月13日
    瀏覽(57)
  • 功耗測評 | STM32F103C8T6

    功耗測評 | STM32F103C8T6

    STM32F103C8T6 MCU越來越廣泛的應(yīng)用在生產(chǎn)生活的各個領(lǐng)域,外接豐富的傳感器、功能模塊、通信模塊、顯示存儲等可以形成各種可樣的產(chǎn)品項目應(yīng)用。對于功耗要求比較高的產(chǎn)品,一般會選擇STM32L系列的MCU,但是從功耗的評測角度,邏輯上是基本相似的。 在很多應(yīng)用場合中都對

    2024年02月07日
    瀏覽(31)
  • STM32F103C8T6系統(tǒng)板

    STM32F103C8T6系統(tǒng)板

    1.電源部分 2.復(fù)位 3.晶振 4. 電源電路——防反接 有關(guān)二極管 漫談二極管防電源反接電路 本次采用上圖右下角的NMOS防反接電路。 電源電路——電源芯片 AMS1117是AMS公司的 ,LM1117是NS(美國國家半導(dǎo)體)的,LM1117要貴很多,所以一般的用AMS1117就可以了。 (以下分析參考STM32F10

    2024年02月02日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包