Download presentation
Presentation is loading. Please wait.
Published byAriel Pauline Owens Modified over 8 years ago
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.