伺服电机因其精度高、体积小、效率高、使用方便等优点而广泛应用于机器人领域。它们的高扭矩特性非常适合提升重物。本项目使用电位器改变电机转子位置,使用STM32F103C8(Blue Pill)控制伺服电机,使用LCD显示角度值。
项目BOM表如下:
1. STM32F103C8蓝药丸板x1
2.伺服电机(SG90)x1
3.液晶屏(16x2)x1
4.电位器2
5. 面包板x1
6. 几条跳线
STM32F103C8 有10 个ADC 引脚(PA0-PB1)。本项目使用PA3作为analogread(),通过电位器设置电机的位置。 STM32的15个PWM引脚(PA0、PA1、PA2、PA3、PA6、PA7、PA8、PA9、PA10、PB0、PB1、PB6、PB7、PB8、PB9)中,我们只使用其中一个,提供一个脉冲信号发送到伺服电机的PWM 引脚(该引脚通常是彩色的)。
STM32F103C8与LCD的连接如下:
STM32F103C8液晶屏
接地电压
+5V电源电压
电位器中心PIN V0
PB0RS
接地电阻
PB1E
PB10D4
PB11D5
PC13 D6
PC14 D7
+5VA
地线
伺服电机与STM32F103C8的连接如下:
STM32F103C8伺服电机
+5V 红色(+5V)
PA0 橙色(PWM 引脚)
接地棕色(GND)
该项目使用两个电位器:
(1) 右边的用于改变LCD对比度。左侧连接5V电源,右侧接地,中间引脚连接LCD的V0。
(2) 左侧用于模拟输入电压来改变伺服电机转子的位置。左侧引脚连接3.3V电源,右侧引脚接地,中间引脚连接STM32板的PA3引脚。
如果电脑上安装了Arduino IDE并连接到USB接口,就可以像使用Arduino一样对STM32F103C8进行编程,而无需使用FTDI编程器。
一、加载电机和LCD功能:
包括
包括
其次,声明LCD显示引脚并初始化它们。还为PWM 和电位器声明几个其他变量:
const int rs=PB0,en=PB1,d4=PB10,d5=PB11,d6=PC13,d7=PC14;
intservoPin=PA0;
int potPin=PA3;
在这里,我们创建伺服变量并将其分配给之前声明的PWM 引脚。
伺服伺服;
伺服.attach(servoPin);
然后,从ADC 引脚——PA3 读取模拟值,并将模拟电压(0-3.3)转换为数字形式(0-4095)。
模拟读取(potPin);
ADC是12位的,我们需要获取0-170的模拟值并将其分成(0-4096)数字形式。
角度=(读数/24);
以下命令使伺服电机以给定角度旋转轴:
伺服.write(角度);
完整代码如下:
//舵机与STM32接口
//电路摘要
#include //包含伺服库
#include //包含LCD显示库
const int rs=PB0,en=PB1,d4=PB10,d5=PB11,d6=PC13,d7=PC14; //声明lcd的引脚名称和引脚编号
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);//设置lcd及其参数
intservoPin=PA0; //声明并初始化伺服输出PWM引脚
int potPin=PA3; //电位器ADC输入
伺服伺服; //创建数据类型Servo 的变量伺服
无效设置()
{
液晶屏.开始(16,2); //设置lcd为16x2
lcd.setCursor(0,0); //设置光标在第一行第一列
lcd.print('电路摘要'); //将电路摘要放入LCD
lcd.setCursor(0,1); //设置光标在第二行第一列
lcd.print('带有STM32 的伺服'); //将SERVO with STM32放入LCD
延迟(3000); //延迟3秒
液晶屏.清除(); //清除液晶显示
伺服.attach(servoPin); //它通过提供脉冲将引脚PA0与电机连接作为控制反馈
}
无效循环()
{
液晶屏.清除(); //清除液晶屏
内角; //将可变角度声明为int
整体阅读; //将变量读取声明为int
读取=AnalogRead(potPin); //从PA3引脚读取模拟值
角度=(读数/24); //根据最大角度170度除ADC值
伺服.write(角度); //将角度值输入伺服
lcd.setCursor(0,0); //设置光标在第一行第一列
lcd.print('ANGLE:'); //将角度输入LCD
lcd.print(角度); //将值放入角度
延迟(100); //延迟时间
审稿编辑:唐子红