stm32f407控制舵机sg90代码
时间: 2023-10-05 22:11:15 浏览: 59
以下是使用STM32F407控制舵机SG90的基本代码示例:
```
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "misc.h"
#define SERVO_PIN GPIO_Pin_9
#define SERVO_PORT GPIOA
void delay_1ms(void){
volatile uint32_t i;
for(i=0; i<2000; i++);
}
void servo_init(void){
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = SERVO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(SERVO_PORT, &GPIO_InitStruct);
GPIO_PinAFConfig(SERVO_PORT, GPIO_PinSource9, GPIO_AF_TIM1);
}
void servo_set_angle(float angle){
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
uint16_t CCR_Value;
float DutyCycle;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 20000;
//设置为50Hz的PWM输出,即一个周期为20ms
TIM_TimeBaseStructure.TIM_Prescaler = 168-1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
DutyCycle = (angle/180.0) * (2.0-1.0) + 1.0;
//计算占空比
CCR_Value = (uint16_t) (DutyCycle * 20000 / (1/168.0));
//计算CCR值
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR_Value;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_Cmd(TIM1, ENABLE);
}
int main(void){
servo_init();
while(1){
servo_set_angle(0); //0度
delay_1ms();
servo_set_angle(90); //90度
delay_1ms();
servo_set_angle(180); //180度
delay_1ms();
}
}
```
以上代码实现了控制SG90舵机旋转到0度、90度和180度的基本功能,通过调整`servo_set_angle()`函数中的参数可以实现不同角度的旋转。注意,由于SG90舵机的工作电压为5V,因此需要使用外部5V电源给舵机供电,同时要确保STM32F407的IO口输出电压与舵机工作电压相同(即5V)。