STM32 SG90舵机的程序设计
时间: 2023-06-10 10:08:27 浏览: 207
stm32f1hal库sg90舵机的控制
下面是一个简单的 STM32 控制 SG90 舵机的程序设计:
```c
#include "stm32f10x.h"
#define PWM_PERIOD 20000 // PWM 周期,单位为微秒
void delay_us(uint32_t us) {
SysTick->LOAD = us * 9; // 9 表示时钟周期为 72MHz
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);
SysTick->CTRL = 0;
}
void set_pwm_duty(uint16_t duty) {
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = duty;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
}
int main(void) {
uint16_t duty = 1500; // 初始占空比为 1500us
uint16_t min_duty = 1000; // 最小占空比为 1000us
uint16_t max_duty = 2000; // 最大占空比为 2000us
uint16_t step = 10; // 每次改变的步长为 10us
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 时钟分频为 72MHz/72=1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
set_pwm_duty(duty); // 初始化 PWM 占空比
TIM_Cmd(TIM2, ENABLE);
while (1) {
// 向右转
for (duty = 1500; duty < max_duty; duty += step) {
set_pwm_duty(duty);
delay_us(10000); // 延时 10ms
}
// 向左转
for (duty = max_duty; duty > min_duty; duty -= step) {
set_pwm_duty(duty);
delay_us(10000); // 延时 10ms
}
}
}
```
该程序使用了 STM32 的 TIM2 定时器和 GPIOA 的 PA0 引脚来控制 SG90 舵机。首先,需要定义 PWM 的周期为 20ms(即 20000us),并实现一个延时函数 `delay_us()`,用于控制舵机转动的速度。然后,设置最大占空比和最小占空比为 2000us 和 1000us,步长为 10us。在 `main()` 函数中,分别向右转和向左转,每次转动步长为 10us,延时 10ms。
阅读全文