티스토리 뷰

전자회로/AVR

BLDC 모터 컨트롤러 - 1

쥬브62 2020. 3. 13. 01:53

부품선정

BLDC 모터 :https://www.motorbank.co.kr/product/%EB%8B%88%EB%8D%B1-%EA%B3%A0%EC%86%8D-bldc%EB%AA%A8%ED%84%B0-bl4252-1262-dc12v/6513/category/207/display/1/

 

공부한 것

1. atmega128에 대한 이해

 

-포트(내가 사용한 것 정리)

포트A(PA7~PA0) : 16 BY 2 LCD
포트B(PB0 : SW1, PB1 : SW2, PB2 : SW3, PB3 : SW4, PB5 : UH, PB6 : VH, PB7 : WH) : 스위치와 IR2101의 HIN
포트C(PC7 : LCD_RS, PC6 : LCD_E, PC5 : LCD_RW) : LCD(레지스터 선택, 레지스터에 쓰기, 읽기/쓰기 모드 선택)
포트D(PD0 : UL, PD1 : VL, PD2 : WL) : IR2101의 LIN
포트E(PE0 : RXD, PE1 : TXD, PE3 : HU, PE4 : HV, PE5 : HW) : ISP 데이터 입/출력, BLDC 모터 HALL 센서
포트F(PF0 : ADC0, PF1: ADC1) : 전류 센싱과 PWM 제어(이건 차후에 진행)
포트G(PG3 : BUZZER) : 버져

 

- AVR 포트의 레지스터는 3종류가 있다.

입력 레지스터 PINx : 초기값은 N/A, 핀에 걸려있는 값이 계속 갱신되므로 초기값을 줄 필요가 없다.

출력 레지스터 PORTx : 초기값이 0이고, 0이면 내부 풀업저항 사용안함, 1이면 풀업저항 사용.

  사용법 : DDRA = 0x0F; PORTA |= 0xF0;  // 포트 A상위 니블을 스위치입력으로 사용하고 하위니블은 LED출력, 포트A 상위니블은 풀업저항 사용.

입출력 방향 설정 레지스터 DDRx : 초기값이 0이고, 0이면 입력, 1이면 출력으로 사용

 

- 내부 풀업저항

Rpu(입출력 풀업저항) : 20k~50k, enable or disable 가능

Rrst(리셋 풀업저항) : 30k~60k, /RESET에 항상 연결 되있음

Rpen(펜 풀업저항) : 30k~60k, /PEN에 항상 연결 되있음

 

신호선의 임피던스가 클수록 노이즈에 약함. 그러나 임피던스가 낮으면 노이즈에 강하나 전류가 증가해서 소모전류가 증가하여 신호 레벨을 방해함.

 

I2C 통신의 풀업저항 : 풀업이나 풀다운 저항은 적절한 신호 레벨을 만들기 위해 적당한 크기의 저항값을 사용해야 함, 일반적으로 /RESET에는 외부 풀업저항(10k정도?)을 추가하고 GND방향으로 커패시터를 사용하여 전원투입시 리셋 신호 지연회로로 사용함.

 

-  128의 경우 포트F는 입력은 비트조작이 되고 출력은 안된다. 포트G는 입출력 모두 비트조작이 안된다.

 

- 포트핀에 전류가 40mA를 넘지 말아야 한다. mcu 전체에도 400mA를 넘지 말아야 한다.

 

- 발열이 나면 온도가 올라가 사용가능한 전류가 줄어들게 된다. MCU 최대 전류에 주의 해야 함.

 

- 내부 풀업 저항을 사양해도 되나 선이 길어지게 되면 노이즈에 취약해진다.( 그럴땐 외부 풀다운 저항(내부 풀업저항 사용 설정x) or 외부 풀업 저항 사용(설정하든 안하든 상관 없음) ), 보통 10k사용이지만 선이 길어지면 더 작은 값 사용

 

- 스위치에는 채터링 방지용으로 커패시터를 병렬로 달아 준다(접촉이 좋은 스위치는 0.1uF, 그렇지 않은 경우는 10uF)

 

- 스위치에 댐핑저항(오버슛이나 언더슛 잡아줌)을 사용할시에는 외부풀업저항이든 외부풀다운저항이든 내부 풀업저항을 사용하면 안된다.

 

- ~ : 비트반전 연산자, ! : 논리부정 연산자

 

- 마이크로프로세서는 특정 클럭에 동기화해서 동작한다. 동기가 되지 않은 상태에서 테이터를 주고 받다 보면 처리가 끝나지 않은 상태에서 다른 상황이 발생한다.

 

- bit set : ex) P1OUT |= (0x02 | 0x04 | 0x40) // 1과 or 시키니까 값이 무엇이든 1이 된다

  bit clear : ex) P2OUT &= ~(0x10 | 0x20); // 1의 반전인 0과 and 시키니까 값이 무엇이든 0이 된다.

  bit-XOR : ex)  P1OUT ^= (0x08 | 0x40)  // 0과 XOR하면 그대로, 1과 XOR하면 값이 반전 된다.

 

- #define문을 이용할 때 매크로 뒤에 있는 것이 단순한 수나 문자가 아닐 경우에는 괄호로 묶어주는 습관

 

- fusebit (이건 어려운데 나중에 혹시 모르니까 저장)

M103C  : ATmega103 호환 모드 사용 여부 설정(default 0 - 사용o)

WDTON : watchdog timer 기능 사용 여부 설정(default 1 - 사용x)

OCDEN : On-Chip Debug 기능 사용 여부 설정(default 1 - 사용x)

JTAGEN : JTAG 기능 사용 여부 설정 (default 0)

SPIEN : SPI 직렬 프로그램 기능 사용여부 설정(default 0) ,무조건 사용이니까 코드비젼 메뉴에도 없다

CKOPT : 오실레이터 옵션 설정(default 1)

BOOTSZ0, BOOTSZ1 : Boot Size 선택 (default 0)

BOOTRST : Reset Vector 선택 (default 1)

EESAVE : Chip erase를 해도 EEPROM 보존 기능 사용 여부 설정(default 1)

BODLEVER : Brown Out Detector 트리거 레벨 설정(default 1)

BODEN : Brown Out Detector 기능 사용여부 설정(default 1)

SUT0, SUT1 : Start-Up Time 선택(default 각각 0, 1)

CKSEL0~CKSEL3 : 클럭소스 선택 (default 각각 1, 0, 0, 0)

 

- RESET 회로 : MCU는 일정 시간 동안 RESET신호를 ACTIVE 시켜줘야 함. RC회로를 구성하여 해결

 

- BK AVR128

1) CLCD 

더보기

. E신호가 중요하다. 데이터및 기타 신호를 준비하고 tsu1시간 후에  E신호를 ↑ 시키고 E의 ↑부터 tw시간 후에 E를 ↓ 시키고 th1 시간후에 제어를 마치면 된다.

. VSS : 0V, VDD : +5V, V0 : lcd 밝기조정(10k가변저항), RS : L(명령입력) H(데이터 입력), R/W: L(쓰기) H(읽기), E : LCD 모듈의 허가신호 , D0~D7

 

. LCD 전원처리

 

. 레지스터

  .. IR(명령 레지스터) : LCD화면 클리어, 커서 시프트, 문자표시 ON/OFF 등 제어에 필요한 명령 저장. 표시데이터 RAM(DDRAM)의 위치주소와 문자 발생기 RAM(CGRAM)의 위치를 지정하기 위한 주소 정보를 저장

  .. DR(데이터 레지스터) : DR에 데이터를 쓰면 LCD의 내부적인 동작에 의해서 IR에 의해 지정된 DDRAM 또는 CGRAM의 주소로 전달. DR의 데이터를 읽으면 IR에 의해 지정된 DDRAM 또는 CGRAM의 주소 데이터가 MCU로 전달

  .. 레지스터 선택 : RS =0 R/W=0 IR을 선택하여 제어 명령 쓰기

RS=0 R/W=1 비지플래그(연속적으로 LCD 모듈에 제어명령이 입력될 때 LCD모듈이 이 명령을 처리 할 수 있는가를 나타내는 상태 표시 플래그, DB0~DB6으로 부터 읽음, BF=0 LCD모듈로 다음명령을 쓸 수 있음, BF=1 현재 IR로 입력된 명령어를 처리하고 있어서 다음 제어 명령을 쓸 수 없는 상태)

RS=1 R/W=0 DR을 선택하여 데이터 값을 쓰기(DR에서 DDRAM 또는 CGRAM으로)

RS=1 R/W=1 DR을 선택하여 데이터 값을 읽기(DDRAM 또는 CGRAM에서 DR로)

 

. 주소 카운터 : DDRAM과 CGRAM의 주소를 지정하는데사용, 주소 카운터의 값은 IR레지스터에 기록, 주소 정보는 IR레지스터에서 내부의 주소 카운터로 자동 전송되어 해당 주소 카운터의 값으로 SET, DDRAM 또는 CGRAM의 선택은 LCD명령에 의해서 결정, DDRAM또는 CGRAM에 데이터를 써 넣으면 주소 카운터는 모드에 따라서 자동으로 1씩 증가하거나 또는 1씩 감소함

 

. 표시데이터 RAM(DDRAM) : 문자위치에 따라 DDRAM 주소가 정해져 있다(LCD마다 다른듯), DDRAM은 화면에 표시할 8비트의 문자를 저장하는 곳

 

. 문자 발생기 ROM(CGROM) : 8비트 문자 패턴을 저장하고 있는 메모리

 

. 문자 발생기 RAM(CGRAM) : 사용자가 프로긂에 의해서 원하는 문자 패턴을 만들고자 할 때 사용하는 RAM영역

 

. LCD컨트롤러 명령

  .. 화면 클리어 : RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                       0     0     0      0     0      0      0      0     0      1

LCD의 전체 화면 표시를 클리어한 후 커서는 홈 위치로 돌아가게 함, 주소카운터(AC)를 00번지로 함

 

  .. 커서 홈 : RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                  0     0     0      0     0      0      0      0     1      *

DDRAM의 내용은 변경하지 않고 주소 카운터를 00으로 하여 커서만 홈위치로 보냄

 

  .. 엔트리 모드 세트 : RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                                 0      0      0       0      0       0       0      1      I/D     S

MCU가 LCD모듈에 데이터를 쓰기/읽기를 수행할 경우에 DDRAM을 왼쪽 또는 오른쪽으로 증가와 화면시프트의 여부를 결정.

I/D : 문자 코드를 DDRAM or CGRAM에 쓰거나 읽을 때 증감. I/D=1일 때, 주소를 +1시키고 커서 또는 블링크 위치가 우측 이동. I/D=0일 때, 주소를 -1시키고 커서 또는 블링크 위치가 좌측 이동

S : 커서의 위치를 자동으로 시프트 하는 기능. S=1 I/D=1 일때 DDRAM의 내용을 화면에 표시한 후 좌로 시프트. S=1 I/D=0일때 DDRAM의 내용을 화면에 표시한 후 우로 시프트. S=0 일때 시프트 되지 않음

 

  .. 화면 표시 ON/OFF : RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                                   0      0      0       0      0       0       1      D       C      B

화면의 ON/OFF, 커서의 ON/OFF, 커서 위치에 있는 문자의 점멸 등의 기능 설정

D : 화면 표시 결정. D=1이면 화면 ON. D=0이면 화면 OFF(데이터는 DDRAM에 있다)

C : 커서 표시 결정. C=1이면 커서 ON. C=0이면 커서 OFF

B : 커서 위치의 문자 점멸 결정. B=1이면 점멸 ON. B=0이면 점멸 OFF. 커서와 점멸 동시 설정 가능

 

  .. 커서표시 시프트 : RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                                0      0      0       0      0       1     S/C    R/L     *       *

DDRAM의 내용을 변경하지 않은 상태에서 커서를 움직이게 하고 글자가 표시되는 부분을 시프트하기 위한 명령.

S/C  R/L : 

0      0    커서 위치를 좌로 이동한다(AC 1 감소 )

0      1    커서 위치를 우로 이동한다(AC 1 증가)

1      0    표시 화면 전체를 좌로 이동

1      1    표시 화면 전체를 우로 이동

 

  .. 기능설정 : RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                   0     0     0      0      1     DL    N     F      *       *

LCD를 사용하기에 앞서 선행되어야 하는 명령으로 LCD를 어떠한 구성으로 사용하지를 결정함.

DL : 인터페이스 길이를 설정. DL=1이면 8비트 사용(DB7~DB0). DL=0이면 4비트 사용(DB7~DB4), 데이터를 2번 나누어 전송(상위 니블->하위 니블 순으로)

N    F : 표시행수   문자폰트   듀티비

0    0     1             5X7          1/8

0    1     1             5X10        1/11

1    *     2              5X7         1/16

 

  .. CGRAM 주소 설정 :  RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                                    0     0      0       1       A      A       A      A       A      A

먼저 CGRAM의 주소를 설정. 이후에 송수신 하는 데이터는 CGRAM의 데이터. DB5~DB는 주소설정. CGRAM에 새로운 문자를 생성할 경우 이 명령을 이용하여 번지를 지정하고 문자폰트를 CGRAM에 입력

 

  .. DDRAM 주소 설정 : RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                               0     0      1      A     A     A      A     A     A      A

먼저 DDRAM의 주소를 설정, 이후에 송수신 하는 데이터는 DDRAM의 데이터. DB6~DB0는 주소 설정.

N의 값에 따라 LCD라인의 주소가 결정됨, N=0이면 한개의 라인만 갖는 LCD, N=1이면 두개의 라인을 갖는 LCD

 

  .. 비지 플래그(BF) / 어드레스 읽기 : RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                                                 0     1     BF      A     A     A      A     A     A     A

이전에 받은 명령에 의해 모듈이 내부 동작 중인지를 알기 위해서 BF신호는 읽는 명령, BF=1 BUSY, BF=0 명령 수행 완료.

DB7은 BF, DB6~DB0은 AC값을 나타냄

이 명령이전에 설정된 RAM의 주소에 따라 CGRAM 또는 DDRAM의 AC를 읽을 수 있다

 

  .. CGRAM과 DDRAM으로 데이터 쓰기 : RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                                                      1     0     D      D     D     D     D     D     D      D

DB7~DB0의 문자를 AC가 지정하고 있는 주소에 기록.

IR 레지스터에 지정된 명령에 따라 CGRAM, DDRAM이 선택됨

주소는 엔트리 모드의 설정에 따라 자동으로 1씩 증가 또는 감소함

 

  .. CGRAM과 DDRAM으로부터 데이터 읽기 : RS  R/W  DB7  DB6  DB5  DB4  DB3  DB2  DB1  DB0

                                                            1     1     D      D     D     D     D     D     D      D

AC가 지정하고 있는 주소의 내용을 DB7~DB0에 기록

IR 레시터에 지정된 명령에 따라 CGRAM, DDRAM이 선택 됨

데이터를 읽기 전에 CGRAM 또는 DDRAM이 선택되지 않아씅면 읽기 동작이 무효

 

. LCD 인터페이스 회로

D0~D7(신호선) : ATmega128의 PORTA.0~PORTA.7의 데이터버스에 일대일로 연결

RS : 명령 레지스터인지 데이터 레지스터인지 구분하는 단자(나는 PORTC.7 사용)

R/W : 0이면 쓰기, 1이면 읽기(나는 PORTC.5 사용)

E : LCD 모듈 사용허가 단자(나는 PORTC.6 사용)

 

2) 타이머/카운터

  - 타이머는MCU의 내부클럭(clkI/O>분주기>clkT)을 이용하여 일정시간 간격의 펄스를 만들어 내거나 일정시간 경과 후에 인터럽트를 발생시키는 기능을 말한다.

  - 카운터는 외부 핀(TOSC1, TOSC2, T1, T2, T3)을 통해서 들어오는 펄스를 계수(Edge Detector)하여Event Counter로서 동작되는 것을 말한다. (펄스=사건, 카운터값=사건의 횟수)

 

  (1) 타이머/카운터 0

더보기

- TCCR0 (타이머/카운터 컨트롤 레지스터)

 

 . FOC0 : CTC 동작은 1, PWM 동작은 0

 .

  .. PB4(OC0) 핀은 두개의 PWM(Pulse width modulation)모드가 있고 펄스 출력할 수 있는 CTC(clear timer on compare match)모드가 있다.

  .. TOP : TCNTn의 최고값, TOP=0xFF이면 TCNTn이 0부터 0xFF까지 변하고 TOP=0CRn이면 TCNTn이 0부터 OCRn 값까지 변함

  .. Update of OCR0 : OCR0를 변경시 언제 OCR0 레지스터 값이 변경되는지 의미, PWM은 TOP(0xFF이나 BOTTOM(0x00)에서 갱신. 노말이나 CTC는 즉시 변경

  .. TOV0 Flag Set on : 오버플로우 인터럽트 플래그가 언제 set되는지 의미

 

- TCNT0 레지스터 : 프리스케일러에서 생성된 클럭을 제어로직에 따라 업/다운 카운팅(0x00~0xFF)을 수행

 

- OCR0(출력 비교 레지스터) : TCTN 값과 출력 비교하기 위한 8비트 값을 저장하고 있다. TCNTn과 같으면 OCFn을 세트시키고 출력비교 인터럽트를 요청, 출력핀 OCn은 0으로 클리어 된다.

 

 - TIFR (타이머/카운터 인터럽트 flag 레지스터)

  .. OCF0 : TCNT0와 OCR0의 값을 비교하여 같으면 OCF0는 1로 세트되고 출력비교 인터럽트를 요청. 인터럽트가 시작하면 자동적으로 클리어 된다.

  .. TOV0 : TCNTn이 업카운팅 하다가 0xFF에서 0x00으로(Fast PWM) 바뀌는 순간(오버플로우), TIFR레지스터의 TOV0비트가 세트가 되어 오버플로 인터럽트를 요청. TOV0비트가 세트되어 오버플로 인터럽트가 요청될 때 인터럽트를 발생시켜 OCRn의 값을 바꾸면 듀티비를 제어할 수 있다. OCRn=0x00일 때 듀티비는 1/256이며 OCRn=0xFF일때 100%가 된다.

 . TIFR레지스터는 소프트웨어적으로 강제로 클리어 하려면 1을 기록해야 한다. (????? 1로 세트가 되는데 1로 클리러를 한다고???? 무슨말이지??????)

 

- TIMSK (타이머/카운터 인터럽트 Mask 레지스터)

  .. OCIE0 : 1로 설정되면 타이머0의 출력비교 인터럽트 enable

  .. TOIE0 : 1로 설정되면 타이머0의 오버플로 인터럽트 enable

  .. 여기서 set되어 있지 않으면 TIFR레지스터에서 OCF0와 TOV0가 SET되어도 인터럽트는 발생하지 않는다.

 . TOV0 플래그에 의한 인터럽트 함수를 사용하고 싶으면 TOIE0 비트를 Set 시키면 되고, OCF0 플래그에 의한 인터럽트 함수를 사용하고 싶으면 OCIE0 비트를 Set 시키면 된다.

 

- CTC모드

  .. TCTN0가 0부터 증가하다가 0CR0 레시트와 값이 같아지면 TCNT0는 0부터 다시 증가. TCNT0=OCR0일때 OCF0와 TOV0가 SET된다. TIMSK레지스터를 설정하여 사용하고 싶은 인터럽트를 사용하면 된다.

  ..

  .. 출력주파수 f = fclk/ 2N /(1+OCR0), 토글출력이라서 2번 TOP에 도달해야 펄스 1개가 만들어 진다.(2N인 이유), OCR0에 0이 들어가지 않는다(1+OCR0인 이유), 10분주 하려면 OCR0=9가 되면 된다.

  . FOC0(force output compare)가 1로 set되야 CTC모드시 OC0핀에서 펄스가 출력된다.

 

- 고속 PWM모드 : 

 . FAST PWM모드의 TCNT0는 O~0xFF로 고정되어 있다. TCNT0가 TOP(0xFF)까지 증가후에는 다시 0부터 시작한다.

 . TCNT0가 OCR0에 설정한 값과 같으면 OCF0가 세트되며 출력비교 인터럽트가 요청되어 OC0는 0으로 클리어 된다. 그리고 TCNT0가 255까지 증가했다가 0으로 바뀌는 순간 TOV0가 세트되어 오버플로 인터럽트가 요청되어 OC0는 1로 세트된다. OCR0의 값과 듀티비가 비례한다.

 .

 . 출력주파수 f = fclk/(N*256)

 

- Phase correct PWM 모드

 . TCNT0와 OCR0의 값이 일치하면 OCF0가 세트되며 출력 비교 인터럽트가 요청되며 OCR0의 값은 상향 카운팅시는 0으로  하향카운팅시는 1이 된다. 

 .

 . 출력주파수 f = fclk/(N*510)

 

- 분주기(prescaler)

 

- Normal모드 인터럽트 주기

  . 입터럽트주기 = Xtal / 분주비 / (256-TCNT0)

  . ex) XTAL 16MHz   TCCR0=3; TCNT0=156; TIMSK=1;  -> 16MHz/32/(256-156) = 5kHz = 200us

        XTAL 16MHz   TCCR0=6; TCNT0=6; TIMSK=1;  -> 16MHz/256/(256-6) = 250Hz = 4ms

 . interrupt [TIM0_OVF] void timer0_ovf_isr(void){ TCNT0= ; }  //코드비전용 타이머0 오버플로우 인터럽트 함수, 그리고 타이머 인터럽트 함수 처음에 TCNT0를 재설정(reload) 해줘야 한다.

 

 - CTC 비교 매치 모드 인터럽트 주기 (OC0 연결X)

  . 인터럽트주기 = Xtal / 분주비 / (1+OCR0)

  . ex) TCCR0=0x0A; OCR0=139; TIMSK=2; //16000000/8/(1+139),70us

  .  interrupt [TIM0_COMP] void timer0_comp_isr(void){} //코드비전용 타이머0 비교매치 인터럽트 함수

  . 설정은 OCR0로 하고서 인터럽트는 오버플로우 인터럽트를 사용해도 된다. 

  . https://cafe.naver.com/circuitsmanual/153715(여기 다시 참고)

 

 - CTC 토글모드

  . CTC 토글 모드에서 OCR0 값에 따른 PB4(OC0) 핀 출력 주기이다. 인터럽트 주기가 아니다!(인터럽트 주기는 CTC비교 매치 인터럽트 주기와 같다)

  . PB4(OC0)핀 출력주기 = Xtal / 분주비 / 2 / (1+OCR0)

  . ex) TCCR0=0x9D; OCR0=249;  TIMSK=2;  //PB4(OC0) 핀 출력 주기=16000000/ 128/2/(1+124)=  500Hz=2ms

  . 이 모드는 PB4(OC0) 핀으로 펄스를 출력하기 위해서 주로 사용하므로 인터럽트 설정은 별로 할 일이 없다.(필요하다면 인터럽트를 사용해도 됨)

 

- PWM 모드

  . 타이머0 Fast PWM Mode // COM0x=2 Bottom(0x00)에서 Set(5V), OCR0에서 Clear(0V)

ex) TCCR0=0x6C; //주기=16000000/  64/256= 976.56250000Hz= 1.024ms

  . 타이머0 Fast PWM Mode // COM0x=3 Bottom(0x00)에서 Clear(0V), OCR0에서 Set(5V)

ex) TCCR0=0x7D; //주기=16000000/ 128/256= 488.28125000Hz= 2.048ms

  . 타이머0 Phase Correct PWM Mode // COM0x=2 Bottom(0x00)~OCR0구간 Set(5V), OCR0~TOP구간 Clear(0V)

ex) TCCR0=0x65; //주기=16000000/ 128/510=245.09803921568627450980392156863Hz=4.08ms

  . 타이머0 Phase Correct PWM Mode // COM0x=3 Bottom(0x00)~OCR0구간 Clear(0V), OCR0~TOP구간 Set(5V)

ex)  TCCR0=0x73; //주기=16000000/  32/510=980.39215686274509803921568627451Hz=1.02ms

  . COM0x=2 : non-inverting mode, COM0x=3 : inverting mode

  . TCCR0=0; 설정해서 노말모드로 변경해도 현재 PWM출력이 high상태라면 계속 high를 출력한다.

(2) 타이머/카운터 1

더보기

- 타이머0은 8비트 였고 타이머1은 16비트이다. 카운트수가 훨씬 많다. 타이머1은 3 세트가 있다.

- TCCR1A

- TCCR1B

-

-

  . 모드가 많이 늘었지만 8, 9만 추가 됬다고 보면 된다.

  . Phase and Frequency Correct PWM Mode와 Phase Correct PWM Mode의 차이

     .. Phase and Frequency Correct PWM Mode은 주기가 BOTTOM에서 시작하고  Update를 BOTTOM에서 함

     .. Phase Correct PWM Mode는 주기가 TOP에서 시작하고 Update를 TOP에서 함

  . 타이머0에서 PWM모드는 TOP이 0xFF로 고정이지만 타이머1에서는 8bit(0x00FF), 9bit(0x01FF), 10bit(0x03FF), 그리고 OCRnA나 ICRn을 사용가능.

 

 - Normal모드 -오버플로우 인터럽트

  . 타이머0  

ex)  TCCR0=2; TCNT0=136; TIMSK=1//16000000/8/(256-136),60us

 TCCR0=5; TCNT0=131; TIMSK=1//16000000/128/(256-131),1ms

  . 타이머2

ex)  TCCR2=3; TCNT2=241; TIMSK=0x40//16000000/64/(256-241),60us

TCCR2=4; TCNT2=131; TIMSK=0x40//16000000/256/(256-131),2ms

  . 타이머1

ex)  TCCR1B=1; TCNT1=59136; TIMSK=4//400us

 TCCR1B=4; TCNT1= 3036; TIMSK=4//1sec

  . 타이머3

ex)    TCCR3B=1; TCNT3H=33536>>8; TCNT3L=33536&0xFF; ETIMSK=4//2ms  //타이머3은 16비트 값을 8비트씩 상하로 나누어 입력해야 함

TCCR3B=5; TCNT3H=49911>>8; TCNT3L=49911&0xFF; ETIMSK=4//1sec

 

- PWM모드 

 . 타이머1 8비트 Phase Correct PWM Mode // COM1x=2 Bottom(0x00)~OCR2구간 Set(5V), OCR2~TOP구간 Clear(0V)

ex)   TCCR1A=0x81; TCCR1B=0x01//주기=16000000/   1/2/255=31372Hz=31.875us

      TCCR1A=0x81; TCCR1B=0x05//주기=16000000/1024/2/255=30Hz=32.64ms

 . 타이머1 8비트 Phase Correct PWM Mode // COM1x=3 Bottom(0x00)~OCR2구간 Clear(0V), OCR2~TOP구간 Set(5V)

    TCCR1A=0xC1; TCCR1B=0x01//주기=16000000/   1/2/255=31372.5Hz=31.875us

    TCCR1A=0xC1; TCCR1B=0x05//주기=16000000/1024/2/255=30.63Hz=32.64ms

 . 타이머3 8비트 Phase Correct PWM Mode // COM3x=2 Bottom(0x00)~OCR2구간 Set(5V), OCR2~TOP구간 Clear(0V)

ex)  TCCR3A=0x81; TCCR3B=0x01//주기=16000000/   1/2/255=31372.54Hz=31.875us

    TCCR3A=0x81; TCCR3B=0x05//주기=16000000/1024/2/255=30.63Hz=32.64ms

 . 타이머3 8비트 Phase Correct PWM Mode // COM3x=3 Bottom(0x00)~OCR2구간 Clear(0V), OCR2~TOP구간 Set(5V)

ex)  TCCR3A=0xC1; TCCR3B=0x01//주기=16000000/   1/2/255=31372.54Hz=31.875us

     TCCR3A=0xC1; TCCR3B=0x05//주기=16000000/1024/2/255=30.63Hz=32.64ms

 

 

  . 타이머1 9비트 Phase Correct PWM Mode // COM1x=2 Bottom(0x00)~OCR2구간 Set(5V), OCR2~TOP구간 Clear(0V)

 ex)  TCCR1A=0x81; TCCR1B=0x01//주기=16000000/   1/2/511=15655.57Hz=63.875us

       TCCR1A=0x81; TCCR1B=0x05//주기=16000000/1024/2/511=15.28Hz=65.408ms

  . 타이머1 9비트 Phase Correct PWM Mode // COM1x=3 Bottom(0x00)~OCR2구간 Clear(0V), OCR2~TOP구간 Set(5V)

ex)    TCCR1A=0xC1; TCCR1B=0x01//주기=16000000/   1/2/511=15655.57Hz=63.875us

    TCCR1A=0xC1; TCCR1B=0x05//주기=16000000/1024/2/511=15.28Hz=65.408ms

  . 타이머3 9비트 Phase Correct PWM Mode // COM3x=2 Bottom(0x00)~OCR2구간 Set(5V), OCR2~TOP구간 Clear(0V)

ex)    TCCR3A=0x81; TCCR3B=0x01//주기=16000000/   1/2/511=15655.57Hz=63.875us

       TCCR3A=0x81; TCCR3B=0x05//주기=16000000/1024/2/511=15.28Hz=65.408ms

  . 타이머3 9비트 Phase Correct PWM Mode // COM3x=3 Bottom(0x00)~OCR2구간 Clear(0V), OCR2~TOP구간 Set(5V)

 ex)  TCCR3A=0xC1; TCCR3B=0x01//주기=16000000/   1/2/511=15655.57Hz=63.875us

     TCCR3A=0xC1; TCCR3B=0x05//주기=16000000/1024/2/511=15.28Hz=65.408ms

  

 

  . 타이머1 10비트 Phase Correct PWM Mode // COM1x=2 Bottom(0x00)~OCR2구간 Set(5V), OCR2~TOP구간 Clear(0V)

ex)    TCCR1A=0x83; TCCR1B=0x01//주기=16000000/   1/2/1023=7820.13Hz=127.875us

       TCCR1A=0x83; TCCR1B=0x05//주기=16000000/1024/2/1023=7.63Hz=130.944ms

  . 타이머1 10비트 Phase Correct PWM Mode // COM1x=3 Bottom(0x00)~OCR2구간 Clear(0V), OCR2~TOP구간 Set(5V)

ex)   TCCR1A=0xC3; TCCR1B=0x01//주기=16000000/   1/2/1023=7820.13Hz=127.875us

      TCCR1A=0xC3; TCCR1B=0x05//주기=16000000/1024/2/1023=7.63Hz=130.944ms

  . 타이머3 10비트 Phase Correct PWM Mode // COM3x=2 Bottom(0x00)~OCR2구간 Set(5V), OCR2~TOP구간 Clear(0V)

ex)   TCCR3A=0x83; TCCR3B=0x01//주기=16000000/   1/2/1023=7820.13Hz=127.875us

    TCCR3A=0x83; TCCR3B=0x05//주기=16000000/1024/2/1023=7.636Hz=130.944ms

  . 타이머3 10비트 Phase Correct PWM Mode // COM3x=3 Bottom(0x00)~OCR2구간 Clear(0V), OCR2~TOP구간 Set(5V)

ex)    TCCR3A=0xC3; TCCR3B=0x01//주기=16000000/   1/2/1023=7820.13Hz=127.875us

    TCCR3A=0xC3; TCCR3B=0x05//주기=16000000/1024/2/1023=7.636Hz=130.944ms

 

 

 - CTC 비교매치 모드 인터럽트 https://cafe.naver.com/circuitsmanual/154088

  .  타이머0 CTC 비교 매치 인터럽트

ex) TCCR0=0x0A; OCR0=159; TIMSK=2//16000000/8/(1+159),80us

      TCCR0=0x0D; OCR0=249; TIMSK=2//16000000/128/(1+249),2ms

 

  . 타이머2 CTC 비교 매치 인터럽트

ex) TCCR2=0x0A; OCR2=119; TIMSK=0x80//16000000/8/(1+119),60us

    TCCR2=0x0C; OCR2=249; TIMSK=0x80//16000000/256/(1+249),4ms

 

  . 타이머1 A매치 인터럽트 (16MHz 기준)

 ex)  TCCR1B=0x09; OCR1A=15999; TIMSK=0x10//1ms

         TCCR1B=0x0B; OCR1A=12499; TIMSK=0x10//50ms

 

  . 타이머3 A매치 인터럽트 (16MHz 기준)

ex)    TCCR3B=0x09; OCR3AH=31999>>8; OCR3AL=31999&0xFF; ETIMSK=0x10//2ms

      TCCR3B=0x0D; OCR3AH=1249>>8; OCR3AL=1249&0xFF; ETIMSK=0x10//80ms

 

 - CTC 토글 모드 -  https://cafe.naver.com/circuitsmanual/154089

  . 타이머0 CTC 토글 Mode

ex) TCCR0=0x9A; OCR0=179//16000000/8/2/(1+179),180us

    TCCR0=0x9F; OCR0=124//16000000/1024/2/(1+124),16ms

 

  . 타이머2 CTC 토글 Mode

ex)  TCCR2=0x99; OCR2=159//16000000/1/2/(1+159),20us

      TCCR2=0x9C; OCR2=124//16000000/256/2/(1+124),4ms

 

  . 타이머1 CTC 토글 Mode (16MHz 기준)

ex) TCCR1A=0x40; TCCR1B=9; TCCR1C=0x80; OCR1A=4799// 600us

     TCCR1A=0x40; TCCR1B=0x0D; TCCR1C=0x80; OCR1A=15624// 16000000/2*1024/(15624+1)=0.5Hz=2sec

 

  . 타이머3 CTC 토글 Mode  (16MHz 기준)

ex)  TCCR3A=0x40; TCCR3B=9; TCCR3C=0x80; OCR3AH=47999>>8; OCR3AL=47999&0xFF// 6ms

      TCCR3A=0x40; TCCR3B=0x0D; TCCR3C=0x80; OCR3AH=31249>>8; OCR3AL=31249&0xFF// 4sec

 

  - 8비트 Fast PWM Mode★★★ - https://cafe.naver.com/circuitsmanual/154090

  - 9비트 Fast PWM Mode - https://cafe.naver.com/circuitsmanual/154091

  - 10비트 Fast PWM Mode ★★ - https://cafe.naver.com/circuitsmanual/154092

  - Phase and Frequency Correct PWM Mode - ICRn - https://cafe.naver.com/circuitsmanual/154094

  - Phase and Frequency Correct PWM Mode - OCRnA - https://cafe.naver.com/circuitsmanual/154095

  - Phase Correct PWM Mode - ICRn - https://cafe.naver.com/circuitsmanual/154096

  - Phase Correct PWM Mode - OCRnA - https://cafe.naver.com/circuitsmanual/154097

  - CTC Mode - ICRn - https://cafe.naver.com/circuitsmanual/154098

  - CTC Mode - ICRn 토글 - https://cafe.naver.com/circuitsmanual/154099

  - Fast PWM Mode - ICRn★★★ (OCRnA 로 듀티비 조절하는 듯) 하다- https://cafe.naver.com/circuitsmanual/154100

  - Fast PWM Mode - OCRnA - https://cafe.naver.com/circuitsmanual/154101

 

 

  - 인터럽트 함수 내에서 머무르는 시간을 최소화 시키는 것이 중요

  - 인터럽트가 서로 영향을 주지 않기 위해선 모든 인터럽트 함수 내의 코드 실행 시간을 더한 시간이
가장 짧은 주기의 인터럽트 주기보다 짧아야한다.

 

- TIMSK

  . TICIE1 : 1로 설정하면 타이머1의 입력캡쳐 인터럽트를 허용

  . OCIE1A : 1로 설정하면 타이머1의 출력비교 인터럽트 A를 허용

  . OCIE1B : 1로 설정하면 타이머1의 출력비교 인터럽트 B를 허용

  . TOIE1 : 1로 하면 타이머1의 오버플로 인터럽트를 허용

 

- ETIMSK

  . TICIE3 : 1로 설정하면 타이머3의 입력캡쳐 인터럽트를 허용

  . OCIE3A : 1로 설정하면 타이머3의 출력비교 인터럽트 A를 허용

  . OCIE3B : 1로 설정하면 타이머3의 출력비교 인터럽트 B를 허용

  . TOIE3 : 1로 하면 타이머3의 오버플로 인터럽트를 허용

  . OCIE3C : 1로 설정하면 타이머3의 출력비교 인터럽트 C를 허용

  . OCIE1C : 1로 설정하면 타이머3의 출력비교 인터럽트C를 허용

 

 

 

3) 인터럽트

더보기

- EIMSK

  . 인터럽트0~7을 ON/OFF 함

 

- EICRA

 . 인터럽트0~3(PD0~3)

 . 0 0 : Low에서 인터럽트 발생, 1 0 : 하강에지(High->Low)에서 인터럽트 발생, 1 1 : 상승에지(Low->High)에서 인터럽트 발생

 

- EICRB

 .  인터럽트4~7(PE4~7)

 . 0 0 : Low에서 인터럽트 발생, 0 1 : 상승, 하강에지에서 둘다 인터럽트 되는거로 알고 있는데 이 데이터 시트(atmega128a 참조)는 뭐지?, 1 0 : 하강에지(High->Low)에서 인터럽트 발생, 1 1 : 상승에지(Low->High)에서 인터럽트 발생

 

- SREG(The AVR Status register)

  . 7 : 인터럽트 활성화

 

 

4) ADC

더보기

- AVCC(Pin64) : AD변환기 및 포트F에 대한 공급 전압, AREF(Pin62) : ADC 참조 전압(AVCC or 내부2.56V or 외부 AREF 중에서 선택)

- ADMUX

  . 7,6 bit

   . 4~0 bit

     . 차동입력 : ( Positive Differential input - Negative Differential Input , Gain) , 즉 두pin 사이의 차이를 증폭까지해서 읽어들인다.

 

- ADCSRA

. 7 bit(ADEN) : ADC enable, 1로 하면 사용

. 6 bit(ADSC) : ADC start conversion, 1로 하면 변환이 시작되고 변환이 완료되면 자동으로 0이 된다.

. 5 bit(ADFR) : ADC free funning select, 0은 single conversin mode(첫 변환에 25개의 클록이 필요, 변환이 완료되면 변환결과가 ADCH와 ADCL레지스터에 저장되고 ADIF는 1로 ADSC는 0이 된다, 다시 변환을 하려면 ADSC를 1로 만들면 됨, 이때 부터는 13개의 클록이 필요), 1은 free running mode(변환에 13개의 클록이 필요, 변환결과가 ADCH와 ADCL에 저장되고 즉시 다음 차례의 AD변환이 자동으로 시작, ADSC는 계속 1인 상태)

. 4 bit(ADIF) : ADC interrupt flag, ADCH와 ADCL 레지스터가 갱신되면 1로 세트되어 인터럽트를 요청한다.

. 3 bit(ADIE) : ADC interrupt enable, 1로 하면 사용

. 2~0 bit(ADPS2~ADPS0) : ADC prescaler select, 분주비 선택  

 

- ADCH, ADCL (ADLAR=0) : 변환결과가 저장되는 10bit 레지스터이다. 읽을 때는 ADCL -> ADCH 순으로 읽어야 한다

  . ADCH

  . ADCL

  .

단극성 변환 값
차동 변환 값

  . ADCW : ADCH+ADCL 의 16bit 엑세스 레지스터, 코드비젼에서 ADC를 읽었을 때 값이 반환 되는 곳

 

 

 

5) 통신

 

 

 

2. 모터제어를 위한 IR2101 이해

- bootstrap +600V까지 동작이 가능하다

- gate drive 공급 범위 10~20V

- IGBT : 일반적인 실리콘 계열 MOSFET / BJT와 달리 IGBT는 고전압 스위칭이 가능하며, 드레인/소스 부분은 일반적인 트랜지스터 형식으로 되어 있어 FET와 달리 PTC 특성(온도가 높아지면 저항이 증가하여 흐르는 전류가 감소)을 가지므로 병렬 운전에 유리하다. 초대형 모듈 제품군이 상당히 많다. 절연된 게이트는 충전용량을 가지기 때문에 턴-온 시간은 몰라도 턴-오프 시키는 데 일반적인 스위칭 기법(즉, 게이트 전압이 0에서 문턱 전압(Threshold)을 왔다갔다 하는)으로는 kHz 이상의 속도를 내기 힘들다(최고 약 20kHz). 그래서 전용 드라이버 IC도 있으며, IGBT의 구동단은 트랜스를 이용해 절연할 뿐만 아니라, 구동 전압 역시 게이트 전압이 -15~+15V로 움직여야 해서 복잡하다. FET는 고전압일수록 드레인-소스 Rds(on) 이 증가하여 약간만 전류가 높아져도 손실이 40~50W를 넘어서나 IGBT는 저압이든 고압이든 항상 일정한 컬렉터-소스 전압강하를 가지고 있어 대전류일 경우 에너지 효율이 FET에 비해 상대적으로 좋다. IGBT의 고압 내구성이 상당히 보장되어 있다. 저전류 어플리케이션에선 역으로 FET 의 효율이 상대적으로 높다

-Pin1(VCC) : Low side and logic fixed supply

Pin2(HIN) : input signal for high side MOSFET driver output

Pin3(LIN) :  input signal for low side Mosfet driver output

Pin4(COM) : Low side return

Pin5(LO) : the output of low side MOSFET drive

Pin6(VS) : High side floating supply return

Pin7(HO) : High side gate drive output

Pin8(VB) : High side floating supply

 

 

 

 

3. BLDC 모터에 대한 이해

-

- 이 모터는 4극 인듯하다. 

- 검증 

1차 : 

 

엄청난 노가다로 만들었다. 과연 구동이 될 것인가..

-> 기괴한 소리를 내면서 물고기 꼬리마냥 파닥파닥 거린다. 뭐가 문제일까..? (1. 여전히 상이 안맞음 2. PWM 주파수)

 

2차 : 

홀센서가 N이 왔을때 1이 아닌 S가 왔을때 1인 경우가 있어서 이 경우도 고려해 보기로 함.

 

-

 

 

설계과정

더보기

PCB 기판 check

1. 회로도 보면서 도통체크

- IR2101 위치를 역순으로 배치 해놔서 순간 기판 설계 잘못한 줄

- 번거롭지만 확인 결과 이상없음

- 이제 잘 동작할지가 관건

2. 전원부 조립

- 12V 출력 확인 함

- 5V 출력 확인 함

- 다른 쪽에도 잘 인가 되는지 확인 함

3. ISP 조립, RESET부 조립, XTAL 조립

4. LED 버져 조립

- SMD(1206) 처음 납땜 해봤는데 할만해서 다행

5. 프로그램 테스트

- 버져, LED 코드 넣어서 동작 확인 -> 이상없이 잘됨!

6. LCD 조립 & 테스트

- 백라이트만 들어와서 망한 줄

- 가변저항을 20바퀴 돌리니 이제서야 글자 나옴...

7. 128납땜

- 인터넷에서 본 것중 하나를 따라하다가 망할 뻔 함. 납을 뭉텅이로 녹여 놓은 담에 기울여서 표면장력을 이용한 것인데 스킬 부족인 듯

- 다른 방법 중 하나인, 플럭스를 도포부 납을 살짝 녹여 올린후 인두기로 몇번 휙휙 하니까 생각보다 잘 됨.(흡입기 몇번 사용함)

- 테스터로 일일히 양옆 핀이 혹시나 도통됬는지 확인 함 -> 이상 없음

8. 스위치 조립 & 테스트

- 이상없이 잘 됨

9. 전류 센싱부 조립 & 테스트 

- 1차 : R2, C3 값 미정 , R4 : 1ohm / 3w

값 정하는 법과 센싱하는 코드를 몰라서 공부 필요함

- 2차 : 값 설정 및 구현 예정

 

10. A/D 읽기 테스트, PWM 출력 테스트

- 1차 : 아직 프로그램 몰라서 구현 못함

- 2차 : 구현 예정

 

11. 모터 구동부 빵판에 테스트

- 예전에 사뒀던 47옴 짜리가 있어서 다행

- 1차 : 실패, 아직 실력 부족으로 어떻게 해야할 지 모르겠음

- 2차 : 감은 잡음, IR2101 동작 원리를 파악은 어느 정도 함. 모터에 대한 공부가 필요함. 구동 프로그래밍을 익혀서 다른 KIT에 프로그램을 넣어서 동작 시켜볼 예정. 주문한 모터 와야함. 프로그램(홀센서 사용하여 모터 구동 + 출력 전류 센싱)

- 3차 : 빵판에 IR2101와 NMOS로 bootstrap 구현, LIN이 HIGH시 VS=0이 되고 +12V->DIODE->CAP 으로 충전이 됨(+11.4V정도), HIN이 HIGH가 되면 VB=23.4V가 되기 때문에 상단 NMOS가 완전히 ON이 되어서 VS=12V가 온전히 걸릴 수 있다. CAP이 방전 되기 때문에 다시 LIN이 HIGH가 되어야 함. 

- 4차 : 모터 구동 프로그램 구현 예정, 모터가 돌긴 도는데 상을 맞추질 못해서 제속도를 내지 못함. 홀센서 위치에 따른 제대로 된 상을 추처야 할 듯 

- 5차 : 

 

12. 기판에 모두 조립하고 TEST

 

 

 

 

 

 

 

 

 

 

 

 

참고

- https://cafe.naver.com/circuitsmanual?iframe_url=/ArticleRead.nhn%3Fclubid=18968931%26articleid=153293%26referrerAllArticles=false%26boardtype=L%26menuid=363#

- https://cafe.naver.com/stm32study?iframe_url=/ArticleRead.nhn%3Fclubid=23948833%26page=2%26menuid=5%26boardtype=L%26articleid=97%26referrerAllArticles=false

- https://cafe.naver.com/hardandsoft?iframe_url=/ArticleRead.nhn%3Farticleid=40%26clubid=20406186

-https://cafe.naver.com/stm32study?iframe_url=/ArticleRead.nhn%3Fclubid=23948833%26page=2%26menuid=5%26boardtype=L%26articleid=97%26referrerAllArticles=false#

- https://namu.wiki/w/IGBT

- https://microcontrollerslab.com/mosfet-driver-ir2110-pinout-examples-applications-datasheet/

- https://cafe.naver.com/openrt/14

-

-

-

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함