#include <project.h>
void PWM2_Init() { *AT91C_PMC_PCER = 1<<(AT91C_ID_PWMC); //clock into PWM *AT91C_PIOA_PPUDR = (AT91C_PA25_PWM2);//pull-up register disable *AT91C_PIOA_PDR = (AT91C_PA25_PWM2); //PIOA pin disable *AT91C_PIOA_BSR = (AT91C_PA25_PWM2); //Prepheral B 25(PWM2) enable *AT91C_PWMC_MR = (30 << DIVA) |(0x03<< PREA) | (30 << DIVB) |(0x03<< PREB); //200,000hz *AT91C_PWMC_CH2_CMR = AT91C_PWMC_CPRE_MCKA & (~AT91C_PWMC_CALG) & (~AT91C_PWMC_CPOL) & (~AT91C_PWMC_CPD); //channel mode register *AT91C_PWMC_CH2_CPRDR = MAXDUTY; //Channel Period Register *AT91C_PWMC_CH2_CDTYR = DEF_DUTY; //Channel Duty Cycle Register *AT91C_PWMC_ENA = AT91C_PWMC_CHID2; //PWMC Enable Register } //타이밍도 486 //파형의 왼쪽을 늘이고 줄이는 레지스터 CDTY //파형의 오른쪽을 조절하는 레지스터 CPRD void Set_Duty(int iDuty) //duty rate 조절 { if(iDuty > MAXDUTY) iDuty = MAXDUTY; else if( 0 > iDuty) iDuty = 0; //파형 중간에 듀티비를 수정할 수 없음으로 update register를 사용한다. *AT91C_PWMC_CH2_CUPDR = iDuty;//Channel Update Register
} |
동영상 - https://www.youtube.com/watch?v=a9irzMGpZFc&feature=youtu.be