Presentation is loading. Please wait.

Presentation is loading. Please wait.

PWM Test UNIT 20 로봇 SW 교육원 조용수. 학습 목표 PWM Init PWM LED 제어 2.

Similar presentations


Presentation on theme: "PWM Test UNIT 20 로봇 SW 교육원 조용수. 학습 목표 PWM Init PWM LED 제어 2."— Presentation transcript:

1 PWM Test UNIT 20 로봇 SW 교육원 조용수

2 학습 목표 PWM Init PWM LED 제어 2

3 PWM Init PWM Port –LED1 (P2.1) : PWM1 –LED2 (P2.2) : PWM2 –LED3 (P2.3) : PWM3 –LED4 (P2.4) : PWM4 3

4 PWM Init PWM frequency = PWMxy_CLK / [(prescale+1)*(clock divider)*(CNR+1)]; (CNR + 1) = 22118400 / [( 7 + 1) * (1) * (50Hz)]; Duty ratio = (CMR+1)/(CNR+1) 4

5 PWM Init 5 void SYS_Init(void) { /* Unlock protected registers */ SYS_UnlockReg(); /* Enable IP clock */ CLK->APBCLK = CLK_APBCLK_UART0_EN_Msk; /* Update System Core Clock */ /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock and cyclesPerUs automatically. */ SystemCoreClockUpdate(); /* Set P3 multi-function pins for UART0 RXD and TXD */ SYS->P3_MFP = SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0; CLK_EnableModuleClock(PWM01_MODULE); CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HIRC, 0); SYS->P2_MFP = SYS_MFP_P21_PWM1; /* Lock protected registers */ SYS_LockReg(); }

6 PWM Init PWM 동작 6 Int main() { … PWMA->PPR &= ~(0xFF); PWMA->PPR |= 7;// Set Prescaler : 7 PWMA->CSR &=~(0xF0); PWMA->CSR |= (0x4 << 4); // Set Divider : 1 PWMA->PCR &= ~(0x1 << 11); PWMA->PCR |= (0x1 << 11); // Auto Reloaded PWMA->CNR1 = 55295; PWMA->CMR1 = 55295/2; PWMA->POE |= (0x1 << 1); // PWMA Out 1 Enable PWMA->PCR |= (0x1 << 8); // PWM1 Enable … }

7 PWM LED 제어 CMSIS 함수를 이용하여 LED 제어 7 void PWMInit() { /* Config PWM generator and get the nearest frequency in edge aligned auto-reload mode */ PWM_ConfigOutputChannel(PWMA, 1, 50, 99); /* PWMA pin output enabled */ PWM_EnableOutput(PWMA, 0x2); /* Start PWMA module */ PWM_Start(PWMA, 0x2); }

8 PWM LED 제어 가변 저항을 통해서 4 개의 LED 의 밝기를 제어 CMSIS 함수 이용 8

9 PWM LED 제어 9 void ADC_IRQHandler() { int value0 = 0; int value1 = 0; NVIC->ICPR[0] = (0x1 << 29); ADC->ADSR &= ~0x1; // Clear Interrupt ADC->ADCR &= ~(0x1 <<1) ; // Disable Interrupt value0 = ADC->ADDR[0] & 0xFFFF; value1 = ADC->ADDR[1] & 0xFFFF; printf("ADC(Interrupt) : "); printf("%d, %d\n", value0, value1); PWMA->CMR1 = 55296 - value1; }

10 PWM LED 제어 10 void SYS_Init(void) { /* Unlock protected registers */ SYS_UnlockReg(); CLK->APBCLK = CLK_APBCLK_UART0_EN_Msk; CLK->APBCLK |= CLK_APBCLK_ADC_EN_Msk; SystemCoreClockUpdate(); CLK_EnableModuleClock(PWM01_MODULE); CLK_EnableModuleClock(PWM23_MODULE); CLK_EnableModuleClock(PWM45_MODULE); CLK_EnableModuleClock(PWM67_MODULE); CLK_SetModuleClock(PWM01_MODULE, CLK_CLKSEL1_PWM01_S_HIRC, 0); CLK_SetModuleClock(PWM23_MODULE, CLK_CLKSEL1_PWM23_S_HIRC, 0); CLK_SetModuleClock(PWM45_MODULE, CLK_CLKSEL2_PWM45_S_HIRC, 0); CLK_SetModuleClock(PWM67_MODULE, CLK_CLKSEL2_PWM67_S_HIRC, 0); SYS->P2_MFP = SYS_MFP_P21_PWM1 | SYS_MFP_P22_PWM2 | SYS_MFP_P23_PWM3 | SYS_MFP_P24_PWM4; /* Set P3 multi-function pins for UART0 RXD and TXD */ SYS->P3_MFP = SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0; /* Lock protected registers */ SYS_LockReg(); }

11 PWM LED 제어 11 void PWM_Init() { /* Config PWM generator and get the nearest frequency in edge aligned auto-reload mode */ PWM_ConfigOutputChannel(PWMA, 1, 50, 100); PWM_ConfigOutputChannel(PWMA, 2, 50, 100); PWM_ConfigOutputChannel(PWMA, 3, 50, 100); PWM_ConfigOutputChannel(PWMB, 0, 50, 100); /* PWMA pin output enabled */ PWM_EnableOutput(PWMA, 0xF); PWM_EnableOutput(PWMB, 0xF); /* Start PWMA module */ PWM_Start(PWMA, 0xF); PWM_Start(PWMB, 0xF); }

12 PWM LED 제어 12 void ADC_IRQHandler() { int value0 = 0; int value1 = 0; NVIC->ICPR[0] = (0x1 << 29); ADC->ADSR &= ~0x1; // Clear Interrupt ADC->ADCR &= ~(0x1 <<1) ; // Disable Interrupt value1 = ADC->ADDR[1] & 0xFFFF; if(value1 < 1000) { PWM_ConfigOutputChannel(PWMA, 1, 50, 100 - value1 / 100); PWM_ConfigOutputChannel(PWMA, 2, 50, 100); PWM_ConfigOutputChannel(PWMA, 3, 50, 100); PWM_ConfigOutputChannel(PWMB, 0, 50, 100); } else if(value1 < 2000) { PWM_ConfigOutputChannel(PWMA, 1, 50, 100 - 10); PWM_ConfigOutputChannel(PWMA, 2, 50, 100 - (value1-1000)/100); PWM_ConfigOutputChannel(PWMA, 3, 50, 100); PWM_ConfigOutputChannel(PWMB, 0, 50, 100); } else if(value1 < 3000) { PWM_ConfigOutputChannel(PWMA, 1, 50, 100 - 10); PWM_ConfigOutputChannel(PWMA, 2, 50, 100 - 10); PWM_ConfigOutputChannel(PWMA, 3, 50, 100 - (value1 - 2000)/100); PWM_ConfigOutputChannel(PWMB, 0, 50, 100); } else { PWM_ConfigOutputChannel(PWMA, 1, 50, 100 - 10); PWM_ConfigOutputChannel(PWMA, 2, 50, 100 - 10); PWM_ConfigOutputChannel(PWMA, 3, 50, 100 - 10); PWM_ConfigOutputChannel(PWMB, 0, 50, 100 - (value1-3000)/100); }

13 PWM 모터 제어 PWM 을 이용하여 모터의 속도를 제어한다. 가변저항을 읽어서 속도를 제어한다. 13


Download ppt "PWM Test UNIT 20 로봇 SW 교육원 조용수. 학습 목표 PWM Init PWM LED 제어 2."

Similar presentations


Ads by Google