BASIC4MCU | 질문게시판 | AVR PWM 질문
페이지 정보
작성자 master 작성일2019-12-25 21:36 조회3,551회 댓글0건본문
Q)
스위치 2개로 하나를 눌를때마다 펄스 주기 빨라지고, 하나를 누를 때마다 펄스주기가 느려지게
펄스폭 제어 프로그램 하나만 만들어주세요.
atmega128 ,구동 avr studio
//
A)
PWM은 펄스 주기를 느리게 빠르게 제어 하는 것이 아니고 듀티를 조정 하는 것입니다.
char pwm=0;
while(1){
if(SW1==0){
if(pwm<100)pwm++;
while(SW1==0); // 스위치에서 손을 뗄 때까지 대기
}
if(SW2==0){
if(pwm>0)pwm--;
while(SW2==0);
}
_delay_ms(100); // 채터링방지용 딜레이
}
스위치 체크는 이정도면 될겁니다.
pwm 변수 값으로 PWM제어를 하면 됩니다.
RC서보 & DC모터 FAST PWM 모드14 구동
//=====================================================================//
//DC모터 - 타이머3 FAST PWM MODE14로 구동
//=====================================================================//
//=====================================================================//
#include <avr/io.h> //16MHz
#include <util/delay.h>
//=====================================================================//
void DC_Motor(int speed){ // speed : 0% ~ 100%
if(speed>100)speed=100;
OCR3AH=0; OCR3AL=speed; //쓰기는 H먼저 L나중, 읽기는 L먼저 H나중
OCR3BH=0; OCR3BL=speed;
}
//=====================================================================//
int main(void){
int pwm=0;//DC모터
DDRE=0x18; // PE3,4 out
TCCR3A=0xAA; // FAST PWM
TCCR3B=0x1D; // 1024분주=64usec
OCR3AH=0; OCR3AL=0; // 정지
OCR3BH=0; OCR3BL=0; // 정지
ICR3L=100; // 64usec*100=6400usec=156.25Hz
//
while(1){
if((PINA&1)==0){if(pwm<100)pwm++;
DC_Motor(pwm);
while((PINA&1)==0); // 스위치에서 손을 뗄 때까지 대기//}
if((PINA&2)==0){
if(pwm>0)pwm--;
DC_Motor(pwm);
while((PINA&2)==0);}
_delay_ms(100); // 채터링방지용 딜레이
}
}
//=====================================================================//[출처] RC서보 & DC모터 FAST PWM 모드14 구동 (전자공작) |작성자 키트
위 출처의 코드비젼 예제를 AVRStudio용으로 수정 했습니다.
댓글 0
조회수 3,551등록된 댓글이 없습니다.