Professional Documents
Culture Documents
Bai 6
Bai 6
Bài 06:
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
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;