一、实操连贯操作
先把舵机信号线接固定 PWM 引脚,红色接 5V 棕色接共地,再把独立按键一端接 STM32 普通 IO 口另一端接 GND,硬件接好后在工程里添加按键初始化代码,配置按键引脚为上拉输入模式避免悬空电平不稳,写完按键扫描函数实现按下识别功能,接着保留原有舵机 PWM 驱动代码不变,在主循环里调用按键扫描,检测到按键按下就切换机械爪开合状态,第一次按下舵机转到闭合角度完成抓取,再次按下转回张开角度松开物体,调试时先单独测试舵机能否正常转角度,再单独测试按键是否能稳定触发,两者都正常后整合运行,出现舵机抖动优先检查供电是否充足,按键乱跳就适当增加软件消抖延时,根据自己机械爪实际行程微调开合对应的舵机角度数值,不用死卡 0 度和 180 度贴合实物使用即可。
二、本次实操学到的知识
掌握 STM32 定时器配置 50Hz 标准 PWM 波形输出原理,清楚 SG90 舵机依靠不同高电平时长对应不同旋转角度的控制逻辑,学会单片机普通 IO 口上拉输入模式配置与独立按键硬件接线规范,理解按键机械抖动带来的误触发问题以及软件延时消抖的实用解决办法,熟练实现外设独立驱动代码整合调用,明白状态切换逻辑在嵌入式控制里的基础用法,理清小车执行机构与触发控制模块的联动思路,懂得硬件供电差异对舵机这类动力外设工作状态的影响,积累嵌入式项目分步调试先单体测试再整体联调的实操经验,学会根据实物机械结构灵活修改程序参数适配实际使用场景,巩固 GPIO 不同工作模式区分使用以及主循环轮询扫描外设信号的编程思想。
三、整合完整可用代码
#ifndef __KEY_H #define __KEY_H #include "stm32f10x.h" void KEY_Init(void); u8 KEY_Scan(u8 mode); #endif
#include "key.h" #include "delay.h" void KEY_Init(void) { GPIO_InitTypeDef gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); gpio.GPIO_Pin=GPIO_Pin_1; gpio.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(GPIOA,&gpio); } u8 KEY_Scan(u8 mode) { static u8 key_state=1; if(mode)key_state=1; if(key_state&&(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)) { Delay_ms(20); if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0) { key_state=0; return 1; } } else if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==1)key_state=1; return 0; }
#include "stm32f10x.h" #include "servo.h" #include "delay.h" #include "key.h" u8 grab_flag=0; int main(void) { delay_init(); SERVO_Init(); KEY_Init(); SERVO_SetAngle(0); while(1) { if(KEY_Scan(0)==1) { grab_flag=!grab_flag; if(grab_flag)SERVO_SetAngle(180); else SERVO_SetAngle(0); } } }
我要赚赏金
