stm32HAL库输出pwm控制舵机(数字舵机),舵机脉冲宽度和资料的角度对应不上的问题

文章讲述了如何使用STM32F103C8T6通过GPIO和TIM配置,结合按键输入来控制DS3230舵机改变角度。主要步骤包括GPIO设置为输入检测按键,TIM3配置为PWM模式2,计算PWM频率和占空比,以及在代码中检测按键并调整舵机角度。
摘要由CSDN通过智能技术生成

stm32型号:stm32f103c8t6  最小系统板,需要自己加上按键

舵机型号:DS3230(30KG)-270°

首先回答问题:舵机脉冲宽度和资料的角度对应不上的问题,可能是定时器的时钟源频率不对,看看这里时钟树有没有配对

接下来是具体配置

目标是通过PB11上的按键,按下一次改变一次舵机角度(舵机角度自己定义),以下分为两部分:一是GPIO配置二是TIM配置

GPIO配置

 

 1+2.直接到图形界面:单击PB11,设置为引脚输入模式(因为要检测电平)

3.双击配置

4.设置为引脚输入

5.让引脚初始状态为高电平(等下按键一端接PB11,一端接GND,一旦按下,PB11的高电平变成低电平,即检测到按键按下)

6.PB11的名字标签为 key

    TIM配置

 1.首先配置RCC

2.配置为外部时钟输入,外部晶振

 SYS配置如上

1.TIM这里配置TIM3           

2.定时器开启内部时钟                     

3.设置为PWM模式,通道一

  接下来是计算pwm频率

 选择时钟频率为     CK_PSC = 72MHz(这个很重要),由于舵机一般是50Hz控制频率,一个周期是20ms,所以Freq = 50Hz , PSC = 71 ,  推得ARR = 19999

再由下图(270°舵机对应脉冲宽度表)

 可知,CCR应该是在500 - 2500 区间范围内,回到cubemx配置

 1.这里PSC为71

2.向上计数

3.ARR为19999

PWM模式1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平,否则为有效电平。
PWM模式2:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

 我们这里所说的有效和无效取决于我们需要的电平极性,看下舵机的控制图


 

在一个周期内只需要一点点高电平,所以选择pwm模式2 , 并把有效电平设置为低电平

解释如下

接下来是配置

 1.pwm模式2

2.有效电平为低电平,CH polarity 意为频道有效电平

3.这个是占空比,这里可以给个初始值,也可以不给,程序里面再定义设置

这里配置ok了,接下来看看时钟源的配置

 设置好各个分频,确保最后定时器的时钟源配置是72MHz

 

 整好剩下的配置,就可以生成代码了,接下来是

代码部分

 初始定义

		HAL_TIM_PWM_Start (&htim3 ,TIM_CHANNEL_1 );

 一些必要的函数(hal库给定的)

 按键检测部分

			__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_1,pwmval);

1. 按下后各部分操作

2.该函数用于改变占空比,以使舵机改变角度值

接线:PB11接按键,PA6接舵机信号线(由cubemx获得,他会自动配置对应定时器的复用引脚)

最终现象是,按下按键(PB11位置的)一次,舵机改变一次角度

STM32 PWM 控制舵机通常使用 HAL 库(Hardware Abstraction Layer),因为 HAL 提供了高度封装的函数,简化了硬件操作并增强了移植性和代码的复用性。以下是使用 STM32 PWM 控制舵机的基本步骤: 1. **初始化HAL库**:首先需要对GPIO和PWM外设模块进行初始化,设置GPIO作为PWM输出口,并配置好PWM的工作模式。 ```c HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); HAL_PWMModule_Enable(PWM_MODULE_ID); ``` 2. **配置PWM**:定义舵机所需的频率、占空比范围等参数,并配置到PWM上。例如,假设舵机工作在50Hz,范围通常是50%~100%,你可以这样做: ```c hperiph_pwm_handle.Instance = GPIOx; hperiph_pwm_handle.Init.Period = 2000; // 舵机周期,50Hz即20ms hperiph_pwm_handle.Init.Mode = PWM_MODE //========================================================================// UP/DOWN hperiph_pwm_handle.Init.Ownership = PWM_OWNERSHIP杂志社// MASTER or SLAVE HAL_PWM_Init(&hperiph_pwm_handle); ``` 3. **调整占空比**:通过`HAL_PWM_SetCompare()`函数设置PWM的高电平持续时间,间接调整舵机的转动角度。这对应舵机脉冲宽度调制(PWM)信号。 ```c float dutyCycle = (angle / 180.0f) * 100.0f; // angle in degrees, 180 for full rotation uint16_t compareValue = dutyCycle * hperiph_pwm_handle.Init.Period; HAL_PWM_SetCompare(&hperiph_pwm_handle, PWM_CHANNEL, compareValue); ``` 4. **更新 PWM 设置**:周期性地更新占空比,如果舵机需要连续运动,则添加定时器回调处理程序,每隔一段时间更新一次。 ```c HAL_TIM_Base_Start_IT(&htim_base); while (1) { if (flagToUpdateDutyCycle) { // 更新占空比... } HAL_Delay(1); // 短暂延时以避免高频更新 } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值