本文实现定时器PWM输出驱动舵机,通过蓝牙BLE改变PWM占空比时间改变舵机角度。
一、驱动舵机原理
舵机控制信号通常是PWM(脉宽调制)信号。
PWM信号的脉宽直接影响舵机的转动角度。通常,PWM信号的周期固定为20毫秒,而脉冲宽度则决定了舵机的目标角度。例如:
脉冲宽度为0.5毫秒时,对应舵机的最小角度(如0°)。
脉冲宽度为1.5毫秒时,对应舵机的中间位置(如90°,对于180°舵机而言)。
脉冲宽度为2.5毫秒时,对应舵机的最大角度(如180°)
二、STM32CuteMX配置
TIM3通道1选择PWM Generation CH1



PWM周期计算:
SYSTEMcoreClock/{[(SYSTEMcoreClock/10000)-1]+1}=10000Hz
10000/(199+1)=50Hz
1/50=20ms
占空比时间:20*15/(199+1)=1.5ms
三、程序
1、按键控制舵机
定义任务
UTIL_SEQ_RegTask( 1U << TASK_PLAY_NOTE, UTIL_SEQ_RFU, servo_process);
任务处理函数
void servo_process(void)
{
static uint8_t running=0;
if(running==0)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 5); //0度
running=1;
}else
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 15); //90度
running=0;
}
}按键B3触发TASK,调用servo_process,控制舵机调节角度。
void BSP_PB_Callback(Button_TypeDef Button)
{
switch(Button)
{
case B3:
UTIL_SEQ_SetTask(1U << TASK_PLAY_NOTE, CFG_SEQ_PRIO_0);
break;
default:
break;
}
}2、BLE控制舵机
servce1_app.c中写特征事件处理:
case SERVICE1_SERVOCHAR_WRITE_NO_RESP_EVT:
/* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */
//if(p_Notification->DataTransfered.p_Payload[0]==0x01){
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);
printf("%d\r\n",p_Notification->DataTransfered.p_Payload[0]);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 5+p_Notification->DataTransfered.p_Payload[0]);
//}
/* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */p_Notification->DataTransfered.p_Payload[0]为通过BLE调试工具发送的HEX数据(0x00-0x14)对应角度0-180
四、运行效果

BLE助手上发送指令也可以调节舵机。

我要赚赏金
