Giới thiệu
Động cơ DC
Động cơ DC chuyển đổi năng lượng điện dưới dạng dòng điện trực tiếp thành năng lượng cơ học.
- Trong trường hợp động cơ, năng lượng cơ học tạo ra ở dạng chuyển động quay của trục động cơ.
- Hướng quay của trục của động cơ có thể được đảo ngược bằng cách đảo chiều hướng dòng điện trực tiếp qua động cơ.
- Động cơ có thể được xoay ở một tốc độ nhất định bằng cách áp dụng một điện áp cố định cho nó. Nếu điện áp thay đổi, tốc độ của động cơ thay đổi.
- Do đó, tốc độ động cơ DC có thể được điều khiển bằng cách áp dụng điện áp DC khác nhau; trong khi hướng quay của động cơ có thể được thay đổi bằng cách đảo ngược hướng dòng điện qua nó.
- Để áp dụng điện áp khác nhau, chúng ta có thể sử dụng kỹ thuật PWM.
- Để đảo ngược dòng điện, chúng ta có thể sử dụng mạch H-Bridge hoặc IC điều khiển động cơ sử dụng kỹ thuật H-Bridge hoặc bất kỳ cơ chế nào khác.
Để biết thêm thông tin về động cơ DC và cách sử dụng chúng, cấu hình mạch H-Bridge, kỹ thuật PWM, hãy tham khảo từ tìm kiếm google.
Sơ đồ giao thoa
Giao diện động cơ DC với vi điều khiển 8051
Hãy giao diện động cơ DC với vi điều khiển AT89S52 và điều khiển tốc độ động cơ DC bằng cách sử dụng Chuyển đổi tăng tốc và Chuyển đổi giảm tốc độ kết nối với cổng và hướng vi điều khiển bằng cách sử dụng công tắc Direction.
Chúng tôi sẽ sử dụng IC điều khiển động cơ L293D để điều khiển chuyển động của động cơ DC theo cả hai hướng. Nó có ổ động cơ H-bridge trong xây dựng.
- Như thể hiện trong hình trên chúng tôi đã kết nối hai công tắc chuyển đổi trên P1.0 và P1.1 pin của vi điều khiển AT89S52 để thay đổi tốc độ của động cơ DC bằng 10%.
- Một công tắc ở chốt P1.2 điều khiển hướng xoay động cơ.
- Các chốt P1.6 và P1.7 được sử dụng làm chân điều khiển hướng đầu ra. Nó cung cấp điều khiển cho chân đầu vào motor1 của động cơ L293D điều khiển động cơ xoay theo chiều kim đồng hồ và ngược chiều kim đồng hồ bằng cách thay đổi cực phân cực của thiết bị đầu cuối.
- Và tốc độ của động cơ DC được thay đổi thông qua PWM Out pin P2.0.
- Ở đây chúng tôi đang sử dụng bộ đếm thời gian của AT89S52 để tạo PWM.
Chương trình
#include <reg52.h>
#include <intrins.h>
/* Define value to be loaded in timer for PWM period of 20 milli second */
#define PWM_Period 0xB7FE
sbit PWM_Out_Pin = P2^0; /* PWM Out Pin for speed control */
sbit Speed_Inc = P1^0; /* Speed Increment switch pin */
sbit Speed_Dec = P1^1; /* Speed Decrement switch pin */
sbit Change_Dir = P1^2; /* Rotation direction change switch pin */
sbit M1_Pin1 = P1^6; /* Motor Pin 1 */
sbit M1_Pin2 = P1^7; /* Motor Pin 2 */
unsigned int ON_Period, OFF_Period, DutyCycle, Speed;
/* Function to provide delay of 1ms at 11.0592 MHz */
void delay(unsigned int count)
{
int i,j;
for(i=0; i<count; i++)
for(j=0; j<112; j++);
}
void Timer_init()
{
TMOD = 0x01; /* Timer0 mode1 */
TH0 = (PWM_Period >> 8);/* 20ms timer value */
TL0 = PWM_Period;
TR0 = 1; /* Start timer0 */
}
/* Timer0 interrupt service routine (ISR) */
void Timer0_ISR() interrupt 1
{
PWM_Out_Pin = !PWM_Out_Pin;
if(PWM_Out_Pin)
{
TH0 = (ON_Period >> 8);
TL0 = ON_Period;
}
else
{
TH0 = (OFF_Period >> 8);
TL0 = OFF_Period;
}
}
/* Calculate ON & OFF period from PWM period & duty cycle */
void Set_DutyCycle_To(float duty_cycle)
{
float period = 65535 - PWM_Period;
ON_Period = ((period/100.0) * duty_cycle);
OFF_Period = (period - ON_Period);
ON_Period = 65535 - ON_Period;
OFF_Period = 65535 - OFF_Period;
}
/* Initially Motor Speed & Duty cycle is zero and in either direction */
void Motor_Init()
{
Speed = 0;
M1_Pin1 = 1;
M1_Pin2 = 0;
Set_DutyCycle_To(Speed);
}
int main()
{
EA = 1; /* Enable global interrupt */
ET0 = 1; /* Enable timer0 interrupt */
Timer_init();
Motor_Init();
while(1)
{
/* Increment Duty cycle i.e. speed by 10% for Speed_Inc Switch */
if(Speed_Inc == 1)
{
if(Speed < 100)
Speed += 10;
Set_DutyCycle_To(Speed);
while(Speed_Inc == 1);
delay(200);
}
/* Decrement Duty cycle i.e. speed by 10% for Speed_Dec Switch */
if(Speed_Dec == 1)
{
if(Speed > 0)
Speed -= 10;
Set_DutyCycle_To(Speed);
while(Speed_Dec == 1);
delay(200);
}
/* Change rotation direction for Change_Dir Switch */
if(Change_Dir == 1)
{
M1_Pin1 = !M1_Pin1;
M1_Pin2 = !M1_Pin2;
while(Change_Dir == 1);
delay(200);
}
}
}
Code mô phỏng
No comments:
Post a Comment