stm32f407控制舵机sg90代码
时间: 2023-10-05 22:11:15 浏览: 184
嵌入式初学者STM32控制SG90舵机相关代码
5星 · 资源好评率100%
以下是一个基本的STM32F407控制舵机SG90的代码示例:
```
#include "stm32f4xx.h"
#define PULSE_MIN 1000 //最小脉冲宽度
#define PULSE_MAX 2000 //最大脉冲宽度
#define PULSE_RANGE (PULSE_MAX - PULSE_MIN)
#define PWM_PERIOD 20000 //PWM周期
#define SERVO_PIN GPIO_Pin_12
#define SERVO_GPIO GPIOB
#define SERVO_TIM TIM1
void TIM_Config(void);
void GPIO_Config(void);
void delay_ms(uint32_t ms);
int main(void)
{
TIM_Config();
GPIO_Config();
while(1)
{
//设置脉冲宽度为最小值
SERVO_TIM->CCR1 = PULSE_MIN;
delay_ms(1000);
//设置脉冲宽度为最大值
SERVO_TIM->CCR1 = PULSE_MAX;
delay_ms(1000);
}
}
void TIM_Config(void)
{
TIM_TimeBaseInitTypeDef timerInitStructure;
TIM_OCInitTypeDef outputChannelInit;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
timerInitStructure.TIM_Prescaler = 168 - 1; //时钟预分频
timerInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
timerInitStructure.TIM_Period = PWM_PERIOD - 1; //PWM周期
timerInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
timerInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(SERVO_TIM, &timerInitStructure);
outputChannelInit.TIM_OCMode = TIM_OCMode_PWM1;
outputChannelInit.TIM_OutputState = TIM_OutputState_Enable;
outputChannelInit.TIM_Pulse = PULSE_MIN; //初始脉冲宽度为最小值
outputChannelInit.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(SERVO_TIM, &outputChannelInit);
TIM_OC1PreloadConfig(SERVO_TIM, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(SERVO_TIM, ENABLE);
TIM_Cmd(SERVO_TIM, ENABLE);
}
void GPIO_Config(void)
{
GPIO_InitTypeDef gpioInitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
gpioInitStructure.GPIO_Pin = SERVO_PIN;
gpioInitStructure.GPIO_Mode = GPIO_Mode_AF;
gpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz;
gpioInitStructure.GPIO_OType = GPIO_OType_PP;
gpioInitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(SERVO_GPIO, &gpioInitStructure);
GPIO_PinAFConfig(SERVO_GPIO, GPIO_PinSource12, GPIO_AF_TIM1);
}
void delay_ms(uint32_t ms)
{
ms *= (SystemCoreClock / 1000 / 3);
while(ms--)
__NOP();
}
```
该代码使用了Timer 1和GPIOB的引脚12来控制SG90舵机。在主循环中,它将脉冲宽度设置为最小值和最大值,然后使用delay_ms函数来等待1秒钟。此后,将再次进行相同的操作。
在TIM_Config函数中,首先打开TIM1和GPIOB的时钟,并为TIM1配置了PWM模式。此外,还将脉冲宽度初始化为最小值。在GPIO_Config函数中,将GPIOB的引脚12配置为TIM1的PWM输出。
最后,使用delay_ms函数来实现延迟功能。注意,该函数的延迟时间取决于系统时钟频率的三分之一。由于STM32F407的系统时钟频率为168MHz,因此将其除以1000和3,以将延迟时间转换为毫秒。
阅读全文