BASIC4MCU | 질문게시판 | pwm 관련 질문입니다.
페이지 정보
작성자 동지 작성일2019-01-29 19:54 조회4,589회 댓글1건본문
/******************************************************************************/
/* PWMH0 641 Hz */
/******************************************************************************/
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
PMC->PMC_PCER1 |= PMC_PCER1_PID36; // PWM power ON
PIOC->PIO_PDR |= PIO_PDR_P3; // Set PWM pin to a peripheral
PIOC->PIO_ABSR |= PIO_PC3B_PWMH0; // Set PWM pin peripheral type B for PWMH0 (Arduino pin 35)
PWM->PWM_CLK = PWM_CLK_PREB(0) | PWM_CLK_DIVB(2); // select Frequency for clock B: Mck/2 = 42 MHz
PWM->PWM_CH_NUM[0].PWM_CMR = PWM_CMR_CPRE_CLKB; // The period is left aligned, clock source as CLKB on channel 0
PWM->PWM_CH_NUM[0].PWM_CPRD = 42; // Set the PWM frequency 42 MHz/PWM_CPRD = 1MHz
PWM->PWM_CH_NUM[0].PWM_CDTY = 21; // Set the PWM duty cycle = (CPRD/CDTY) * 100 %
PWM->PWM_IER1 = PWM_IER1_CHID0; // Interrupt on PWM Channel 0 counter
NVIC_EnableIRQ(PWM_IRQn); // Enable interrupt
PWM->PWM_ENA = PWM_ENA_CHID0; // Enable PWM channel 0
}
void loop() {
// update PWM frequency with PWM->PWM_CH_NUM[0].PWM_CPRDUPD = ....;
// update PWM duty cycle with PWM->PWM_CH_NUM[0].PWM_CDTYUPD = ....;
}
void PWM_Handler() {
static uint32_t Count;
PWM->PWM_ISR1; // Clear status register
if (Count++ == 641)
{
PIOB->PIO_ODSR ^= PIO_ODSR_P27;
Count = 0;
}
}
이게 제 아두이노 듀에 (arduino due) 코드입니다.
PWM->PWM_CH_NUM[0].PWM_CPRD;
PWM->PWM_CH_NUM[0].PWM_CDTY;이 코드를 이용해서 주파수와 듀티 사이클을 조절하는데요,
원하는 주파수의 pwm 을, 디지털 신호 같은 값으로 출력을 못하나요?
예를 들어서 pwm 은 50듀티 사이클이니까 1010101010... 이러케요.
제가 원하는 것은 원하는 시간에 이 신호를 키고 정보를 입력했다가 전송을 다하면 끄는거에요.
예를 들면 시리얼 포트로 1을 누루고 엔터를 누르면
100010100000000010 (디지털 신호는 즉 101100001)
다보내면 더이상 신호를 보내지 않는 방법으로요.
켜는 방법은 루프에서 1을 받으면, PWM->PWM_CH_NUM[0].PWM_CDTY; 를 조절하면 되었는데
디지털 신호와 끄는 방법은 모르겠어요.
방법이 있을까요??
(참고로 출력이 1MHz 에서 2MHz 사이입니다.)
댓글 1
조회수 4,589master님의 댓글
master 작성일
제가 듀에는 모릅니다.
데이터값을 시리얼로 전송하려면 시리얼통신으로 출력하세요
시리얼통신은 UART만 있는 것이 아니고 I2C와 SPI가 있습니다.
이 중에서 SPI를 사용하면 됩니다.