六、3 PWM 舵机代码

目录

1、通道选择

2、参数计算

3、代码部分


1、通道选择

PA1对应通道2

注意:同一个定时器不同通道输出PWM的特点

同一个定时器的不同通道输出的PWM,频率相同(因为它们共用一个计数器),占空比可以各自设定(由各自CCR决定);由于计数器更新,所有PWM同时跳变,所以它们的相位同步。

2、参数计算

(1)舵机旋转角度范围:0 ~ 180度

(2)舵机要求周期为20ms(50Hz),高电平宽度为0.5ms~2.5ms

ARR+1 = 20K(微秒)

占空比:0.5/20 ~ 2.5/20,即 1/40(0.025)~ 1/8(0.125)

CCR:0.5K ~ 2.5K(微秒)

即ARR+1=20K,PSC(预分频)=72

(3)在运行时更改CCR的值

CCR为500时,对应0度;CCR为2500时,对应180度。

直接改变CCR时,不能直观地反应角度的变化,可以设置一个函数

CCR = (2000/180)* 角度 + 500 = (100/9)* 角度 + 500

3、代码部分

先将PWM.c和PWM.h文件中的数据改为Pin_1,和通道2

STM32PWM舵机控制通常涉及到硬件配置、初始化GPIO作为PWM输出以及编写定时器驱动 PWM 信号。这里是一个简化的示例代码,假设我们使用的是Keil MDK集成环境,并且使用了HAL库: ```c #include "stm32f1xx_hal.h" // 定义PWM通道 #define PWM_CHANNEL_1 GPIO_PIN_5 #define PWM_CHANNEL_2 GPIO_PIN_6 ... // 依此类推到PWM_CHANNEL_6 static void PWM_Configuration(void) { GPIO_InitTypeDef GPIO_InitStruct; // 初始化GPIO GPIO_InitStruct.Pin = PWM_CHANNEL_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIMx; // 根据你的TIM外设选择替代函数 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ... // 其他五个通道类似初始化 TIM_HandleTypeDef htim1; // 或者根据实际使用的TIM寄存器ID创建并初始化 } void PWM_ServoControl(uint8_t channel, uint16_t dutyCycle) { TIM_CCR1 = dutyCycle; // 对于通道1,设置Duty Cycle if (channel > 0) { switch (channel) { case 2: TIM_CCR2 = dutyCycle; break; ... // 依此类推到case 6 } } // 更新TIM寄存器,开始发送PWM信号 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // 通道1 ... // 启动其他相应通道 } int main(void) { PWM_Configuration(); while (1) { PWM_ServoControl(1, 500); // 示例,设置第一路PWM的Duty Cycle为500us delay_ms(1000); // 等待一段时间 PWM_ServoControl(2, 2000); // 另一路设置为2000us ... // 以此类推,切换其他PWM通道 } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值