基于STM32 HAL库 舵机驱动

目录

配置

调试配置​

时钟配置​

定时器配置

代码

steering.h

steering.c


配置

调试配置

时钟配置

定时器配置

预分频系数7200-1,自动重装载系数2000-1。

代码

steering.h

#ifndef __steering_H__
#define __steering_H__


void pwm_control_Steering(int a,float pwm);
void steering_init();


#endif

steering.c

#include "steering.h"
#include "tim.h"

float temp;


void steering_init(){
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);  
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);  
  HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);  
  HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);  
}
void pwm_control_Steering(int a,float pwm){
	if(pwm>=0&&pwm<=180){
		temp=pwm*200.0f/180.0f+50.0f;
		if(a==1){
		__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1,(int)temp);
		}
		if(a==2){
		__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2,(int)temp);
		}
		if(a==3){
		__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3,(int)temp);
		}
		if(a==4){
		__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4,(int)temp);
		}
	}
	
	
}
### 使用 STM32HAL 进行多通道舵机驱动编程 #### 初始化项目设置 为了使用 STM32 及其 HAL 来实现多通道舵机驱动,首先需要利用 CubeMX 工具完成基本硬件配置。选择合适的定时器用于生成 PWM 信号,并确保这些定时器能够支持多个通道输出。 对于 STM32F407 而言,在CubeMX 中应配置 TIM1 或者其他高级定时器作为PWM 输出资源[^1]。每个选定的定时器都可以分配给不同的 GPIO 引脚以便连接到各个舵机上。 #### 编写初始化函数 在主程序文件 `main.c` 中定义一个初始化函数用来启动所需的外设和服务: ```c void MX_TIM_Init(void){ __HAL_RCC_TIM1_CLK_ENABLE(); //使能TIM1时钟 htim1.Instance = TIM1; htim1.Init.Prescaler = 83; /* 设置预分频值 */ htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 20000 - 1 ;/* 自动重装载寄存器周期值*/ htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim1) != HAL_OK){ Error_Handler(); } } ``` 此部分代码设置了定时器的工作参数并调用了 `HAL_TIM_PWM_Init()` 函数来进行最终初始化操作。 #### 创建 PWM 控制函数 接下来创建一组专门针对特定舵机位置调整的功能函数。考虑到不同类型的舵机会有不同的工作范围(如标准伺服电机通常为 0 到 180 度),因此需根据实际需求编写相应的转换逻辑。 下面是一个简单的例子展示如何计算指定角度对应的占空比数值: ```c uint16_t AngleToDutyCycle(float angle, float min_angle, float max_angle, uint16_t min_duty_cycle, uint16_t max_duty_cycle){ return ((angle-min_angle)/(max_angle-min_angle)) * (max_duty_cycle - min_duty_cycle)+min_duty_cycle ; } // 示例:将角度转化为适用于 SG90 的占空比 #define MIN_ANGLE_SG90 0.0f #define MAX_ANGLE_SG90 180.0f #define MIN_DUTY_CYCLE_SG90 544 // 对应约 0.5ms 宽度 #define MAX_DUTY_CYCLE_SG90 2400 // 对应约 2.5ms 宽度 uint16_t GetSG90DutyFromAngle(float angle){ return AngleToDutyCycle(angle,MIN_ANGLE_SG90 ,MAX_ANGLE_SG90 , MIN_DUTY_CYCLE_SG90 ,MAX_DUTY_CYCLE_SG90 ); } ``` 上述代码片段展示了从物理角度到电子脉冲宽度之间的映射过程[^2]。 #### 实现多通道控制 当涉及到多个舵机时,则可以通过循环遍历的方式依次更新各路PWM信道的状态。假设我们有三个分别位于 PA8、PA9 和 PB0 上接线的舵机,那么可以在 main 循环里加入如下类似的语句: ```c while (1){ for(int i=0;i<NUM_SERVOS;++i){ __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1+i,dutycycles[i]); // dutycycles[] 数组存储着每台设备当前所需设定的具体占空比率 } HAL_Delay(20); // 给定适当延时以稳定输出波形 } ``` 这段伪代码说明了怎样动态改变几个独立工作的舵机的位置[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值