本文实现定时器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助手上发送指令也可以调节舵机。