stm32 控制360舵机每次旋转90度 程序
时间: 2023-07-29 09:06:30 浏览: 139
实现该功能的主要步骤如下:
1. 配置 TIM 定时器,用于产生 PWM 波形控制舵机旋转角度。
2. 配置 GPIO,用于控制舵机的方向。
3. 编写控制舵机旋转的函数。
下面是具体的代码实现:
```c
#include "stm32f10x.h"
#define SERVO_PIN GPIO_Pin_0
#define SERVO_PORT GPIOA
#define SERVO_TIM TIM2
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 20000 - 1; // PWM 20ms
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 72MHz / 72 = 1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(SERVO_TIM, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1500; // 1.5ms
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(SERVO_TIM, &TIM_OCInitStructure);
TIM_Cmd(SERVO_TIM, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = SERVO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SERVO_PORT, &GPIO_InitStructure);
}
void Servo_SetAngle(int angle)
{
uint16_t val = 1000 + (angle * 1000 / 90);
SERVO_TIM->CCR2 = val;
if (angle < 0) {
GPIO_ResetBits(SERVO_PORT, SERVO_PIN);
} else {
GPIO_SetBits(SERVO_PORT, SERVO_PIN);
}
}
int main(void)
{
TIM2_Configuration();
GPIO_Configuration();
while (1) {
Servo_SetAngle(0); // 0 degree
Delay_ms(1000);
Servo_SetAngle(90); // 90 degree
Delay_ms(1000);
}
}
```
这里使用 TIM2 定时器,产生周期为 20ms 的 PWM 波形,通过控制 CCR2 寄存器的值来改变占空比,从而控制舵机旋转角度。
`Servo_SetAngle()` 函数接收一个参数 `angle`,表示需要旋转的角度,当 `angle` 为 0 时,舵机在中间位置,当 `angle` 为正数时,舵机向右旋转,当 `angle` 为负数时,舵机向左旋转。具体实现中,我们将角度映射到了 1000-2000 的 PWM 值范围内。
在主函数中,我们通过调用 `Servo_SetAngle()` 函数来控制舵机旋转。先将舵机旋转到 0 度位置,延时 1 秒后旋转到 90 度位置,再延时 1 秒,循环执行。
阅读全文