본문 바로가기
메카넘 휠 로봇

마이크로 컨트롤러 V의 555 타이머 - 모터 속도 컨트롤러 대결

by 모빌리티키즈 2024. 9. 30.
728x90
반응형

마이크로컨트롤러 V와 555 타이머를 이용한 모터 속도 제어 방법을 비교해 보겠습니다.

1. 마이크로컨트롤러 V

  • 장점:
    • 프로그래밍 가능: 다양한 제어 알고리즘을 구현할 수 있음.
    • 고급 기능: PWM(펄스 폭 변조) 제어를 통해 정밀한 속도 조절 가능.
    • 입출력 핀 수가 많아 다양한 센서와 액추에이터 연결 가능.
    • 통신 기능(예: UART, I2C)으로 다른 장치와의 연결 용이.
  • 단점:
    • 복잡한 회로 설계가 필요할 수 있음.
    • 프로그래밍 및 디버깅에 시간이 소요될 수 있음.

2. 555 타이머

  • 장점:
    • 간단한 회로: 저렴하고 쉽게 구성 가능.
    • 신뢰성: 아날로그 회로로서 고장율이 낮음.
    • 빠른 응답 속도: 즉각적인 반응이 요구되는 애플리케이션에 적합.
  • 단점:
    • 기능 제한: 복잡한 제어 알고리즘 구현이 불가능.
    • 속도 조절의 정밀도가 떨어질 수 있음.
    • 고급 기능(예: PID 제어 등)을 구현하기 어려움.

프로젝트를 위해 간단한 DC 모터 속도 컨트롤러가 자주 필요합니다. 일반적으로 이러한 컨트롤러는 마이크로 컨트롤러, PLC 또는 기타 제어 장치에서 나올 수 있는 0-5V 아날로그 신호에 의해 구동됩니다. 전용 칩, 마이크로 컨트롤러 또는 아날로그 회로를 사용하는 등 속도 컨트롤러를 구축하는 방법에는 여러 가지가 있습니다.

이러한 속도 컨트롤러는 수동으로 작동되는 전위차계를 사용하여 모터 속도를 제어하는 간단한 수동 속도 컨트롤러와 다릅니다.

하드웨어 해킹 커뮤니티에서는 누군가가 마이크로 컨트롤러로 간단한 것을 만들 때 흔히 하는 말이 있습니다: '그냥 555를 사용할 수도 있었을 텐데!'. 이 프로젝트는 555를 사용해야 하는가에 대한 질문을 탐구하고자 합니다.

이 Instructable에서는 간단한 555 기반 DC 모터 속도 컨트롤러와 이에 상응하는 마이크로 컨트롤러 기반 버전을 모두 구축 할 것입니다. 그런 다음 프로젝트가 끝날 때 각 디자인의 강점과 약점을 비교합니다.

마이크로 컨트롤러의 경우 Arduino가 아닌 PIC 마이크로 컨트롤러를 사용하기로 결정했습니다. 저는 Arduino 마이크로 컨트롤러 시스템을 좋아하며 프로토타이핑 및 실험을 위한 완벽한 플랫폼이라고 생각합니다. 그러나 C 언어로 프로그래밍된 PIC 마이크로 컨트롤러를 사용하면 전문 임베디드 시스템 설계와 관련된 내용을 보다 자세히 보여줄 수 있습니다. MPLAB IDE와 함께 PIC를 사용하면 Arduino 시스템을 사용할 때 숨겨져 있는 임베디드 설계의 모든 영역을 이해하는 데 도움이 됩니다.

이 프로젝트는 이미 기본 전자 장치와 Arduino를 실험했으며 이제 전자 설계를 보다 고급 수준으로 끌어올릴 준비가 된 사람들을 대상으로 합니다.

공급

다음은 각 속도 컨트롤러를 만드는 데 사용한 모든 구성 요소와 도구 목록입니다.

 

555 기반 모터 속도 컨트롤러 PCB

1 × NE555 IC

1 × LM358 연산 증폭기

4 × 1N4001 다이오드

1 × IRFZ44 MOSFET

1 x 2N3906 PNP 트랜지스터

4 × 1K 저항기 0.25W

1 × 2.2K 저항기 0.25W

1 × 4.7K 저항기 0.25W

1 × 10K 저항기 0.25W

1 × 100nF 커패시터

2 × 5K 저항기 0.25W

1 × LM7805 전압 레귤레이터

1 × 0.33uF 전해 커패시터

1 × 0.1uF 전해 커패시터

1 × 3 핀 남성 HeaderPins

2 × 2방향 나사 단자 5.08mm 피치

1 × 3방향 스크류 터미널 5.08 피치

1 × PCB

 

마이크로 컨트롤러 기반 모터 속도 컨트롤러 PCB

1 x PIC12F1840 마이크로 컨트롤러

3 × 1K 저항기 0.25W

2 × 5K 저항기 0.25W

1 × 10K 저항기 0.25W

1 × LM7805 전압 레귤레이터

1 × 0.33uF 전해 커패시터

1 × 0.1uF 전해 커패시터

1 × 3 핀 남성 HeaderPins

2 × 2방향 나사 단자 5.08mm 피치

1 × 3방향 스크류 터미널 5.08 피치

1 × 100nF 커패시터

1 x 2N3904 NPN 트랜지스터

 

둘 다에 대해

1 x DC 모터

1x 9V 배터리 및 홀더

 

도구, 소모품 및 장비

납땜

땜납

솔더 플럭스

납땜 연기 추출기

핀셋

전자 절단기

확대경

랩톱

Microchip MPLAB X IDE (버전 6.15 사용)

시그널 제너레이터

1단계: 마이크로 컨트롤러 PCB 설계

마이크로 컨트롤러와 555 기반 DC 모터 속도 컨트롤러 간의 비교를 공정하게 유지하기 위해 555 타이머와 동일한 설치 공간을 가진 마이크로 컨트롤러, 8핀 DIP(Dual Inline Package)를 사용하기로 결정했습니다.

마이크로 컨트롤러 PCB는 특히 PIC12F1840 마이크로 컨트롤러의 내부 클럭을 사용하여 구성 요소 수를 가능한 한 낮게 유지했기 때문에 매우 단순한 디자인입니다.

이 PCB의 핵심 구성 요소는 다음과 같습니다.

  1. PCB는 9V 배터리로 구동됩니다. 9V는 양극 모터 모터 단자에 직접 연결되어 모터에 전원을 공급합니다. 9V는 LM7805 선형 레귤레이터를 통해 5V로 감소하여 마이크로 컨트롤러에 전력을 공급합니다.
  2. 0-5V 신호 전압은 마이크로 컨트롤러(RA0)의 핀 7로 직접 연결되지만 전압 분배기(R1 및 R2)에 의해 절반으로 감소하는 0-10V 신호를 사용할 수 있는 경우. 사용하려는 신호 전압에 따라 중간 핀을 점퍼 커넥터로 연결하는 3개의 헤더 핀이 있습니다.
  3. 마이크로 컨트롤러의 출력은 NPN 트랜지스터를 구동하는 데 사용되며, 이는 다시 모터에 공급되는 전력을 제어하는 MOSFET을 구동하는 데 사용됩니다.

2단계: 마이크로 컨트롤러 코드

 

Microchip MPLAB X IDE를 사용하여 C에서 PIC12F1840 Microcontroller의 코드를 작성했습니다. MPLAB X IDE는 프로그래머의 더 많은 입력이 필요하다는 점을 제외하고는 Arduino IDE와 유사합니다(예: MPLAB을 사용하여 구성 비트를 설정해야 하는 반면 Arduino에서 수행됨). 다음은 코드 작동 방식에 대한 자세한 설명입니다.

구성 비트 설정 - 이 섹션에는 마이크로 컨트롤러의 작동 특성을 정의하는 구성 비트 설정이 포함되어 있습니다. 이 비트는 클럭 선택, 전원 켜기 동작, 워치독 타이머 등과 같은 하드웨어 기능을 구성합니다. 이것은 Arduino를 사용할 때 수행되는 마이크로 컨트롤러 프로그래밍의 핵심 영역 중 하나입니다.

 
// CONFIG1
#pragma config FOSC = INTOSC // Internal oscillator selected (no external oscillator).
#pragma config WDTE = OFF // Watchdog Timer is disabled to prevent unintended resets.
#pragma config PWRTE = OFF // Power-up Timer is disabled (short startup time).
#pragma config MCLRE = OFF // MCLR pin functions as a digital input, not a reset pin.
#pragma config CP = OFF // Code protection is disabled (allows reading of program memory).
#pragma config BOREN = OFF // Brown-out Reset is disabled, so the device won't reset on low voltage.
#pragma config CLKOUTEN = OFF // CLKOUT function is disabled (the pin can be used as I/O).
#pragma config IESO = OFF // No switching between internal and external oscillators.
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor is disabled.
// CONFIG2
#pragma config WRT = OFF // Flash memory is not write-protected.
#pragma config PLLEN = OFF // 4x PLL (Phase Locked Loop) is disabled (not needed for 16 MHz).
#pragma config STVREN = OFF // Stack Overflow/Underflow will not cause a reset.
#pragma config BORV = LO // Low trip-point for Brown-out Reset Voltage.
#pragma config LVP = OFF // Low-Voltage Programming is disabled (high voltage is required for programming).

헤더 파일 추가 - 이 줄에는 XC8 컴파일러의 헤더 파일이 포함되어 있으며, PIC 마이크로 컨트롤러의 레지스터 및 하드웨어 기능과 함께 작동하기 위한 정의와 기능을 제공합니다.

#include <xc.h>

 

클럭 주파수 및 ADC 샘플 정의 설정 - _XTAL_FREQ는 __delay_ms()와 같은 함수에서 지연 계산에 사용됩니다. ADC_SAMPLES는 ADC를 읽을 때 평균을 낼 ADC 샘플의 수를 정의하는 데 사용됩니다(안정성을 위해).

#define _XTAL_FREQ 16000000 // 16MHz에서 내부 발진기의 클럭 주파수를 정의합니다.
#define ADC_SAMPLES 16 // ADC 판독값을 평균화할 때 취할 샘플의 수를 정의합니다.

 

함수 프로토타입 설정 - 나중에 코드에서 사용할 함수를 선언하는 함수 프로토타입입니다. 이렇게 하면 코드를 구성하고 실제 정의보다 먼저 함수를 호출할 수 있습니다.

 
void initADC(void);
void initPWM(void);
unsigned int readADC(void);
void setPWMDutyCycle(unsigned int duty);

main 함수입니다.

main() 함수는 ADC 및 PWM 모듈을 초기화합니다.

main() 함수 내부의 while(1) 루프("1" 값은 true를 의미) 루프는 아날로그 입력 AN0에서 ADC 값을 지속적으로 읽은 다음 이 값을 기반으로 PWM 듀티 사이클을 설정하여 해당 PWM 출력 신호를 생성합니다. 또한 ADC 판독값을 안정화하기 위한 짧은 지연이 있습니다.

 
void main(void) {
initADC(); // Initialize the ADC for analog input.
initPWM(); // Initialize the PWM for generating the pulse width signal.
OSCCON = 0x78; // Set the internal oscillator to 16 MHz.
while (1) {
unsigned int adcValue = readADC(); // Read ADC value from AN0.
setPWMDutyCycle(adcValue); // Adjust PWM duty cycle based on ADC value.
__delay_ms(10); // Small delay to stabilize the readings.
}
}

ADC 초기화입니다.

이 기능은 아날로그-디지털 변환기(ADC)를 구성합니다.

  1. ADC를 활성화하고 채널 AN0(RA0)을 선택합니다.
  2. 변환할 클럭 소스를 구성하고 결과를 오른쪽으로 정렬합니다.
  3. RA0을 아날로그 입력으로 설정합니다.

코드의 이 섹션에서는 일반적으로 Arduino 프로그래밍을 통해 숨겨져 있는 마이크로 컨트롤러 프로그래밍의 또 다른 핵심 영역인 레지스터로 직접 작업하고 있음을 알 수 있습니다.

 
void initADC(void) {
ADCON0 = 0x01; // Enable ADC and select AN0 (RA0) as input channel.
ADCON1 = 0x80; // Set conversion clock (Fosc/8), result is right-justified.
ANSELAbits.ANSA0 = 1; // Set RA0 as an analog input (AN0).
TRISAbits.TRISA0 = 1; // Configure RA0 as input.
}

PWM 초기화.

이 함수는 PWM(펄스 폭 변조)을 초기화합니다.

  1. RA2를 출력으로 구성합니다.
  2. PWM 모듈을 구동하는 Timer2를 설정하고 16x 프리 스케일러로 CCP1 모듈을 PWM 모드로 구성합니다.
  3. 듀티 사이클을 0으로 초기화합니다.
 
void initPWM(void) {
TRISAbits.TRISA2 = 0; // Set RA2 as output (used for CCP1 pin for PWM).
PR2 = 0xFF; // Set Timer2 period register to 0xFF, determining the PWM frequency.
CCPR1L = 0x00; // Initialize duty cycle to 0.
CCP1CON = 0x0C; // Set CCP1 module to PWM mode.
T2CON = 0x06; // Enable Timer2 with a 1:16 prescaler.
}

ADC(Analog to Digital Convertor) 값을 읽습니다.

이 함수는 AN0에서 ADC 값을 읽습니다.

  1. 변환을 시작하고 완료 될 때까지 기다립니다.
  2. 결과는 두 개의 8비트 ADC 결과 레지스터(ADRESH 및 ADRESL)에서 10비트 결과로 결합됩니다.
  3. 반환된 값은 반전(1023 - 결과)되며, 이는 더 높은 입력 전압이 더 낮은 디지털 결과를 제공한다는 것을 의미합니다.
unsigned int readADC(void) {
__delay_us(5); // Wait for the acquisition time.
ADCON0bits.GO_nDONE = 1; // Start the ADC conversion.
while (ADCON0bits.GO_nDONE); // Wait until conversion is complete.
return (unsigned int)((1023-((ADRESH << 8) + ADRESL))); // Return the 10-bit ADC result.
}

 

ADC(Analog to Digital Converteror) 값 읽기 - 평균화의 대안

이것은 ADC를 읽기 위한 대체 기능으로, 더 부드럽고 안정적인 값을 얻기 위해 평균 16개의 샘플을 얻습니다. 현재 주석 처리되어 있지만 더 많은 정밀도가 필요한 경우 단일 읽기 readADC() 함수로 교체할 수 있습니다.

// Function to read the ADC value from AN0 and average it over 16 values for smoothing
//unsigned int readADC(void) { //
//unsigned long sum = 0;
//for (int i = 0; i < ADC_SAMPLES; i++) {
//__delay_us(5); // Acquisition time
//ADCON0bits.GO_nDONE = 1; // Start conversion
//while (ADCON0bits.GO_nDONE); // Wait for conversion to complete
//sum += ((ADRESH << 8) + ADRESL); // Accumulate the ADC result
//}
//return (unsigned int)(1023-(sum / ADC_SAMPLES)); // Return the averaged result and reverse it
//}

 

PWM 값 설정

이 최종 기능은 ADC 판독값을 기반으로 PWM의 듀티 사이클을 설정합니다.

  1. 10비트 ADC 결과는 8비트 CCPR1L 레지스터에 맞도록 축소된다.
  2. 나머지 2비트는 듀티 사이클을 보다 세밀하게 제어하기 위해 CCP1CON의 DC1B 비트에 설정됩니다.

 

 
void setPWMDutyCycle(unsigned int duty) {
unsigned int pwmValue = (duty >> 2) & 0xFF; // Scale down the 10-bit ADC result to 8 bits.
CCPR1L = pwmValue; // Set the 8 MSBs of the PWM duty cycle.
CCP1CONbits.DC1B = duty & 0x03; // Set the 2 LSBs of the PWM duty cycle.
}

코드가 작성되면 PIC Kit 3 프로그래밍 도구를 사용하여 MCU(Microcontroller)에 코드를 업로드했습니다. 이 작업이 어떻게 수행되는지 보여주는 비디오를 포함했습니다.

직접 사용하고 싶다면 코드 사본을 첨부했습니다.

단계 3: 555 PCB 설계

 

이 회로는 실제로 2단계로 생각할 수 있습니다. 스테이지 1은 선형 램프 생성기(톱니파)이고 스테이지 2는 PWM 출력을 DC 모터에 제공하는 비교기 스테이지입니다.

1단계 - 선형 램프 생성기(Sawtooth Wave)

이 단계에서 555 회로는 톱니파 발생기를 기반으로 합니다. 톱니파는 PNP 트랜지스터를 통해 커패시터를 충전하여 생성되며, 이로 인해 커패시터가 선형 충전됩니다(트랜지스터를 통과하여 정전류원). 저항기와 커패시터의 값을 변경하여 톱니파 출력의 주파수를 변경할 수 있습니다.

커패시터가 PNP 트랜지스터를 통해 충전되면 555 공급 전압의 2/3에 도달합니다. 2/3 공급 전압에 도달하면 555의 임계 전압이 활성화되어 커패시터가 555의 내부 트랜지스터를 통해 방전됩니다.

555의 제어 핀은 555의 출력에 연결되어 톱니파의 바닥이 약 0.2V인 0볼트에 가깝게 내려갑니다.

 

2단계 - PWM 출력 단계

톱니파가 생성되면 톱니파는 비교기에 사용되는 연산 증폭기에 공급됩니다. LM358 연산 증폭기는 두 개의 입력 전압을 비교하여 비교기로 작동합니다. 톱니파는 반전 입력(-)으로 공급되고 0-5V 신호는 반전되지 않는 입력(+)으로 공급됩니다. 0-5V는 Op Amp에 들어가기 전에 전압 분배기를 통해 0-3.3V로 감소합니다. LM358 비반전 입력(+)이 반전 입력(-)보다 높으면 출력이 하이가 됩니다. 반전 입력(-)이 높으면 출력이 낮아지고 출력은 구형파가 됩니다. 신호 전압은 Op Amp의 출력이 얼마나 높은지를 제어합니다. 톱니파의 전압이 증가함에 따라 이 시점에서 신호 전압보다 클 때까지 증가합니다. 이 시점에서 출력이 꺼집니다. 이 시점에서 LM358 출력의 폭은 신호 전압에 반비례합니다.

연산 증폭기의 출력은 IRFZ44 MOSFET을 구동합니다. 모터 양극 단자는 항상 양극 전압(내 설계에서는 9V)에 연결되며 MOSFET이 켜지면 다른 모터 단자를 접지에 연결하여 모터 코일을 통해 전류가 흐를 수 있습니다.

회로의 시뮬레이션을 보려면 비디오를 참조하십시오.

4단계: 테스트

 
 

두 속도 컨트롤러를 모두 테스트하기 위해 신호 발생기를 사용했습니다. 제가 사용하는 신호 발생기는 산업 제어를 설정하거나 테스트하기 위해 설계되었으며 산업 제어에 사용되는 표준 제어 신호인 0-5V, 0-10V, 0-20mA 및 4-20mA를 제공하도록 설정할 수 있습니다. 두 회로를 모두 테스트하기 위해 0-5V 설정을 사용했습니다.

테스트 목적으로 간단한 취미용 기어 모터를 사용했지만 사용한 MOSFET의 크기 때문에 회로는 훨씬 더 큰 모터를 처리하는 케이블이 될 것입니다.

두 회로 모두 예상대로 잘 작동했으므로 속도 컨트롤러가 작동하는 것을 보려면 두 비디오를 살펴보십시오.

5 단계 : 결론

DC 모터 속도 제어를 위한 두 PCB를 비교하자면 마이크로 컨트롤러 버전은 하드웨어 관점에서 훨씬 더 간단하고 555 버전은 소프트웨어 측면에서 훨씬 더 간단하다고 말할 수 있습니다. 그렇긴 하지만, 필자는 소프트웨어를 개발하기 위해 Arduino IDE를 사용했다면 거의 쉬웠을 것이다.

ATiny85와 같은 Arduino 호환 8핀 DIP 칩으로 이 프로젝트를 수행하고 Arduino 플랫폼을 사용한 경우 프로젝트는 하드웨어 및 소프트웨어에 대해 매우 간단할 것입니다. 그러나 당신은 많은 것을 배우지 않을 것입니다!

555 PCB는 설치 공간이 더 크다는 단점이 있어 더 큰 인클로저 등이 필요한 연쇄 효과가 있습니다. 하지만 즉석에서 주파수를 간단히 조정할 수 있다는 점이 마음에 듭니다.

상용 속도 컨트롤러를 개발한다면 작은 PCB 설치 공간과 표시기 LED 등과 같은 추가 주변 장치를 추가할 수 있는 옵션으로 마이크로 컨트롤러 경로를 선택할 가능성이 큽니다.

결론적으로 가장 중요한 것은 특정 프로젝트에 가장 적합한 기술을 사용하는 것이며, 이는 개별 기술, 리소스 가용성(예: 도구 및 재료) 또는 단순히 개인 취향에 따라 달라질 수 있습니다.

두 IC가 싸우는 것을 보여주는 작품에 대해 딸에게 큰 감사를드립니다!

728x90
반응형