솔라카 - CAN BUS

람세스에 사용된 CAN 통신은 태양전지로부터 나오는 전력량을 확인 할 수 있도록 사용되었다. 람세스에 탑재 되어있는 MPPT Race version4의 경우 CAN 통신을 지원하기 때문에 CAN통신 단자에 2개의 선 과 CAN컨트롤러 공급 전압(최소 6V 최대18V) 2개의 선이 필요하다. 그리고 CAN 신호를 받아서 컴퓨터로 전송 할 수 있는 모듈이 필요하다. 모듈의 경우는 마이크로프로세서로 직접 만드는 방법과 시중에 팔고있는 CAN모듈을 구입하여 사용하는 방법이 있다. 람세스에서는 직접 CAN 신호를 받아서 컴퓨터의 시리얼 통신으로 전송 할 수 있는 마이크로프로세서로 만들어 사용했다.



STM32F407 - ATA6660

CAN통신의 관한 기술문서 이기 때문에 STM32f407 ARM coretex-m4 칩을 설명 하지 않겠다.

STM32f407 CAN트랜시버를 같이 사용해야만 CAN신호를 받고 보낼 수 있다. CAN트랜시버칩은 ATMEL사의 ATA6660을 사용했다.





선을 연결 해준 뒤,  STM32f407 칩에서 CAN 신호를 받아본다.



1.1    데이터 수신

프로세서에서 CAN데이터를 받을 수 있도록 코드를 작성하여 다운로드 해준다. 아래 코드는 STM32f407 칩에서 CAN 통신을 하기 위한 레지스터 초기 설정 부분이다. 이와 같이 설정해주고, 데이터를 보내면 CAN 통신이 활성화 된다.

void Can_Init()

{

         GPIO_InitTypeDef                 GPIO_InitStructure;

         CAN_InitTypeDef                   CAN_InitStructure;

         NVIC_InitTypeDef                 NVIC_InitStructure;

 

         RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

         GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_CAN1);

         GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_CAN1);

 

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;

         GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF;

         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;

         GPIO_Init(GPIOB, &GPIO_InitStructure);

 

         CAN_DeInit(CAN1);

 

         CAN_InitStructure.CAN_TTCM = DISABLE;

         CAN_InitStructure.CAN_ABOM = DISABLE;

         CAN_InitStructure.CAN_AWUM = DISABLE;

         CAN_InitStructure.CAN_NART = DISABLE;

         CAN_InitStructure.CAN_RFLM = DISABLE;

         CAN_InitStructure.CAN_TXFP = ENABLE;

         CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;

 

        

         CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;

         CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;

         CAN_InitStructure.CAN_BS2 = CAN_BS2_1tq;

         CAN_InitStructure.CAN_Prescaler = 42;

        

         CAN_Init(CAN1, &CAN_InitStructure);

 

         CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

          

         NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;

         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

         NVIC_Init(&NVIC_InitStructure);

}

 

위 코드를 STM32f407칩에 다운로드 한 뒤 시리얼 통신으로 컴퓨터에서 CAN데이터를 받아보면 7바이트의 신호를 받을 수 있다.

 

1.2    C#프로그래밍

7바이트 신호들은 각 바이트 별로 정보가 들어있다. 각 정보는 MPPT데이터 시트 표(Figure 7)에 나와있다.

각 비트 별로 신호를 받았으면 시리얼 통신으로 컴퓨터에 데이터를 넘긴 후 C#프로그램을 제작해서 읽을 수 있는 눈금으로 표시한다. 아래 소스 코드는 각 바이트를 분석해서 원하는 정보를 얻는 과정이다.

 

buff[0] = buff[7];

                    buff[7] = (byte)(buff[7] & 0x03); //하위 2비트만 살림

                    vout_data = ((buff[2] + (256 * buff[3])) * 208.79) * 0.001;

                    vin_data = ((buff[6] + (256 * buff[7])) * 150.49) * 0.001;

                    iin_data = ((buff[4] + (256 * buff[5])) * 8.12) * 0.001;

                    power_data = iin_data * vin_data;

 






CAN 수신데이터가 시리얼 통신을 거치면서 가끔씩 오류가 날 경우도 있는데 이를 잡아주기 위해 소스코드에 데이터가 온전하지 못하면 넘어오지 못하게 하는 알고리즘도 제작을 해야한다. 위처럼 CAN 통신으로 에너지정보도 받을 수 있고, 차량내 통신으로도 CAN 을 사용할 수 도 있다





+ Recent posts