伺服馬達(dá)(Servo motor)憑準(zhǔn)確、小型、高效,易用在機(jī)器人領(lǐng)域應(yīng)用廣泛,其高扭矩特性非常適合升降重物。本項(xiàng)目用電位器改變馬達(dá)轉(zhuǎn)子位置,用STM32F103C8(藍(lán)丸)控制伺服馬達(dá),用LCD顯示角度值。
項(xiàng)目BOM表及電路連接
項(xiàng)目BOM表如下:
1、STM32F103C8藍(lán)丸板 x1
2、伺服馬達(dá)(SG90) x1
3、LCD(16x2) x1
4、電位器 x2
5、面包板 x1
6、跳線 若干

?
STM32F103C8有10路ADC引腳(PA0-PB1),本項(xiàng)目使用PA3作為analogread(),通過電位器設(shè)定馬達(dá)的位置。在STM32引腳的15 PWM引腳中(PA0, PA1, PA2, PA3, PA6, PA7, PA8, PA9, PA10, PB0, PB1, PB6, PB7, PB8, PB9),我們只使用其中的一個(gè)引腳,為伺服馬達(dá)的PWM引腳(該引腳通常帶有顏色)提供脈沖信號(hào)。
STM32F103C8與LCD的連接如下:
STM32F103C8 LCD
GND VSS
+5V VDD
PB0 RS
GND RW
PB1 E
PB10 D4
PB11 D5
PC13 D6
PC14 D7
+5V A
GND K
伺服馬達(dá)與STM32F103C8的連接如下:
STM32F103C8 伺服馬達(dá)
+5V RED (+5V)
PA0 ORANGE (PWM pin)
GND BROWN (GND)

?
本項(xiàng)目使用兩個(gè)電位器:
(1)右邊的用來改變LCD對(duì)比度。左邊接5V電源,右邊接地,中間引腳與LCD的V0連接。
(2)左邊的用來模擬輸入電壓的大小,以改變伺服馬達(dá)轉(zhuǎn)子的位置。左邊引腳接3.3V電源,右邊接地,中間連接與的STM32板子的PA3引腳。
編程及代碼說明
如果電腦安裝了Arduino IDE,連接上USB接口,就可以像使用Arduino一樣,對(duì)STM32F103C8進(jìn)行編程了,無須使用FTDI編程器。
首先,載入馬達(dá)和LCD函數(shù):
#include
#include
其次,聲明LCD顯示器引腳并初始化。同時(shí)還要聲明其他幾個(gè)用于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;
這里,我們創(chuàng)建了伺服變量,并將其賦予前述聲明的PWM引腳。
Servo servo;
servo.attach(servoPin);
然后,從ADC引腳——PA3讀取模擬值,將模擬電壓(0-3.3)轉(zhuǎn)換成數(shù)字形式(0-4095)。
analogRead(potPin);
該ADC為12位,我們需要獲得的0-170模擬值,要將其均分為(0-4096)數(shù)字形式。
angle = (reading/24);
下面指令使伺服馬達(dá)以給定的角度旋轉(zhuǎn)轉(zhuǎn)軸:
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
-
lcd
+關(guān)注
關(guān)注
34文章
4480瀏覽量
170137 -
伺服馬達(dá)
+關(guān)注
關(guān)注
0文章
23瀏覽量
7835 -
電路連接
+關(guān)注
關(guān)注
0文章
12瀏覽量
6724 -
STM32F103C8
+關(guān)注
關(guān)注
1文章
23瀏覽量
8235
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
STM32F103x8 STM32F103xB單片機(jī)數(shù)據(jù)手冊(cè)
創(chuàng)建stm32f103c8工程后為什么終端沒有打印Hello RT_Thread?
STM32F103C8T6開發(fā)板最小系統(tǒng)原理圖
STM32F103×8/STM32F103×B MCU手冊(cè)
STM32F103C8T6 PA2無PWM輸出怎么解決?
基于STM32F103C8T6 ADXL345 加速度傳感器的計(jì)步器設(shè)計(jì)指南和代碼
STM32F103x8/STM32F103xB規(guī)格書
19.3-星曈科技 openmv Hopenmv發(fā)送五個(gè)uchar Openmv+STM32F103C8T6視覺巡線小車 STM32循跡小車系列教程

19.4-STM32接收數(shù)據(jù)-狀態(tài)顯示在屏幕 openMV尋跡與小車控制 Openmv+STM32F103C8T6視覺巡線小車

第七章-V1.5 STM32超聲波測(cè)距STM32F103C8t6超聲波避障小車 超聲波避障模塊 STM32超聲波測(cè)距

STM32F103xC,STM32F103xD,STM32F103xE中文資料
32位基于ARM核心的帶512K字節(jié)閃存的微控制器STM32F103xC, STM32F103xD, STM32F103xE數(shù)據(jù)手冊(cè)
學(xué)STM32為什么首選F103C8T6?

評(píng)論