STM32F103控制舵机

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

STM32控制舵机(多个舵机、附代码)

1、基本介绍
在这里插入图片描述2、代码

#include "bsp\_servo.h"

void Servo\_PWM\_Init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;//定义定时器结构体变量
	TIM_OCInitTypeDef TIM_OCInitStructure;//定义输出比较结构体变量
    GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量
	
	RCC\_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //GPIOB时钟使能
	RCC\_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4的时钟
	RCC\_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用时钟

	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//配置GPIO引脚
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置GPIO速率
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//配置GPIO为复用推挽输出
	GPIO\_Init(GPIOB,&GPIO_InitStructure);//GPIO初始化函数
	
	TIM_TimeBaseStruct.TIM_Period=9999;//设置自动重装载的周期值,计算方法多了
	TIM_TimeBaseStruct.TIM_Prescaler=143;//设置预分频系数
	TIM_TimeBaseStruct.TIM_ClockDivision=0;//设置时钟分割,0同TIM\_CKD\_DIV1
	TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
	TIM\_TimeBaseInit(TIM4,&TIM_TimeBaseStruct);//定时器初始化函数
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//PWM模式1
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出比较极性高
    //多舵机,怎么控制,当然是同一个定时器下的4个通道了,所以,下面的8句就很重要。
	TIM\_OC1Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道1
	TIM\_OC2Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道2
	TIM\_OC3Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道3
    TIM\_OC4Init(TIM4,&TIM_OCInitStructure);//比较输出初始化函数,通道4
	
	TIM\_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); //输出比较1预装载寄存器使能
    TIM\_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);//输出比较2预装载寄存器使能
	TIM\_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);//输出比较3预装载寄存器使能
	TIM\_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);//输出比较4预装载寄存器使能
	
	TIM\_Cmd(TIM4,ENABLE);//TIM4使能,忘了就前功尽弃了
}


头文件

#ifndef \_\_SERVO\_H
#define \_\_SERVO\_H

#include "stm32f10x.h"
#include "stm32f10x\_rcc.h"
#include "stm32f10x\_tim.h"

void Servo\_PWM\_Init(void);

#endif 


最后,最关键的来了,如何使用呢?当然是一句函数了。修改定时器下某一个通道的函数,TIM_SetCompare1(TIM4, 500); 注意:修改哪一个通道的占空比,就要把那个数字1修改为几。
main函数中调用

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

如果你需要这些资料,可以戳这里获取

### STM32F103 控制舵机的实现方法 STM32F103控制器可以通过 PWM 波形来控制舵机的角度。以下是基于定时器生成 PWM 的具体实现方式。 #### 定时器配置 为了生成适合舵机使用的 PWM 信号,需要初始化一个定时器并将其通道配置为 PWM 输出模式。通常情况下,舵机需要一个周期约为 20ms 的方波信号,其中高电平持续时间决定了舵机旋转的角度[^4]。 ```c #include "stm32f10x.h" void TIM3_PWM_Init(uint16_t arr, uint16_t psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 配置定时器基础参数 TIM_TimeBaseStructure.TIM_Period = arr; // 自动重载值 (ARR) TIM_TimeBaseStructure.TIM_Prescaler = psc; // 分频系数 (PSC) TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 上升沿捕获分频因子 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 配置通道 1 为 PWM 模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 设置为 PWM1 模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 开启输出 TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比设为 0% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;// 极性为高有效 TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); // 使能预装载寄存器 TIM_Cmd(TIM3, ENABLE); // 启用定时器 } void set_angle_steer(int angle) { float duty_cycle = ((float)(angle * 10) / 180 + 2.5); // 计算对应角度的占空比 [%] uint16_t pulse_width = (uint16_t)((duty_cycle / 100.0) * (20000 + 1)); // 将占空比转换为脉宽 TIM_SetCompare1(TIM3, pulse_width); // 更新比较值 } ``` 以上代码实现了通过 `TIM3` 和其通道 1 来生成用于控制舵机的 PWM 信号。函数 `set_angle_steer()` 可以用来动态调整舵机的角度[^1]。 #### 主程序逻辑 在主循环中可以按照需求不断更新舵机的目标位置: ```c int main(void) { int i = 90; // 当前目标角度 char data = 0; // 方向标志位 TIM3_PWM_Init(20000, 72 - 1); // 初始化定时器,频率约 50Hz while (1) { if (data == 0) { i += 30; if (i >= 180) { data = 1; } set_angle_steer(i); delay_ms(1000); } if (data == 1) { i -= 30; if (i <= 0) { data = 0; } set_angle_steer(i); delay_ms(1000); } } } ``` 此代码片段展示了如何让舵机逐步改变方向,在达到边界后反向移动[^1]。 #### 头文件定义 如果希望将功能封装成模块化设计,则可以在头文件中声明必要的接口函数: ```c #ifndef __SERVO_H #define __SERVO_H #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_tim.h" void TIM3_PWM_Init(uint16_t arr, uint16_tpsc); void set_angle_steer(int angle); #endif ``` 这样做的好处是可以提高代码可读性和复用率[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值