赞
踩
1.使用到的工具介绍
2.整个简单介绍
3.程序的介绍
1.使用到的工具介绍:
keil5,烧写软件FlyMcu.exe,硬件为STM32F103C8T6板,SG90舵机还有按键。
2.整个简单介绍:
通过对舵机的了解我这里使用的是sg90舵机可旋转180度,使用的芯片是stm32f103c8t6。在配置2个按键来进行舵机角度加减,通过加减来改变舵机的角度变化;
SG90舵机红线 | VCC线(接5v) |
---|---|
SG90舵机棕线 | GND线 |
SG90舵机黄线 | 控制信号线 |
需要通过PWM来配置出各种角度的占空比,STM32F103的PWM可配置的IO口如下图,对TIM2,TIM3,TIM4都进行了配置也对各种重映射情况下的IO口配置。
简单方便使用时调用即可。再配置2个按键来改变TIM_SetCompare4(TIM3, i);中的i变量,就可以改变舵机的角度;i变量的取值范围在175-195之间变化对应0-180角度的范围。
TIM_SetCompare4(TIM3, i);//改变i的变量就可以改变舵机角度
(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); } }
以后就是全部的代码了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。