写一段控在stm32制舵机旋转90度后,旋转负90度的代码
时间: 2023-03-30 07:02:33 浏览: 103
以下是控制 STM32 制动机旋转 90 度后,再旋转负 90 度的代码:
```c
#include "stm32f4xx.h"
#define PWM_PERIOD 20000 // PWM 周期为 20ms
#define PWM_MIN 100 // PWM 最小值为 1ms
#define PWM_MAX 200 // PWM 最大值为 2ms
void delay_ms(uint32_t ms) {
uint32_t i, j;
for (i = ; i < ms; i++) {
for (j = ; j < 200; j++);
}
}
void servo_set_angle(uint16_t angle) {
uint16_t pwm_value = PWM_MIN + (angle * (PWM_MAX - PWM_MIN) / 180);
TIM4->CCR1 = pwm_value;
delay_ms(500); // 等待舵机转动到指定角度
}
int main(void) {
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // 使能 GPIOB 时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; // 使能 TIM4 时钟
GPIOB->MODER |= GPIO_MODER_MODER6_1; // PB6 设置为复用模式
GPIOB->AFR[] |= GPIO_AFRL_AFRL6_2; // PB6 复用为 TIM4_CH1
TIM4->PSC = 168 - 1; // 预分频器为 168,计数器时钟为 1MHz
TIM4->ARR = PWM_PERIOD - 1; // PWM 周期为 20ms
TIM4->CCR1 = PWM_MIN; // 初始角度为 度
TIM4->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM 模式 1
TIM4->CCER |= TIM_CCER_CC1E; // 使能 TIM4_CH1 输出
while (1) {
servo_set_angle(90); // 舵机旋转 90 度
servo_set_angle(-90); // 舵机旋转负 90 度
}
}
```
以上代码中,我们使用了 STM32 的定时器 TIM4 来控制舵机的转动。首先,我们需要设置 TIM4 的预分频器和计数器时钟,以及 PWM 周期和占空比。然后,我们将 PB6 引脚设置为 TIM4_CH1 的复用模式,并将 TIM4_CH1 的输出使能。最后,我们编写了一个函数 `servo_set_angle` 来控制舵机的角度,该函数根据舵机的角度计算出对应的 PWM 值,并将其赋值给 TIM4_CH1 的 CCR 寄存器。在函数中,我们还加入了一个延时函数,等待舵机转动到指定角度。在主函数中,我们循环调用 `servo_set_angle` 函数来控制舵机的转动。
阅读全文