Thứ Năm, 29 tháng 11, 2018

Giao tiếp động cơ DC

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

Sơ đồ

Giao diện PIC với động cơ DC
PIC18F4550 với động cơ DC

Thí dụ

Ở đây, chúng ta sẽ giao diện động cơ DC với vi điều khiển PIC18F4550. Trong đó chúng tôi sẽ điều khiển tốc độ động cơ DC bằng cách sử dụng POT kết nối với ADC của PIC18F4550 và hướng bằng cách sử dụng công tắc.
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 1KΩ Potentiometer tại ADC kênh 0 của PIC18F4550 để thay đổi tốc độ của động cơ DC.
  • Một công tắc chuyển đổi được kết nối với chân INT0 điều khiển hướng xoay động cơ.
  • PORTD được sử dụng như một cổng tín hiệu điều khiển đầu ra. Nó cung cấp điều khiển cho chân đầu vào motor1 của trình điều khiển động cơ L293D xoay động cơ 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.
Các bước lập trình
  • Kích hoạt ADC và ánh xạ đầu ra của nó vào khoảng 0-255.
  • Bật ngắt toàn cầu, ngắt ngoài INT0 với chế độ kích hoạt cạnh tăng lên.
  • Đặt chế độ PWM.
  • Vary Duty cycle với giá trị ADC và trong một thường trình ngắt, chúng ta đang chuyển đổi hướng động cơ.
  • Bây giờ liên tục kiểm tra ngắt cho hướng và đọc giá trị ADC để điều khiển tốc độ.
  • Một công tắc sẽ tạo ra gián đoạn gây ra thay đổi theo hướng động cơ.

Chương trình

/*
 * DC Motor Speed & Direction control using PIC18F4550
 */


#include <math.h>
#include <stdio.h>
#include <pic18f4550.h>
#include "ADC_Header_File.h"
#include "Configuration_header_file.h"

#define MINTHR              8000
#define RESOLUTION          488

#define InternalOsc_8MHz    8000000
#define InternalOsc_4MHz    4000000
#define InternalOsc_2MHz    2000000
#define InternalOsc_1MHz    1000000
#define InternalOsc_500KHz  500000
#define InternalOsc_250KHz  250000
#define InternalOsc_125KHz  125000
#define InternalOsc_31KHz   31000

#define Timer2Prescale_1    1
#define Timer2Prescale_4    4
#define Timer2Prescale_16   16

void MSdelay(unsigned int val)
{
 unsigned int i,j;
 for (i=0; i<=val; i++)
     for (j=0; j<165; j++); /* Delay count for 1ms for 8MHz freq. */
}

void PWM_Init()             /* Initialize PWM */
{
    TRISCbits.TRISC1 = 0;   /* Set CCP2 pin as output for PWM out */
    CCP2CON = 0x0C;         /* Set PWM mode */
}

int setPeriodTo(unsigned long FPWM)/* Set period */
{
    int clockSelectBits, TimerPrescaleBits;
    int TimerPrescaleValue;
    float period;
    unsigned long FOSC, _resolution = RESOLUTION;

    if (FPWM < MINTHR)    {TimerPrescaleBits = 2; TimerPrescaleValue = Timer2Prescale_16;}
    else                  {TimerPrescaleBits = 0; TimerPrescaleValue = Timer2Prescale_1;}

    if (FPWM > _resolution)               {clockSelectBits = 7; FOSC = InternalOsc_8MHz;}
    else if (FPWM > (_resolution >>= 1))  {clockSelectBits = 6; FOSC = InternalOsc_4MHz;}
    else if (FPWM > (_resolution >>= 1))  {clockSelectBits = 5; FOSC = InternalOsc_2MHz;}
    else if (FPWM > (_resolution >>= 1))  {clockSelectBits = 4; FOSC = InternalOsc_1MHz;}
    else if (FPWM > (_resolution >>= 1))  {clockSelectBits = 3; FOSC = InternalOsc_500KHz;}
    else if (FPWM > (_resolution >>= 1))  {clockSelectBits = 2; FOSC = InternalOsc_250KHz;}
    else if (FPWM > (_resolution >>= 1))  {clockSelectBits = 1; FOSC = InternalOsc_125KHz;}
    else                                  {clockSelectBits = 0; FOSC = InternalOsc_31KHz;}

    period = ((float)FOSC / (4.0 * (float)TimerPrescaleValue * (float)FPWM)) - 1.0;
    period = round(period);

    OSCCON = ((clockSelectBits & 0x07) << 4) | 0x02;
    PR2 = (int)period;
    T2CON = TimerPrescaleBits;
    TMR2 = 0;
    T2CONbits.TMR2ON = 1;  /* Turn ON Timer2 */
    return (int)period;
}

void SetDutyCycleTo(float Duty_cycle, int Period)/* Set Duty cycle for given period */
{
    int PWM10BitValue;
    
    PWM10BitValue = 4.0 * ((float)Period + 1.0) * (Duty_cycle/100.0);
    CCPR2L = (PWM10BitValue >> 2);
    CCP2CON = ((PWM10BitValue & 0x03) << 4) | 0x0C;
}

void External_Interrupt_Init()
{
    TRISBbits.TRISB0=1;  /* Make INT0 pin as an input pin*/

    /* Also make PBADEN off in Configuration file or
    clear ADON in ADCON0 so as to set analog pin as digital*/
  
    INTCON2 = 0x40;          /* Set Interrupt on Rising Edge*/
    INTCONbits.INT0IF = 0; /* Clear INT0IF flag*/
    INTCONbits.INT0IE = 1; /* Enable INT0 external interrupt*/
    INTCONbits.GIE = 1;  /* Enable Global Interrupt*/
}
void interrupt ISR()
{   
    LATD0 = ~LATD0;          /* Change direction of DC Motor */
    LATD1 = ~LATD1;
    MSdelay(300);
    INTCONbits.INT0IF=0;
}

void main(void)
{
    float Duty_Scale;
    int Period;
    
    TRISD = 0x00;            /* PORTD as output */
    LATD0 = 0;               /* Initial Direction */
    LATD1 = 1;
    ADC_Init();
    PWM_Init();              /* Initialize PWM */
    External_Interrupt_Init();
    Period = setPeriodTo(10000);/* 10KHz PWM frequency */
    /* Note that period step size will gradually increase with PWM frequency */
    while(1)
    {
        Duty_Scale = (((float)(ADC_Read(0)/4.0))/2.55); /* Scale Duty Cycle */
        SetDutyCycleTo(Duty_Scale, Period);
    }
}

Code

Không có nhận xét nào:

Đăng nhận xét