在电子领域,伺服电机主要用于机器人项目,因为它们的准确性和易于操作。伺服电机尺寸较小,非常有效且节能。它们提供高扭矩,可用于根据电机规格提升或推动重物。在本教程中,我们将了解伺服电机以及如何将伺服与STM32F103C8板连接。还连接了一个电位计来改变伺服电机轴的位置,和一个LCD来显示角度值。
所需组件
STM32F103C8 (蓝色药丸)板
伺服电机 (SG90)
液晶显示器(16x2)
电位计
面包板
跳线
电路图和连接
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)
用于伺服电机的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
}