BASIC4MCU | 질문게시판 | 답변 : RPM값을 계산하여 주파수에 맡는 PWM출력 하기?
페이지 정보
작성자 master 작성일2018-12-21 12:52 조회4,717회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=7173
본문
atmega PWM 제어
이런 방식으로 PWM 제어를 하려고 하는데.. 도저희 어떤식으로 해야할지 감이 안잡혀서요.
도와주셨으면 합니다.
목표 주파수는 80HZ 입니다.
펄스만 출력해 내면 될것같아요.
마이컴은 ATMEGA 2560 사용중이구요. OC4A 사용하려고 합니다 - PH3
C언어로 IAR 사용중입니다.
타이머1을 제외하고 나머지 인터럽트 사용 예정입니다.
부탁드립니다
//---------------------------------
정속 구간은 어려움이 없을테고요
가속및 감속 구간이 문제겠죠?계산하기 좋게 PWM 100%에서 100Hz라고 가정해보죠이하 Hz를 모듀 듀티로 변경해서 설명하겠습니다.20%/s = 초당 20%듀티 증가sec당 26%듀티까지 1.3초가 걸립니다.PWM 주기가 아주 빠르다고 가정하고1ms 마다 듀티를 변경한다고 하면초당 20% 듀티 증가는 ms당 0.02% 듀티증가입니다.이 것을 1.3초동안 증가시켜야지 26% 듀티까지 도달하므로 ms단위로 제어 할 때에는 1300번 루프를 돌면 되겠죠for(i=0;i<1300;i++){OCR4A=duty+0.02;_delay_ms(1);}while()문으로 작성해도 되겠습니다.while(duty<26){duty+=0.02;OCR4A=duty;_delay_ms(1);}정속주행은 단순히 딜레이만 주면 되고_delay_ms(10000); // 10초동안 26% 정속주행26%~53%까지 중가하는데 초당 3%면ms당 0.003%입니다.이 것도 while()문으로 만들어볼까요?while(duty<53){duty+=0.003;OCR4A=duty;_delay_ms(1);}for(i=0;i<120;i++)_delay_ms(1000); // 120초동안 53%로 정속주행마지막은 93%까지 일까요?while(duty<93){duty+=0.002; // 2%/s 증가OCR4A=duty;_delay_ms(1);}//감속은 기본 듀티에서 빼주면 되겠죠?while(duty>20){duty-=0.02; // 20%/s 감소OCR4A=duty;_delay_ms(1);}위에서 듀티와 Hz를 동일하게 놓고 계산했는데만약 다르다면 적당한 상수를 곱해주면 되겠죠위에서 1ms 단위로 제어를 하고 있는데PWM 주기가 1ms 보다 짧을 수록 제어정밀도가 높아지며PWM 주기를 보고서 적당한 제어주기를 찾으세요
댓글 0
조회수 4,717등록된 댓글이 없습니다.