질문게시판 > mega 2560에서 PWM 출력 100khz

TODAY1,693 TOTAL2,426,080
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | mega 2560에서 PWM 출력 100khz

페이지 정보

작성자 토브플래그 작성일2021-10-27 21:09 조회6,105회 댓글2건

첨부파일

본문

	

안녕하세요

메가 2560에서 pwm 출력핀을 100khz로 만드는 과정에서 궁금한 점이 있어 글 남깁니다.

 

먼저 코드는 다음과 같습니다.

 

#include <PWM.h>

 

 

int ABC = 8;

int BCD = 7;

int CDE = 3;

int DEF = 2;

int EFG = 12;

int FGH = 11;

int32_t Fre = 100000;

 

 

 

void setup()

{

  InitTimersSafe();

  Serial.begin(9600);

 

  SetPinFrequencySafe(ABC, Fre);

  SetPinFrequencySafe(BCD, Fre);

  SetPinFrequencySafe(CDE, Fre);

  SetPinFrequencySafe(DEF, Fre);

  SetPinFrequencySafe(EFG, Fre);

  SetPinFrequencySafe(FGH, Fre);

 

 

  pinMode(8, OUTPUT);

  pinMode(7, OUTPUT);

  pinMode(3, OUTPUT);

  pinMode(2, OUTPUT);

  pinMode(4, OUTPUT);

  pinMode(12, OUTPUT);

  pinMode(11, OUTPUT);

 

}

 

void loop()

{

 

  pwmWrite(ABC, 127);

  pwmWrite(BCD, 127);

  pwmWrite(CDE, 127);

  pwmWrite(DEF, 127);

  pwmWrite(EFG, 127);

  pwmWrite(FGH, 127);

 

 

}

 

-------------------------

이럴경우 100khz가 3,8,11,12번 핀에서 50%duty,100khz가 나왔습니다.

여기서 질문입니다.

 

1. 다른 위 핀을 제외한 2번 핀과 7번 핀에는 왜 100khz가 안나올까요?

- 저렇게 같은 타이머의 핀을 2개씩 쓴 이유는 1개씩만 쓸 경우 출력이 제대로 나오지 않고

  다른 타이머의 핀에도 출력에 영향이 가게되어 제대로 출력이 나오지 않아 그 이유를 모르겠습니다.

 

2. 100khz의 출력을 반전시키기 위해(기존 pwm과 위상 180도 차이 나게) 코딩하는 방법은 없을까요?

- 시간 함수와 밀리 함수가 통하지 않는 것 같습니다. 그렇다면 PWM.h 헤더파일을 이용하면 출력 반전이 불가능할까요?

 

3. 앞으로 1000khz의 삼각파와 100khz의 사인파를 만들 생각인데 PWM.h를 이용하여 구성이 가능할까요? 

 

사용한 헤더파일은 첨부파일에 올려놓았습니다.

감사합니다.

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 2

조회수 6,105

토브플래그님의 댓글

토브플래그 작성일

제가 공부가 부족하여 잘 쓰지 않는 라이브러리를 가지고와서 질문을 드린것같네요
6시간넘게 데이터시트 하나하나 검색하고 직접 의미를 알아가면서 배워서 100khz 출력과 반전이 나오는 코딩을 알게되었습니다.
-------------------------------------------
const uint8_t pin_A = 6; //OC4A
const uint8_t pin_B = 11; //OC1A
const uint8_t pinInv_A = 7; //OC4B
const uint8_t pinInv_B = 12 //OC1B

void setup() {
  Serial.begin(9600);

  pinMode(pin_A, OUTPUT);
  pinMode(pin_B, OUTPUT);
  pinMode(pinInv_A, OUTPUT);
  pinMode(pinInv_B, OUTPUT);

  TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1B0) | _BV(WGM11); //1010 0010
  TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10);//0001 1001

  ICR1 = 0x9F; //160
  OCR1A = 0xA0 >> 1; //1010 0000을 1비트 우측이동
  OCR1B = 0xA0 >> 1; //1010 0000을 1비트 우측이동

  TCCR4A = _BV(COM4A1) | _BV(COM1B1) | _BV(COM4B0) | _BV(WGM31); //1010 0010
  TCCR4B = _BV(WGM33) | _BV(WGM32) | _BV(CS30); //0001 1001

  ICR4 = 0x9F; //160
  OCR4A = 0xA0 >> 1; //1010 0000을 1비트 우측이동
  OCR4B = 0xA0 >> 1; //1010 0000을 1비트 우측이동

}
void loop() {
}
------------------------
이제 100khz의 삼각파나 사인파를 만드는 법을 알아보러 가겠습니다.
멍청한 질문글을 읽어주셔서 감사합니다. (꾸벅)

master님의 댓글

master 댓글의 댓글 작성일

반전 시키는 것은 TCCRxA 레지스터의 COMxx 비트를 설정하면 됩니다.
이미 제대로 설정하고 있군요
//
100khz면 10us 주기입니다.
짧은 시간이죠
삼각파와 사인파를 계산으로 만드는 것은 시간상 맞지 않으며
미리 테이블(상수 배열)을 만들어놓고 차례대로 읽어서 OCR 레지스터에 입력하는 식으로 해야만 가능합니다.
사인파는 반드시 테이블을 사용해야 하지만
삼각파는 1씩 증가시켜서 출력하는 경우 테이블이 필요없이 증가연산을 하면 되겠죠

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
질문 stm32 pwm구동 여부 질문입니다.댓글[6] 손문일 22-06-08 8117
질문 pwm 출력과 ad conversion 과정댓글[18] 이미지첨부파일 412904 22-05-05 28841
게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기