将伺服电机与STM32F103C8板连接起来的教程

2023-09-19  

在电子领域,伺服电机主要用于机器人项目,因为它们的准确性和易于操作。伺服电机尺寸较小,非常有效且节能。它们提供高扭矩,可用于根据电机规格提升或推动重物。在本教程中,我们将了解伺服电机以及如何将伺服与STM32F103C8板连接。还连接了一个电位计来改变伺服电机轴的位置,和一个LCD来显示角度值。


所需组件

STM32F103C8 (蓝色药丸)板

伺服电机 (SG90)

液晶显示器(16x2)

电位计

面包板

跳线

电路图和连接

poYBAGNktgqAdjtvAACc1lPNOss753.png

SMT32F103C8 引脚详细信息

在STM32F103C8中,我们有10个ADC引脚(PA0-PB1),这里我们只使用一个引脚(PA3)进行模拟读取(),用于通过电位计设置电机的轴位置。此外,在STM32的15个PWM引脚(PA0,PA1,PA2,PA3,PA6,PA7,PA8,PA9,PA10,PB0,PB1,PB6,PB7,PB8,PB9)中,一个引脚将用于向伺服电机的PWM引脚提供脉冲(通常为橙色)。

STM32F103C8与液晶显示器之间的连接

 

STM32F103C8 液晶显示器
接地 VSS
(55 电压输出
前往电位计中心引脚 V0
PB0 RS
接地 乌尔曼
PB1 E
PB10 D4
PB11 D5
电脑13 D6
电脑14 D7
(5 一个
接地 K

 

伺服电机与STM32F103C8的连接

 

STM32F103C8 伺服
(5 红色 (+5V)
质保 橙色(PWM 引脚)
接地 棕色(钝)

 

电位计连接

我们在这里使用了两个电位计

1.右侧的电位器用于改变LCD对比度。它有三个引脚,左引脚用于+5V,右引脚用于GND,中心引脚连接到LCD的V0。

2.左边的电位器用于通过控制模拟输入电压来改变伺服电机的轴位置,左引脚输入3.3V,右脚有GND,中心输出连接到STM32的(PA3)

pYYBAGNktgyAHIqxAAC5EY-Ycok427.jpg

用于伺服电机的STM32编程

首先,我们包含了用于伺服和LCD功能的库文件:

#include

#include

然后声明用于LCD显示的引脚并对其进行初始化。还声明了PWM和电位计的其他几个变量:

const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14;

LiquidCrystal lcd(rs,en,d4,d5,d6,d7);

int servoPin = PA0;

int potPin = PA3;

在这里,我们创建了数据类型为 Servo 的可变伺服,并将其连接到先前声明的 PWM 引脚。

Servo servo;

servo.attach(servoPin

);  

然后从引脚PA3读取模拟值,因为它是一个ADC引脚,它将模拟电压(0-3.3)转换为数字形式(0-4095)

analogRead(potPin);   

由于数字输出是 12 位分辨率,我们需要获得度数范围 (0-170) 的值,它根据最大角度 170 度将 ADC (0-4096) 值除以,因此我们除以24。

angle = (reading/24

); 

下面的语句使伺服电机以给定的角度旋转轴。

servo.write(angle);
 

//INTERFACE SERVO WITH STM32

//CIRCUIT DIGEST


#include //including servo library

#include //including LCD display library

const int rs = PB0, en = PB1, d4 = PB10 , d5 = PB11 , d6 = PC13, d7 = PC14; //declaring pin names and pin numbers of lcd

LiquidCrystal lcd(rs,en,d4,d5,d6,d7); //setting lcd and its paramaters


int servoPin = PA0; //declare and initialize pin for servo output PWM 

int potPin = PA3; //potentiometer ADC input 


Servo servo; // creating variable servo with datatype Servo


void setup() 




lcd.begin(16,2); //setting lcd as 16x2

lcd.setCursor(0,0); //setting cursor at first row and first column

lcd.print("CIRCUIT DIGEST"); //puts CIRCUIT DIGEST in LCD

lcd.setCursor(0,1); //setting cursor at second row and first column

lcd.print("SERVO WITH STM32"); //puts SERVO WITH STM32 in LCD

delay(3000); // delays for 3 seconds

lcd.clear(); //clears lcd display

servo.attach(servoPin); //it connects pin PA0 with motor as control feedback by providing pulses



}


void loop()

{

lcd.clear(); //clears lcd

int angle; //declare varible angle as int

int reading; //declare varible reading as int

reading = analogRead(potPin); //read analog value from pin PA3

angle = (reading/24); //it divides ADC the value according to max angle 170 deg

servo.write(angle); //it puts angle value at servo

lcd.setCursor(0,0); //setting cursor at first row and first column

lcd.print("ANGLE:"); //puts ANGLE in LCD

lcd.print(angle); //puts value at angle

delay(100); //delay in time


 


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。