목차
타이머 / PWM
1. 실험 목적
2. 실험도구
3. 이론
⑴ 타이머 / 카운터에 대한 간단한 필요한 지식
⑵ 듀티비 가변 PWM(타이머0)
⑶ 듀티비 가변 PWM(타이머1)
⑷ 주기, 듀티비 가변 PWM
4. 실험 소스 코드 분석
⑴ EXP05.1.asm
⑵ EXP05.2.asm
⑶ EXP05.3.asm
4. 실험 예상
⑴ Exp05.1.asm
⑵ Exp05.2.asm
⑶ Exp05.3.asm
1. 실험 목적
2. 실험도구
3. 이론
⑴ 타이머 / 카운터에 대한 간단한 필요한 지식
⑵ 듀티비 가변 PWM(타이머0)
⑶ 듀티비 가변 PWM(타이머1)
⑷ 주기, 듀티비 가변 PWM
4. 실험 소스 코드 분석
⑴ EXP05.1.asm
⑵ EXP05.2.asm
⑶ EXP05.3.asm
4. 실험 예상
⑴ Exp05.1.asm
⑵ Exp05.2.asm
⑶ Exp05.3.asm
본문내용
저장한다.
LDI DH,high(125); set default PWM duty ratio
LDI DL,low(125)//DH, L에 125를 대입
OUT OCR1BH,DH; D(PWM) = 125/1250 = 10%
OUT OCR1BL,DL//OCR1B에 16비트 레지스터 값을 대입
;------------------------------------------------
;PWM Control by Key Input
;------------------------------------------------
READ_KEY:CALLKEY_IN; key input
CPIAL,0b11100000; if SW1, decrement duty ratio
//스위치 1번을 눌렀을시 듀티 ratio를 감소하게 하는 명령어
BRNECK_KEY2; ( DH:DL = DH:DL - 125 )
//위의 연산에 의해 Z flag 가 0이면 아래로 내려가고 1이면 CK_Key2 로 이동한다. 즉 스위치1이 안 눌러졌을 경우 CK_Key2로 간다.
CPIDH,0
BRNECK_KEY1A
//DH가 0이면 CK_KEY1A로 분기하고, 0이 아니면 아래로 간다.
CPIDL,0
BREQREAD_KEY
// DL이 0가 되면 다시 READ_KEY로 돌아가 키 입력 수행을 한다.
CK_KEY1A:SUBIDL,125
//DL에 즉치데이터 125를 감해준다.=> 스위치1이 눌러지고 1250에서 0으로 125씩 감소된다.
CLRAL //AL을 초기화 한다.
SBCDH,AL//DH-AL-C
RJMPCK_KEY2B//CK_KEY2B 로 상대점프
CK_KEY2:CPIAL,0b11010000; if SW2, increment duty ratio
BRNECK_KEY3; ( DH:DL = DH:DL + 125 )
CPDH,CH
BRNECK_KEY2A
CPDL,CL
BREQREAD_KEY
//스위치2번의 입력 코드로서 스위치 1번이 눌러졌을 때와 동일하다
CK_KEY2A:LDIAL,125
ADDDL,AL
CLRAL
ADCDH,AL
// 스위치 2번이 눌리면 듀티가 125만큼 증가하게 된다.
CK_KEY2B:OUTOCR1BH,DH; output duty ratio
OUT OCR1BL,DL
LDILCD_BUFFER,0xCA; display duty ratio
CALLLCD_COMMAND
MOVAH,DH
MOVAL,DL
CALLLCD_4DEC
RJMPREAD_KEY
// CK_KEY2B 전에 계산된 DH, DL의 결과물을 텍스트 LCD 2번째 줄에 10진수 4자리로 표현한다.
CK_KEY3:CPIAL,0b10110000; if SW3, decrement period
BRNECK_KEY4; ( CH:CL = CH:CL - 125 )
CPICH,0
BRNECK_KEY3A
//스위치3번이 눌러졌으면 아래로 계속가고 다른 스위치가 눌러졌을 경우 CK_KEY3A로 간다
CPICL,125
//CL에 125 가 감소 된다. CH, CL은 Period 다.
BREQREAD_KEY
//다시 키입력을 받을 준비를 한다.
CK_KEY3A:CPCH,DH //CH[주기], DH[듀티]를 뺀다.
BRNECK_KEY3B//연산 결과의 Z flag가 0이면 CK_Key3B로 가고 1이면 아래로 진행한다.
CPCL,DL
BREQREAD_KEY
CK_KEY3B:SUBICL,125//듀티에서 125를 뺀다.
CLRAL//AL을 초기화
SBCCH,AL//CH-AL-C
RJMPCK_KEY4B//CK_Key4B로 이동
CK_KEY4:CPIAL,0b01110000; if SW4, increment period
BRNEREAD_KEY; ( CH:CL = CH:CL + 125 )
CPICH,high(1250)
BRNECK_KEY4A
CPICL,low(1250)
BREQREAD_KEY
//스위치4번의 입력 코드로서 CH를 125만큼 증가시키는 입력 코드이며 CH-1250을 하여 Z flag가 0이면 CK_KEY4A로 이동하고 1이면 다시 입력을 받는다.
CK_KEY4A:LDIAL,125
ADDCL,AL
CLRAL
ADCCH,AL
// 스위치 4번이 눌리면 Period가 125만큼 증가하게 된다.
CK_KEY4B:OUTOCR1AH,CH; output frequency
OUT OCR1AL,CL
LDILCD_BUFFER,0x8A; display frequency
CALLLCD_COMMAND
MOVAH,CH
MOVAL,CL
CALLLCD_4DEC
RJMPREAD_KEY
// CK_KEY4B 전에 계산된 CH, CL의 결과물을 텍스트 LCD 2번째 줄에 10진수 4자리로 표현한다.
;====================================================================
;Include User Subroutine File
;====================================================================
.include "OK128SUB.INC"; include OK-128 subroutine file
4. 실험 예상
⑴ Exp05.1.asm
분기를 설정한 대로 51씩 듀티가 증가한다. 255까지 증가하면 다시 초기화 된다. 그와 동시에 LED 2가 껏다 켜진다. 0일 땐 꺼진다.
⑵ Exp05.2.asm
250부터 1250까지 증가한다. 1번 실험과 마찬가지로 LED2가 껏다 켜진다. 0일 때도 꺼진다.
⑶ Exp05.3.asm
위에는 스위치 1부터 4까지 있는데 실제 AVR을 이용할 때는
SW2 -> 주기 증가 (125씩)
SW3 -> 주기 감소 (125씩)
SW4 -> duty 증가 (125씩)
SW5 -> duty 감소 (125씩)
그리고 실제로 duty가 클수록 평균 전력 -> LED3의 밝기가 달라진다.
period가 작고 duty가 클수록 펄스들의 간격이 좁기 때문에 평균 전력이 상승한다. 그러므로 LED3에 들어가는 전력 또한 상승하므로 밝기가 증가하고, period가 크고 duty가 작을수록 펄스간의 간격이 커져서 평균 전력이 감소한다. 그러므로 LED3의 밝기는 줄어 들 것이다.
LDI DH,high(125); set default PWM duty ratio
LDI DL,low(125)//DH, L에 125를 대입
OUT OCR1BH,DH; D(PWM) = 125/1250 = 10%
OUT OCR1BL,DL//OCR1B에 16비트 레지스터 값을 대입
;------------------------------------------------
;PWM Control by Key Input
;------------------------------------------------
READ_KEY:CALLKEY_IN; key input
CPIAL,0b11100000; if SW1, decrement duty ratio
//스위치 1번을 눌렀을시 듀티 ratio를 감소하게 하는 명령어
BRNECK_KEY2; ( DH:DL = DH:DL - 125 )
//위의 연산에 의해 Z flag 가 0이면 아래로 내려가고 1이면 CK_Key2 로 이동한다. 즉 스위치1이 안 눌러졌을 경우 CK_Key2로 간다.
CPIDH,0
BRNECK_KEY1A
//DH가 0이면 CK_KEY1A로 분기하고, 0이 아니면 아래로 간다.
CPIDL,0
BREQREAD_KEY
// DL이 0가 되면 다시 READ_KEY로 돌아가 키 입력 수행을 한다.
CK_KEY1A:SUBIDL,125
//DL에 즉치데이터 125를 감해준다.=> 스위치1이 눌러지고 1250에서 0으로 125씩 감소된다.
CLRAL //AL을 초기화 한다.
SBCDH,AL//DH-AL-C
RJMPCK_KEY2B//CK_KEY2B 로 상대점프
CK_KEY2:CPIAL,0b11010000; if SW2, increment duty ratio
BRNECK_KEY3; ( DH:DL = DH:DL + 125 )
CPDH,CH
BRNECK_KEY2A
CPDL,CL
BREQREAD_KEY
//스위치2번의 입력 코드로서 스위치 1번이 눌러졌을 때와 동일하다
CK_KEY2A:LDIAL,125
ADDDL,AL
CLRAL
ADCDH,AL
// 스위치 2번이 눌리면 듀티가 125만큼 증가하게 된다.
CK_KEY2B:OUTOCR1BH,DH; output duty ratio
OUT OCR1BL,DL
LDILCD_BUFFER,0xCA; display duty ratio
CALLLCD_COMMAND
MOVAH,DH
MOVAL,DL
CALLLCD_4DEC
RJMPREAD_KEY
// CK_KEY2B 전에 계산된 DH, DL의 결과물을 텍스트 LCD 2번째 줄에 10진수 4자리로 표현한다.
CK_KEY3:CPIAL,0b10110000; if SW3, decrement period
BRNECK_KEY4; ( CH:CL = CH:CL - 125 )
CPICH,0
BRNECK_KEY3A
//스위치3번이 눌러졌으면 아래로 계속가고 다른 스위치가 눌러졌을 경우 CK_KEY3A로 간다
CPICL,125
//CL에 125 가 감소 된다. CH, CL은 Period 다.
BREQREAD_KEY
//다시 키입력을 받을 준비를 한다.
CK_KEY3A:CPCH,DH //CH[주기], DH[듀티]를 뺀다.
BRNECK_KEY3B//연산 결과의 Z flag가 0이면 CK_Key3B로 가고 1이면 아래로 진행한다.
CPCL,DL
BREQREAD_KEY
CK_KEY3B:SUBICL,125//듀티에서 125를 뺀다.
CLRAL//AL을 초기화
SBCCH,AL//CH-AL-C
RJMPCK_KEY4B//CK_Key4B로 이동
CK_KEY4:CPIAL,0b01110000; if SW4, increment period
BRNEREAD_KEY; ( CH:CL = CH:CL + 125 )
CPICH,high(1250)
BRNECK_KEY4A
CPICL,low(1250)
BREQREAD_KEY
//스위치4번의 입력 코드로서 CH를 125만큼 증가시키는 입력 코드이며 CH-1250을 하여 Z flag가 0이면 CK_KEY4A로 이동하고 1이면 다시 입력을 받는다.
CK_KEY4A:LDIAL,125
ADDCL,AL
CLRAL
ADCCH,AL
// 스위치 4번이 눌리면 Period가 125만큼 증가하게 된다.
CK_KEY4B:OUTOCR1AH,CH; output frequency
OUT OCR1AL,CL
LDILCD_BUFFER,0x8A; display frequency
CALLLCD_COMMAND
MOVAH,CH
MOVAL,CL
CALLLCD_4DEC
RJMPREAD_KEY
// CK_KEY4B 전에 계산된 CH, CL의 결과물을 텍스트 LCD 2번째 줄에 10진수 4자리로 표현한다.
;====================================================================
;Include User Subroutine File
;====================================================================
.include "OK128SUB.INC"; include OK-128 subroutine file
4. 실험 예상
⑴ Exp05.1.asm
분기를 설정한 대로 51씩 듀티가 증가한다. 255까지 증가하면 다시 초기화 된다. 그와 동시에 LED 2가 껏다 켜진다. 0일 땐 꺼진다.
⑵ Exp05.2.asm
250부터 1250까지 증가한다. 1번 실험과 마찬가지로 LED2가 껏다 켜진다. 0일 때도 꺼진다.
⑶ Exp05.3.asm
위에는 스위치 1부터 4까지 있는데 실제 AVR을 이용할 때는
SW2 -> 주기 증가 (125씩)
SW3 -> 주기 감소 (125씩)
SW4 -> duty 증가 (125씩)
SW5 -> duty 감소 (125씩)
그리고 실제로 duty가 클수록 평균 전력 -> LED3의 밝기가 달라진다.
period가 작고 duty가 클수록 펄스들의 간격이 좁기 때문에 평균 전력이 상승한다. 그러므로 LED3에 들어가는 전력 또한 상승하므로 밝기가 증가하고, period가 크고 duty가 작을수록 펄스간의 간격이 커져서 평균 전력이 감소한다. 그러므로 LED3의 밝기는 줄어 들 것이다.
추천자료
- 컴퓨터의 내부장치와 구조
- 컴퓨터를 통한 수학 학습과 수학적 오류의 진단·처방 문장제 학습에의 적용
- 컴퓨터 활용능력 요약
- 빌게이츠 기업가 사례보고서
- 병렬처리 컴퓨터
- 제 2.3.4세대 컴퓨터
- 컴퓨터의 이해 문제풀이 레포트
- 20세기에 영향을 끼친 인물 - 빌게이츠
- MS사의 독점 (마이크로 소프트)
- [레지스트리의 의미][레지스트리의 구조][레지스트리의 백업][레지스트리의 복구][레지스트리...
- 컴퓨터 공학과의 진보적 입장
- 전공 컴퓨터와 기초 - 7~80만우너 조립컴퓨터 구성, 인터넷 사기
- [Bill-Gates부터Steven-Ballmer까지]Microsoft의 성장과 Leadership의 변화
- 마이크로소프트 (MS : Microsoft) - 마이크로소프트 기업분석, 마이크로-소프트 창업, MS 운...