当前位置:首页 > 新型工业化 >stm32伺服电机控制(stm32电机伺服)

stm32伺服电机控制(stm32电机伺服)

伺服电机因其精度高、体积小、效率高、使用方便等优点而广泛应用于机器人领域。它们的高扭矩特性非常适合提升重物。本项目使用电位器改变电机转子位置,使用STM32F103C8(Blue Pill)控制伺服电机,使用LCD显示角度值。

项目BOM表及电路连接

stm32伺服电机控制(stm32电机伺服)

项目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;

液晶屏(rs,en,d4,d5,d6,d7);

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); //延迟时间

审稿编辑:唐子红

最新资讯

推荐资讯