#include "stm32f10x.h"
void servo_set_pulse(uint32_t pulse_width, uint16_t delay_time = 0);
void servo_set_angle(uint8_t angle, uint16_t delay_time = 0);
void servo_init(uint16_t pwm_frequency = 50);
int main(void)
{
servo_init(50); // 初始化舵机,默认PWM频率为50Hz
while(1) {
servo_set_angle(90, 1000); // 使舵机旋转到90度,等待1秒钟
servo_set_pulse(1500, 1000); // 设置脉冲宽度为1.5ms,等待1秒钟
servo_set_angle(0, 1000); // 使舵机旋转到0度,等待1秒钟
servo_set_pulse(1000, 1000); // 设置脉冲宽度为1ms,等待1秒钟
}
}
void servo_init(uint16_t pwm_frequency)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能GPIOA、AFIO和TIM3的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB1Periph_TIM3, ENABLE);
// 将PA1配置为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 使能TIM3的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 配置TIM3
TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1; // 72MHz/72 = 1MHz
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = 20000 - 1; // 1MHz/20,000 = 50Hz或20ms周期
TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
// 将TIM3通道1配置为PWM输出
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 1500; // 配置90度时的1.5ms脉冲宽度
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
// 启动TIM3
TIM_Cmd(TIM3, ENABLE);
}
void servo_set_angle(uint8_t angle, uint16_t delay_time)
{
if(angle < 0) angle = 0;
if(angle > 180) angle = 180;
uint32_t pulse_width = (angle * 11) + 500; // 将角度转换为脉冲宽度
servo_set_pulse(pulse_width, delay_time);
}
void servo_set_pulse(uint32_t pulse_width, uint16_t delay_time)
{
TIM3->CCR1 = pulse_width; // 设置PWM脉冲宽度
if(delay_time > 0) {
delay_ms(delay_time); // 等待指定的时间
}
}
这个程序中使用的定时器脉冲频率是1MHz,即72MHz的时钟频率除以72,将TIM3的预分频器设置为72-1。然后,每20ms产生一个PWM周期,将TIM3的重装载值设置为20000-1。所以定时器的输出频率是1MHz/20000,也就是50Hz。
一个基本的舵机角度控制代码,如有不足希望大家指正,