BASIC4MCU | 질문게시판 | atmega128 BLDC MOTOR 코드 질문입니다
페이지 정보
작성자 조셉 작성일2019-12-20 06:58 조회26,916회 댓글10건본문
atmega128 / 코드비전 사용 / BLDC MOTOR 구동 관련 질문입니다.
홀센서 3개를 라이징,폴링 일 시 외부인터럽트 사용해서 거기에 따른 모터 구동 소스 인데,
실제로 모터 구동이 되지는 않습니다.
어디쪽에서 잘못된건지 감이 잡히질 않습니다ㅜ
조언 부탁드립니다.
void key_data(void)
{
u08 i,j;
new_key = KEY_IN & KEY_MASK;
if (new_key!=old_key)
switch (new_key)
{
case SET:
if (set_flag == 1)
{
//beep();
lcd_display_start();
motor_drive();
}
else
{
//beep();
lcd_display_stop();
OCR1AL = 0x00;
OCR1BL = 0x00;
OCR1CL = 0x00;
}
set_flag = ~set_flag;
break;
}
}
void motor_drive(void)
{
u08 input;
input = flag_u | flag_v | flag_w;
switch (input)
{
case 0b00010000:
OCR1AL = 0x30;
PORTD = LIN2;
PORTC = 0b00000010;
break;
case 0b00011000:
OCR1AL = 0x30;
PORTD = LIN3;
PORTC = 0b00000100;
break;
case 0b00001000:
OCR1BL = 0x30;
PORTD = LIN3;
PORTC = 0b00001000;
break;
case 0b00101000:
OCR1BL = 0x30;
PORTD = LIN1;
PORTC = 0b00010000;
break;
case 0b00100000:
OCR1CL = 0x30;
PORTD = LIN1;
PORTC = 0b00000010;
break;
case 0b00110000:
OCR1CL = 0x30;
PORTD = LIN2;
PORTC = 0b00000100;
break;
}
}
// External Interrupt 4 service routine
interrupt [EXT_INT4] void ext_int4_isr(void)
{
// Place your code here
u08 v_data;
v_data = PINE & 0b00010000;
if (v_data == 0x10)
{
flag_v = 0x10;
}
else flag_v = 0x00;
}
// External Interrupt 5 service routine
interrupt [EXT_INT5] void ext_int5_isr(void)
{
// Place your code here
u08 w_data;
w_data = PINE & 0b00100000;
if (w_data == 0x20)
{
flag_w = 0x20;
}
else flag_w = 0x00;
}
// External Interrupt 6 service routine
interrupt [EXT_INT6] void ext_int6_isr(void)
{
// Place your code here
u08 u_data;
u_data = PINE & 0b01000000;
if (u_data == 0x40)
{
flag_u = 0x40;
}
else flag_u = 0x00;
}
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: On
// INT4 Mode: Any change
// INT5: On
// INT5 Mode: Any change
// INT6: On
// INT6 Mode: Any change
// INT7: Off
EICRA=(0<<ISC31) | (0<<ISC30) | (0<<ISC21) | (0<<ISC20) | (0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EICRB=(0<<ISC71) | (0<<ISC70) | (0<<ISC61) | (1<<ISC60) | (0<<ISC51) | (1<<ISC50) | (0<<ISC41) | (1<<ISC40);
EIMSK=(0<<INT7) | (1<<INT6) | (1<<INT5) | (1<<INT4) | (0<<INT3) | (0<<INT2) | (0<<INT1) | (0<<INT0);
EIFR=(0<<INTF7) | (1<<INTF6) | (1<<INTF5) | (1<<INTF4) | (0<<INTF3) | (0<<INTF2) | (0<<INTF1) | (0<<INTF0);
댓글 10
조회수 26,916master님의 댓글
master 작성일
어떻게 회로가 구성되어 있고
어떤 방식으로 구동하기 위한 코드인지
상세한 내용을 알고 있는 사람만 조언이 가능하겠습니다.
master님의 댓글
master 작성일
c언어 및 AVR 제어를 제대로 할 수 있는 실력인데 BLDC 구동을 모르는 것인지
아니면 AVR을 잘 모르는 것인지 부터 정리 한 후
하나씩 해결 해나가세요
전체가 안된다고 질문하면 도와드릴 방법이 없습니다.
홀센서가 입력되면 홀센서에 해당하는 BLDC 상을 구동하면 되는 것 아닌가요?
조셉님의 댓글
조셉
네 홀센서 입력에 따라서 bldc상을 구동하면 되는게 맞습니다.
그래서 홀센서가 라이징 엣지 일시, 외부인터럽트에서 플래그 1이 되고, 그거에 따라 스위치문에서 해당 모터 상이 구동하게 만들려고 하는데 제가 생각하는 방식 그대로 소스를 짰는데 구동이 안돼서 소스에 대한 조언을 부탁드려봅니다ㅜ
회로는 2015 강좌에 BLDC회로도 나와있는거와 같게 설계 하였습니다.
master님의 댓글
master
홀센서 라이징엣지에서 구동하는 것이 맞나요?
홀센서가 평소 LOW로 있다가 감지될 때 HIGH가 되나요?
//
홀센서 감지를 제대로 하는지 코드를 따로 작성해서 테스트 하고
BLDC 구동을 따로 테스트 하세요
두가지를 각각 제대로 동작할 때에 섞어서 구동시켜야지 고생을 덜 합니다.
조셉님의 댓글
조셉
6가지의 패턴을 보면 홀센서 감지 될때 0-1로 되는게 맞지 않나요?
master님의 댓글
master
그림의 패턴을 보고 정하는 것이 아니고
홀센서의 출력을 보고 정하면 됩니다.
오실로스코프가 없으신가요?
조셉님의 댓글
조셉
스코프로 찍어서 홀센서 출력에 대한 6가지 패턴 확인은 해봤습니다
홀센서 출력이 라이징 시 외부 인터럽트에서 플래그 = 1 로 처리하게 하고 이러한 데이터들을 or 시켜서 감지 시키게 하려고 합니다
master님의 댓글
master 작성일
홀센서 신호를 라이징 엣지에서 감지하는 것이 맞다는 말이죠?
그렇다면 두가지로 구분 할 수 있습니다.
1. 라이징 엣지 검출을 제대로 하고 있는가?
2. 라이징 엣지 검출 후 스텝동작을 제대로 하고 있는가?
//
인터럽트 함수는 3개를 사용하고 있고
EIMSK=(0<<INT7) | (1<<INT6) | (1<<INT5) | (1<<INT4) | (0<<INT3) | (0<<INT2) | (0<<INT1) | (0<<INT0);
인터럽트 마스크 비트도 제대로 하고 있습니다.
EICRB=(0<<ISC71) | (0<<ISC70) | (0<<ISC61) | (1<<ISC60) | (0<<ISC51) | (1<<ISC50) | (0<<ISC41) | (1<<ISC40);
라이징엣지 트리거가 아닌 핀체인지 트리거로 모드를 설정하고 있군요
EICRB=0xFF; 로 변경하세요
조셉님의 댓글
조셉
네 알겠습니다 감사합니다.
예를들어 3개의 홀센서가 110,001,101 이런식으로 변화하는 데이터를 만들고 싶었던건데,3개의 외부 인터럽트 사용해서 변화하는 데이터를 어떤식으로 만들 수 있을까요?
master님의 댓글
master
모터를 손으로 돌리면 홀센서 출력이 나옵니다.
오실로스코프로 홀센서 출력을 측정해서 사진을 찍어서 올려보세요