基于stm32f103的舵机角度控制程序

#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。

一个基本的舵机角度控制代码,如有不足希望大家指正,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值