STM32F103C8T6驅(qū)動舵機SG90 配置定時器TIM2,TIM3,TIM4的多種重映射模式下的不同IO口
1.使用到的工具介紹
2.整個簡單介紹
3.程序的介紹
1.使用到的工具介紹:
keil5,燒寫軟件FlyMcu.exe,硬件為STM32F103C8T6板,SG90舵機還有按鍵。
2.整個簡單介紹:
通過對舵機的了解我這里使用的是sg90舵機可旋轉(zhuǎn)180度,使用的芯片是stm32f103c8t6。在配置2個按鍵來進行舵機角度加減,通過加減來改變舵機的角度變化;
SG90舵機紅線 | VCC線(接5v) |
---|---|
SG90舵機棕線 | GND線 |
SG90舵機黃線 | 控制信號線 |
需要通過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的變量就可以改變舵機角度
(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
源碼下載地址文章來源地址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)!