PWM控制舵机角度

本文详细介绍了使用STM32的PWM功能控制舵机的角度。主要内容包括配置PWM的关键参数arr和psc,以及如何通过数学映射思想计算合适的脉冲宽度来控制舵机。还讨论了分频的作用和计算PWM周期的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PWM控制舵机角度(keilc

本文主要关于参数配置:arr,psc,ccrx(setcompare函数参数)

TIM相关配置简单提一嘴:
(涉及到寄存器,但仅有库函数知识不妨碍实践)
配置时最关键的两个参数:

  • 自动装载值寄存器中的arr;
  • 分频寄存器中的psc;

arr在TIM_TimeBaseInit的结构体中的TIM_Period配置,其决定着pwm周期(period英文意思时也是周期);psc在结构体中的TIM_Presaler配置,其决定了分频系数,
分频是什么呢?哟西,引脚所用的时钟不完全等于时钟源产生的,而是经过处理的,最大的处理就是分频,分频有啥好处呢?时钟源只能产生特定频率的时钟,而我们的外设有自己的时钟,只有当两者的时钟相符时,外设才能正常工作,分频就是将大块频率的时钟分割(除法)成小块时钟,供外设使用,

好,那么就涉及计算了:
Tout(溢出时间,周期时间单位是s)=(ARR+1)(PSC+1)/Tclk(Tckl是APB1*倍频来的,一般是72M,即常数)

通过pwm波原理,我们需要往ccrx寄存器中写入一个数值(介于0到srr之间)

这时,需要拿起笔来在纸上算一算:我们将一个周期的事件映射到arr上:

void TIM3_PWM_Init(u16 arr,u16 psc);
TIM3_PWM_Init(199,7199);

周期:(199+1)*(7199+1)/72000=0.02s
arr约为200;
那么arr中的1相当于0.1ms(数学映射思想)
由舵机控制原理知道:(sg90)要求0.5ms~2.5ms对应 0至180°(数学映射思想),那么我i们在写入setcompare函数参数范围为5至25;

此外,一般stm32io口输出为3.3v电压,而低配的sg90电机驱动电压要求4.2到6.0,如果3.3v强行驱动则会出现舵机抖动强烈,不稳定的情况。

舵机通常用于精确控制机械结构的角度,如无人机、机器人或模型船等。270度舵机角度控制并不是直接通过数学公式完成的,因为舵机本身有一个内部电路和电机控制机制来将电脉冲信号转换为旋转角度。 然而,如果你想计算从原始输入(比如PWM信号)到实际舵机角度的映射,简单来说,PWM信号一般对应于一定范围内的舵机转动角度。常见的舵机工作电压通常是5V,而PWM频率和占空比( Duty Cycle,即高电平时间与周期总时间的比例)决定了电机转速进而影响角度。例如,满量程的1200us PWM信号可能代表180度角,而270度可能需要更高的占空比,具体比例取决于舵机的规格说明。 不过,实际的控制公式可能会涉及到一些非线性校准,制造商提供的数据手册会给出相应的曲线或者转换函数。如果你需要编程控制舵机,你可能需要用到类似这样的Python库中的函数: ```python import time from Servo import Servo # 假设servo是一个已经初始化的实例 def set_angle(angle): pulse_width = angle_to_pwm(angle) servo.set_pulse_width(pulse_width) # 自定义的PWM值转角度函数(这里仅作示例) def angle_to_pwm(angle, min_pulse=544, max_pulse=2400): if angle < 0 or angle > 180: raise ValueError("Invalid angle") # 实际的计算公式,这只是一个简化版本,需参照舵机规格 return int(min_pulse + (max_pulse - min_pulse) * ((angle / 180) * 0.5)) # 调用set_angle(270) 就会尝试设置270度的舵机角度 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值