源代码
motor.c
#include "motor.h"
#include "stm32f10x.h"
void Motor_Init(void)
{
//TIM3 PWM输出 驱动SG90电机 配置步骤:
//1.GPIO结构体
//2.配置通用定时器结构体
//3.配置定时去输出PWN结构体
//4.打开时钟->GPIO时钟,TIM定时器时钟,部分重映射时钟
//5.配置PWN比较值
GPIO_InitTypeDef GpioMotor_Init;
TIM_TimeBaseInitTypeDef TimMotor_Init;
TIM_OCInitTypeDef TimMotot_OCInit;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
GpioMotor_Init.GPIO_Mode = GPIO_Mode_AF_PP;
GpioMotor_Init.GPIO_Pin = GPIO_Pin_5;
GpioMotor_Init.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GpioMotor_Init);
TimMotor_Init.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分割
TimMotor_Init.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
TimMotor_Init.TIM_Prescaler = 7200-1;//TIMX时钟频率预分频值
TimMotor_Init.TIM_Period = 200-1;//设置在一个更新事件装入活动的自动重装载值
TIM_TimeBaseInit(TIM3, &TimMotor_Init);
TimMotot_OCInit.TIM_OCMode = TIM_OCMode_PWM1;//配置pwm波为模式一或模式二
TimMotot_OCInit.TIM_OutputState = TIM_OutputState_Enable;//配置使能或失能
TimMotot_OCInit.TIM_OCPolarity = TIM_OCPolarity_Low;//比较输出极性
TIM_OC2Init(TIM3,&TimMotot_OCInit);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_Cmd(TIM3,ENABLE);
}
motot.h
#include "stm32f10x.h"
void Motor_Init(void);
main.c
#include "stm32f10x.h"
#include "main.h"
#include "motor.h"
void delay(uint16_t time)//延时函数
{
uint16_t i=0;
while(time--)
{
i=12000;
while(i--);
}
}
int main(()
{
uint16_t pwmval =155;
Motor_Init();
while(1)
{
for(pwmval=195;pwmval>=175;pwmval-=5)
{
TIM_SetCompare2(TIM3,pwmval);
delay(500);
}
}
}
main.h
#include "stm32f10x.h"
void delay(uint16_t time);
实现效果
舵机旋转从195°每秒旋转5°,直到175°,重新回到195°
![](https://i-blog.csdnimg.cn/blog_migrate/a7d6a1222b156226028726a831707ae7.gif)