BASIC4MCU | 질문게시판 | 모터 방향 제어..
페이지 정보
작성자 모오다 작성일2020-12-05 00:16 조회2,974회 댓글1건본문
안녕하세요.
MEGA128A로 3상 BLDC 모터 제어를 하려고합니다.
프로그램은 코드비젼입니다.
정방향, 역방향 모두 상을 맞추었는데 정방향은 잘 돌아가나, 방향 변경 키를 눌러도 역방향으로 도는듯 하더니 다시 정방향으로 돌기 시작합니다..
(역방향으로 아주 약간 돌다가 다시 정방향으로 회전..)
상은 모두 맞는것같은데 무엇이 문제인지 모르겠습니다.
아래는 상에 관한 코드 내용입니다.
void PIN_TEST(void) //Hall sensor 위치에 따른 flag 값 변경
{
if(PINE & 0x10) //HALL_U = PORTE.4
{
flag_u = 0x10;
}
else
flag_u = 0x00;
if(PINE & 0x20) //HALL_V = PORTE.5
{
flag_v = 0x20;
}
else
flag_v = 0x00;
if(PINE & 0x40) //HALL_W = PORTE.6
{
flag_w = 0x40;
}
else
flag_w = 0x00;
}
void HALL_SENSOR(void)
{
PIN_TEST();
input = flag_u | flag_v | flag_w;
if(input == 0x50) //정방향 확인 IF문
{
if(input == 0x40)
ccw = 0; //CCW = 0 정방향 , CCW = 1 역방향
}
//ccw = 0;
if(ccw == 0) {
switch(input)
{
case 0x00:
lcd_home();
lcd_clear();
lcd_control_write(0x84);
lcd_print_data(str_not,3);
lcd_control_write(0xC0);
lcd_print_data(str_connect,7);
delay_ms(500);
beep();
beep();
beep();
break;
case 0x50: //HALL_U : H / HALL_V : L / HALL_W : H
OCR1AL = count; //UH : PWM
OCR1BL = 0; //VH : 0
OCR1CL = 0; //WH : 0
PORTD = 0x02; //UL : L
break;
case 0x40: //HALL_U : L / HALL_V : L / HALL_W : H
OCR1AL = 0; //UH : 0
OCR1BL = 0; //VH : 0
OCR1CL = count; //WH : PWM
PORTD = 0x02; //UL : 0
break;
case 0x60: //HALL_U : L / HALL_V : H / HALL_W : H
OCR1AL = 0; //UH : 0
OCR1BL = 0; //VH : 0
OCR1CL = count; //WH : PWM
PORTD = 0x01; //UL : 1
break;
case 0x20: //HALL_U : L / HALL_V : H / HALL_W : L
OCR1AL = 0; //UH : 0
OCR1BL = count; //VH : PWM
OCR1CL = 0; //WH : 0
PORTD = 0x01; //UL : 1
break;
case 0x30: //HALL_U : H / HALL_V : H / HALL_W : L
OCR1AL = 0; //UH : 0
OCR1BL = count; //VH : PWM
OCR1CL = 0; //WH : 0
PORTD = 0x04; //UL : 0
break;
case 0x10: //HALL_U : H / HALL_V : L / HALL_W : L
OCR1AL = count; //UH : PWM
OCR1BL = 0; //VH : 0
OCR1CL = 0; //WH : 0
PORTD = 0x04; //UL : 0
break;
}
}
}
void HALL_SENSOR_CCW(void)
{
PIN_TEST();
input = flag_u | flag_v | flag_w;
if(input == 0x20) //역방향 확인 IF문
{
if(input == 0x30)
ccw = 1; //CCW = 1이면 역방향
}
//ccw = 1
if(ccw == 1) {
switch(input)
{
case 0x00:
lcd_home();
lcd_clear();
lcd_control_write(0x84);
lcd_print_data(str_not,3);
lcd_control_write(0xC0);
lcd_print_data(str_connect,7);
delay_ms(500);
beep();
beep();
beep();
break;
case 0x20: //HALL_U : H / HALL_V : L / HALL_W : H
OCR1AL = count; //UH : PWM
OCR1BL = 0; //VH : 0
OCR1CL = 0; //WH : 0
PORTD = 0x02; //UL : L
break;
case 0x30: //HALL_U : L / HALL_V : L / HALL_W : H
OCR1AL = 0; //UH : 0
OCR1BL = 0; //VH : 0
OCR1CL = count; //WH : PWM
PORTD = 0x02; //UL : 0
break;
case 0x10: //HALL_U : L / HALL_V : H / HALL_W : H
OCR1AL = 0; //UH : 0
OCR1BL = 0; //VH : 0
OCR1CL = count; //WH : PWM
PORTD = 0x01; //UL : 1
break;
case 0x50: //HALL_U : L / HALL_V : H / HALL_W : L
OCR1AL = 0; //UH : 0
OCR1BL = count; //VH : PWM
OCR1CL = 0; //WH : 0
PORTD = 0x01; //UL : 1
break;
case 0x40: //HALL_U : H / HALL_V : H / HALL_W : L
OCR1AL = 0; //UH : 0
OCR1BL = count; //VH : PWM
OCR1CL = 0; //WH : 0
PORTD = 0x04; //UL : 0
break;
case 0x60: //HALL_U : H / HALL_V : L / HALL_W : L
OCR1AL = count; //UH : PWM
OCR1BL = 0; //VH : 0
OCR1CL = 0; //WH : 0
PORTD = 0x04; //UL : 0
break;
}
}
}
아래는 메인함수의 KEY 관련 스위치 함수입니다.
while(1)
{
// PORTD = count;
new_key = KEY_IN & KEY_MASK;
HALL_SENSOR();
if(new_key!=old_key)
{
switch(new_key)
{
case CW:
beep();
delay_ms(110);
if(start == 10) //start =10 이면 키 무력화 , !=10이면 키 정상동작
{
press_start();
LED_NG = ON;
LED_OK = OFF;
}
else
{
start = 0;
if(ccw == 0)
{
// for(; count == 0; count = count - 20)
// {
// delay_ms(50);
// }
// ccw = 1;
// for(; count == temp; count = count + 20)
// {
// delay_ms(500);
// }
HALL_SENSOR();
}
else
{
// for(; count == 0; count = count - 20)
// {
// delay_ms(500);
// }
// ccw = 0;
// for(; count == temp; count = count + 20)
// {
// delay_ms(500);
// }
HALL_SENSOR_CCW();
}
pwm_lcd();
}
break;
댓글 1
조회수 2,974master님의 댓글
master 작성일
현재 문제는 하드웨어를 가지고 있는 사람만 해결할 수 있겠습니다.
원인을 잘 찾아보세요