복잡한 제어를 하고 싶다면 아날로그 회로로는 한계가 있다. 이를 위해 ADC(아날로그 디지털 컨버터)는 반드시 필요한 기술이다.  아날로그 신호(센서의 전압신호, 전류신호)를 프로세서가 받아드려 프로세서에서 원하는 제어를 하는 프로젝트일 경우 반드시 사용할 것이다. 다만 아날로그 신호를 디지털 신호로 변환하게 되면 반드시 생기는 왜곡은 감수해야한다. 그래서 좋은 ADC변환 칩을 사용하는것이 좋다. ADC의 변환 방식은 여러가지가 있다. 병렬비교형, 파이프라인형, 축자비교형, 델타시그마형, 이중적분형 등이 있는데, TC237에는 델타시그마형과 축자비교형을 사용하고있다. 각 변환방식마다 장점과 단점 성능 차이가 있다.

이번 TC237 ADC에서는 축자비교형(SAR)방식을 사용한다.




축자비교형의 경우 이진탐색 방식으로 양자화하는 방식이다.

내부에 DAC와 비교기를 사용해서 각 클럭마다 상위 MSB 부터 LSB쪽으로 결정한다.


하지만 우리는 이러한 것을 몰라도 사용이 가능하다. TC237의 내부 하드웨어가 처리를 해주며 우리는 제어 할 수 있는 레지스터를 건드려 주면 된다.

 


아래는 유저 메뉴얼에 명시되어있는 ADC 변환 예제이다.

1. Load the global VADC module registers

2. Enable the analog/digital converter 0 (G0)

3. Select channel 0 of G0 as analog input

4. Initialize the conversion result service request

5. Start first conversion


Basic Initialization of the VADC:

//=========================> Load global module registers

(1) SCU_vResetENDINIT (0); // Access to ENDINIT-prot. reg.

(2) VADC_CLC = 0x0000; // Enable module clock and ctrl.

(3) dummy = VADC_CLC; // Read back ensures write oper.

(4) SCU_vSetENDINIT (0); // Lock ENDINIT-protected reg.

//=========================> Enable converter for group 0

(5) VADC_G0ARBCFG = 0x3; // ANONC = 11, analog converter ON

(6) VADC_GLOBCFG = (1<<31) /* SUCAL = 1, start-up calib. */ \

|(1<<15) /* DIVWC = 1, enable write */ \

| 0x9; // DIVA = 9 (clock prescaler)

(7) VADC_G0ARBPR = (1<<26); // AREN2 = 1, enable arb. slot 2

// (= background source)

(8) VADC_G0CHCTR0 = (1<<20); // RESTBS = 1, global result reg.

(9) VADC_BRSSEL0 = 0x1; // Select CH0 of group 0 for scan

(10) VADC_BRSMR = 0x1; // ENGT = 10B, enable conv. req.

//=========================> Init and install service request

(11) SRC_VADCCG0SR0 = (1<<10) /* Enable SR node 0, group 0 */ \

|VADC0INT; // Set prio to <VADC0INT>(1..255)

(12) interruptHandlerInstall (VADC0INT, & VADC_SCAN_irq);

(13) VADC_GLOBRCR = (1<<31); // SRGEN = 1, result service requ.

//=========================> Wait for completion of startup cal.

(14) while((VADC_G0ARBCFG.U & 0x30000000) != 0x20000000);

// CALS = 1, CAL = 0: calibr. done

//=========================> Start a conversion

(15) VADC_BRSMR |= (1<<9); // LDEV = 1, generate a load event










tftlcd에 간이 오실로스코프

lcd 하단에 전압 구형파를 출력했다.

 






SAR 방식의 adc



빠른 주행과 CPU에 부담을 주지 않기 위해 DMA채널을 이용해서 ADC를 할 계획이다.

delta-sigma adc도 해볼예정


Cpu0_Main.c

Cpu0_Main.h

Cpu1_Main.c

Cpu2_Main.c

VadcAutoScanDemo.c

VadcAutoScanDemo.h





호주에서 작성한 솔라카 전력 회로도



호주에 도착하고 작성한 회로도이다. 우리의 전력회로도는 이렇다. 

컨버터 2개 배터리 PV모듈 모터 모터컨트롤러 등등이 들어갔다.



물론 전력회로도에 들어가지 않는 많은 전장부 모듈들이있다.






모터전력과 태양광전력을 측정하는 모듈  - 중앙 MCU로 CAN을 전송한다.

전류센서의 레졸루션이 낮아서(1.25V) 계측용증폭기를 사용해서 레졸루션을 높였다. (3.0V)

MCU는 stm32f4 사용








배터리의 전류를 측정하고 SOC(베터리 전류 잔량)을 계산하는 MCU

차량의 전원이 끊어질 경우 외부 EEPROM에 SOC를 저장한다.

SOC는 전류적산을 이용한다.

역시 CAN통신을 이용하여 중앙 MCU에 데이터를 전송한다.

전류센서의 분해능을 높이기위해 계측용증폭기 TI사의  ina333 IC를 사용했고,

stm32f4의 ADC 분해능이 4095(12bit)를 16bit로 올리기위해 TI사의 ADC IC를 사용했다.




INA333의 회로도.

이득은 오른쪽 수식으로 나온다.




양방향 전압이 아닌 단방향 전압을 인가 가능하다.





2편에서 계속











 솔라카 - 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 을 사용할 수 도 있다











void Uart_Initialization(void)

{

static uint8 i;


/* disable interrupts */

    boolean              interruptState = IfxCpu_disableInterrupts();

    /* create module config */

    IfxAsclin_Asc_Config Uart_AscLin0;

    IfxAsclin_Asc_initModuleConfig(&Uart_AscLin0, &MODULE_ASCLIN0);


    /* set the desired baudrate */

    Uart_AscLin0.baudrate.prescaler    = 1;

    Uart_AscLin0.baudrate.baudrate     = 115200; /* FDR values will be calculated in initModule */

    Uart_AscLin0.baudrate.oversampling = IfxAsclin_OversamplingFactor_4;


    /* ISR priorities and interrupt target */

    Uart_AscLin0.interrupt.txPriority    = ISR_PRIORITY_ASCLIN0_TX;

    Uart_AscLin0.interrupt.rxPriority    = ISR_PRIORITY_ASCLIN0_RX;

    Uart_AscLin0.interrupt.erPriority    = ISR_PRIORITY_ASCLIN0_ER;

    Uart_AscLin0.interrupt.typeOfService = IfxSrc_Tos_cpu0;


    /* FIFO configuration */

    Uart_AscLin0.txBuffer     = AsclinAsc.ascBuffer.tx;

    Uart_AscLin0.txBufferSize = ASC_TX_BUFFER_SIZE;


    Uart_AscLin0.rxBuffer     = AsclinAsc.ascBuffer.rx;

    Uart_AscLin0.rxBufferSize = ASC_RX_BUFFER_SIZE;


const IfxAsclin_Asc_Pins pins = {

        NULL,                     IfxPort_InputMode_pullUp,        /* CTS pin not used */

        &IfxAsclin0_RXB_P15_3_IN, IfxPort_InputMode_pullUp,        /* Rx pin */

        NULL,                     IfxPort_OutputMode_pushPull,     /* RTS pin not used */

        &IfxAsclin0_TX_P15_2_OUT, IfxPort_OutputMode_pushPull,     /* Tx pin */

        IfxPort_PadDriver_cmosAutomotiveSpeed1

    };

    Uart_AscLin0.pins = &pins;




    /* initialize module */

    IfxAsclin_Asc_initModule(&AsclinAsc.drivers.asc0, &Uart_AscLin0);


    /* enable interrupts again */

    IfxCpu_restoreInterrupts(interruptState);




} /* End of Uart_Initialization */




void Uart_Put_Char(char c){


AsclinAsc.Uart_TxData[0] = c;

AsclinAsc.count = UART_TEST_DATA_SIZE;

IfxAsclin_Asc_write(&AsclinAsc.drivers.asc0,AsclinAsc.Uart_TxData, &AsclinAsc.count, TIME_INFINITE);

}


void Uart_Put_String(char *string){

    unsigned char i=0;


    while(string[i] != 0){       

    Uart_Put_Char(string[i++]);

    }                            

    Uart_Put_Char(0x0A);

}



hello world! 를 출력했다.





'프로젝트 > 자율주행모형차' 카테고리의 다른 글

라인스캔카메라 가우시안 필터, 엣지 디텍션  (1) 2018.06.13
라인스캔카메라  (11) 2018.06.07
라이다(RIDAR) tc237  (0) 2018.06.05
tc237 ADC(SAR)  (0) 2018.04.19
Infineon TC237 LCD 프로그램 업로드  (0) 2018.04.03


tc237을 사용하게 되서 시작했다.

LCD 데모 프로그램을 찾고있었는데 

하이텍 이클립스에서 기본예제으로 제공해준다.

프로젝트관리창에서 오른쪽 마우스를 클릭한뒤 new -> example 에 들어가면 LCD 예제 뿐 아니라 시리얼 예제도 있다.

'프로젝트 > 자율주행모형차' 카테고리의 다른 글

라인스캔카메라 가우시안 필터, 엣지 디텍션  (1) 2018.06.13
라인스캔카메라  (11) 2018.06.07
라이다(RIDAR) tc237  (0) 2018.06.05
tc237 ADC(SAR)  (0) 2018.04.19
tc237 uart tx 테스트  (3) 2018.04.17


유성식 감속기의 장점 :

·          컴팩트 한 크기와 낮은 무게 - 동일한 토크 출력으로 50 % 감소.

·          고출력 밀도 - 여러 행성이 하나의 기어가 아닌 부하를 공유 할수록 더 많은 행성이 공유됩니다.

·          유사한 하중에서 더 긴 기어 수명.

·          기어 링은 실제로 백래시가 없어도 매우 정확합니다.

·          높은 효율 - 무대 당 95 %가 일반적입니다.

·          1 단계 당 일반적인 비율은 9 : 1, 4 단계는 9000 : 1입니다.

·          동축 배열 - 오프셋 출력 샤프트 없음

·          모듈 형, 대부분의 행성 스테이지는 쌓을 수 있습니다.

유성식 감속기의 단점 :

·          Noisier Operation - 일부 유성 기어 헤드는 시끄 럽습니다.

·          하중 공유를 보장하기 위해서는 기어링이 정확해야합니다.

·          베어링 하중이 높으면 데드 스터드 또는 슬리브 베어링 구조에서 조기 마모가 발생할 수 있습니다.

·          일반적으로 윤활유가 윤활 처리됩니다 (오일 유탕이 좋습니다).

·          다단계를 사용할 때 길이 대 직경의 비율이 높습니다 (기어 헤드가 매우 길어짐).

·          낮은 백래시와 긴 수명이 요구되는 경우 높은 비용.



출처: http://m.ko.usattmotor.com/news/advantages-and-disadvantages-of-planetary-gear-6242974.html

'공부 > 기타' 카테고리의 다른 글

PV SYSTEM  (0) 2018.09.06
BLDC 모터 드라이버  (1) 2018.01.31
opamp 회로 사이트  (0) 2018.01.31
BLDC 모터 컨트롤러 회로도  (0) 2018.01.18
C언어 hex string -> real hex  (0) 2017.12.22



제어는 stm32f1 시리즈 컨트롤러를 사용




모터드라이버를 제작하고

게이트에 신호를 줘서 구동을 했다.







손으로 천천히 모터를 돌려 홀센서 w u v 센서값을 측정


홀센서로 속도값을 받아서

속도제어를 하려고 한다.





'공부 > 기타' 카테고리의 다른 글

PV SYSTEM  (0) 2018.09.06
유성 기어 모터의 장점 및 단점  (0) 2018.03.06
opamp 회로 사이트  (0) 2018.01.31
BLDC 모터 컨트롤러 회로도  (0) 2018.01.18
C언어 hex string -> real hex  (0) 2017.12.22

주소: http://earmark.net/gesr/opamp/



Op Amp Applications

by Bruce Carter - Op Amp Applications Specialist

My EE Web Profile and Article(s):

Are You Smarter Than an Op Amp?

This is a collection of op amp design utilities, primarily javascripts, that will make you signal chain designs much quicker and easier.


'공부 > 기타' 카테고리의 다른 글

유성 기어 모터의 장점 및 단점  (0) 2018.03.06
BLDC 모터 드라이버  (1) 2018.01.31
BLDC 모터 컨트롤러 회로도  (0) 2018.01.18
C언어 hex string -> real hex  (0) 2017.12.22
INA333 테스트  (0) 2017.07.08

BLDC 모터 컨트롤러를 만들려고 회로도를 작성했다.

IR2101 게이트드라이버와 IRFZ44 mosfet을 사용했다.

MCU는 stm32f4 를 사용 할 것이고, 후에 ti dsp를 이용할 것이다.




'공부 > 기타' 카테고리의 다른 글

BLDC 모터 드라이버  (1) 2018.01.31
opamp 회로 사이트  (0) 2018.01.31
C언어 hex string -> real hex  (0) 2017.12.22
INA333 테스트  (0) 2017.07.08
Error[Li006]: duplicate definitions for - IAR  (0) 2016.09.22

+ Recent posts