You are on page 1of 11

STM32F103C8 ĐIỀU KHIỂN ĐỘNG CƠ ENCODER DC

Bài 06:

PWM + NGẮT TIMER + ĐO VẬN TỐC


ĐIỀU KHIỂN VẬN TỐC ĐỘNG CƠ DÙNG PID

Embedded System Programming


GV: Ngô Thanh Đông
Bài 06: PWM + NGẮT TIMER + ĐO VẬN TỐC
ĐIỀU KHIỂN VẬN TỐC ĐỘNG CƠ DÙNG PID

Dùng ngắt timer tính giá trị duty cycle để điều khiển vận tốc động cơ
phương pháp PID

5.1. Mạch điều khiển, sơ đồ đấu nối


5.2. Các lệnh điều khiển
5.3. Chương trình điều khiển
Bài 06: PWM + NGẮT TIMER + ĐO VẬN TỐC
ĐIỀU KHIỂN VẬN TỐC ĐỘNG CƠ DÙNG PID
VSSA
+12V 6.1. Mạch
U1 VDDA

PA0
PA1
10
11
12
PA0-WKUP
PA1
NRST
7
điều khiển,
sơ đồ đấu
PA2
13
PA3
14
PA4 9 4 U6 D1 D2
15 UF4001 UF4001
PA5

nối
16
PA6 5
17 IN1 IN1 VCC VS
PA7 7 2
29 IN2 IN2 OUT1
PA8 PA8 10
30 IN3 PA0

+88.8
PA9 PA9 12 3
31 IN4 OUT2

6.2. Các
PA10 PA10 6
32 PB6 ENA PA1
PA11 11 13
33 ENB OUT3
34
PA12 D3 D4
PA13 1 14 UF4001 UF4001

lệnh điều
37 SENSA OUT4
PA14 15
38 2 SENSB GND
PA15 PC13_RTC
3
PC14-OSC32_IN
18 4 8

khiển
PB0 PC15-OSC32_OUT L298
19
PB1
20 PA9 RXD
PB2
39 5
IN1 PB3 OSCIN_PD0
40 6 PA10 TXD
IN2 PB4 OSCOUT_PD1

6.3.
41
PB5
42 RTS
PB6 PB6
43
PB7
PB13 THUAN
45 CTS
PB8
46
21
22
PB9
PB10
PB11 VBAT
1
PB14 NGHICH
PB6 A
Chương
25 PB15 DUNG
PB13
PB14
26
27
28
PB12
PB13
PB14
44
B

C
trình điều
PB15 PB15 BOOT0
STM32F103C8 D khiển
Bài 06: PWM + NGẮT TIMER + ĐO VẬN TỐC
ĐIỀU KHIỂN VẬN TỐC ĐỘNG CƠ DÙNG PID
Khai báo biến 6.1. Mạch
điều khiển,
sơ đồ đấu
volatile static float xung_vantoc_hientai, xung_vantoc_truoc = 0; nối
volatile static float Delta_time_vantoc = 0.1;
volatile static float vantoc; 6.2. Các
lệnh điều
khiển
6.3.
Chương
trình điều
khiển
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim == &htim1) {
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
xung_vantoc_hientai = xung;
vantoc = (xung_vantoc_hientai - xung_vantoc_truoc)/360
/ Delta_time_vantoc*60;
xung_vantoc_truoc = xung_vantoc_hientai;
}
if (htim == &htim2) {
giatrido_hientai = vantoc;
error = setpoint - giatrido_hientai;
integral = integral + (error * Delta_t);
derivative = (error - error_truoc) / Delta_t;
output = (Kp * error) + (Ki * integral) + (Kd * derivative);
if (output > 100)
output = 100;
if (output < -100)
output = -100;
error_truoc = error;
DieuKhienViTri();
}
}
Khai báo timer1 chạy và ngắt

HAL_TIM_Base_Start_IT(&htim1);
Trong while(1)

char str[200];
sprintf(str, "vi=%ld V=%.2f D=%.2f er=%.2f in=%.2f \r\n",
xung, vantoc, output, error, integral);
HAL_UART_Transmit_IT(&huart1, (uint8_t*) str, strlen(str));
HAL_Delay(100);
Set vị trí và Kp, Ki, Kd
volatile float setpoint = 50, Kp = 2, Ki = 0.2, Kd = 0.01;

You might also like