文档库 最新最全的文档下载
当前位置:文档库 › AVR汇编百例 - 脉宽调制(PWM)

AVR汇编百例 - 脉宽调制(PWM)

AVR汇编百例 - 脉宽调制(PWM)
AVR汇编百例 - 脉宽调制(PWM)

;脉宽调制(PWM)输出程序

;范例50 ;以定时器定时产生精确半秒信号,以PD5输出精确秒号.ORG $000 ;晶体实测频率为8000367HZ

STRT40: RJMP RST40 ;USE 8535

.ORG $008 ;t/C1 overflow vector

RJMP T1_OVF

.ORG $011

RST40: LDI R16,HIGH(ramend)

OUT SPH,R16

LDI R16,LOW(ramend)

OUT SPL,R16

SBI DDRD,5 ;PD5(OC1A)为输出

CBI PORTD,5 ;初始输出为低

LDI R16,2 ;8分频INT(8000367/8)=1000046) 折半500023定半秒

OUT TCCR1B,R16 ;T/C1控制寄存器(I/O ADDR:$2E)

LDI R16,$5E ;500023=65536*8-24265=$10000*8-$5EC9

OUT TCNT1H,R16 ;TCC=$5EC9 先写高位字节

LDI R16,$C9

OUT TCNTIL,R16

LDI R16,$04

OUT TIMSK,R16 ;允许T/C1溢出中断/8535C/t1:timsk,2&t0:timsk,0

LDI R17,8 ;8次中断定半秒

CLR R16

OUT TIFR,R16 ;清除定时/计数器中断标志

SEI ;

HH40: RJMP HH40 ;背景程序略

T1_OVF: IN R5,SREG ;保存状态寄存器

DEC R17

BRNE COMP1 ;定时时间到?

IN R16,PORTD ;读入PD5当前状态

LDI R17,$20

EOR R16,R17 ;求反PD5(OC1A)输出

OUT PORTD,R16

IN R17,TCNT1L ;*

IN R16,TCNT1H ;*读回TCNT1计数值

SUBI R17,$37 ;*

SBCI R16,$A1 ;*减去$5EC9之补码$A137

SUBI R17,$FF ;*补偿指令8条占一个计数单位

SBCI R16,$FF ;*补偿后TCC=$5EC9+(TCNT1)+1

OUT TCNT1H,R16 ;*

OUT TCNT1L,R17 ;*写入TCNT1

LDI R17,8 ;重新写入中断次数

COMP1: OUT SREG,R5

RETI

;范例51 ;以比较匹配A达到时交替输出高低电平及写入其维持

;时间常数之方法实现脉宽调制输出

.ORG $000

STRT41: RJMP RST41 ;5.008MS(高):10.000MS(低) 晶振4MHZ .ORG $006

RJMP T1_CMPA ;USE 8535

.ORG $011

RST41: LDI R16,HIGH(RAMEND)

OUT SPH,R16

LDI R16,LOW(RAMEND)

OUT SPL,R16

LDI R16,$80 ;T/C1比较匹配A达到时,清除输出脚oc1a

OUT TCCR1A,R16

LDI R16,$0B ;64分频ctc1=1 比较匹配达到清tcnt1

OUT TCCR1B,R16

SBI DDRD,5

SBI PORTD,5 ;pd5(oc1a)初始化输出为高

CLR R16

OUT TCNT1H,R16 ;予清除tcnt1

OUT TCNT1L,R16

LDI R16,1

OUT OCR1AH,R16

LDI R16,$39 ;写比较匹配寄存器(313*0.25*64=5.008MS)

OUT OCR1AL,R16

LDI R16,$10

OUT TIMSK,R16 ;允许比较匹配A中断

SEI

HH41: RJMP HH41 ;背景程序略

T1_CMPA:IN R5,SREG

IN R16,TCCR1A

SBRS R16,6

RJMP OUTLOW ;当前输出低电平,转

LDI R16,1

OUT OCR1AH,R16

LDI R16,$39 ;写入高电平维持时间313

OUT OCR1AL,R16

LDI R16,$80 ;比较匹配A达到时,OC1A输出为低

OUT TCCR1A,R16

OUT SREG,R5

RETI

OUTLOW: LDI R16,2

OUT OCR1AH,R16

LDI R16,$71 ;写入低电平维持时间625(=$271) (625*0.25*64=10.000MS) OUT OCR1AL,R16

LDI R16,$C0 ;比较匹配A达到时,OC1A输出为高

OUT TCCR1A,R16

OUT SREG,R5

RETI

;范例52 ;以比较匹配达到时求反输出并按高低电平写入.ORG $000 ;维持时间之方法实现脉宽调制输出

STRT42: RJMP RST42 ;5.008MS(高):10.000MS(低) 晶振4MHZ .ORG $006

RJMP T1_CMPA

.ORG $011

RST42: LDI R16,HIGH(ramend)

OUT SPH,R16

LDI R16,LOW(RAMEND)

OUT SPL,R16

LDI R16,$40 ;比较匹配A达到时,对OC1A输出求反

OUT TCCR1A,R16

LDI R16,$0C ;256分频ctc1=1 比较匹配达到时清除cnt1 OUT TCCR1B,R16

SBI DDRD,5 ;PD5(oc1a)为输出

SBI PORTD,5 ;初始输出为高

CLR R16

OUT TCNT1H,R16 ;清除tcnt1

OUT TCNT1L,R16

OUT OCR1AH,R16

LDI R16,78 ;高电平时间常数78

OUT OCR1AL,R16

LDI R16,$10

OUT TIMSK,R16 ;允许比较匹配A中断

SEI

HH42: RJMP HH42 ;背景程序略

T1_CMPA:IN R5,SREG ;

IN R16,PORTD

SBRC R16,5

RJMP T1CM1 ;当前oc1a为高,转

LDI R16,0

OUT OCR1AH,R16

LDI R16,156 ;低电平时间常数156

OUT OCR1AL,R16

OUT SREG,R5

RETI

T1CM1: LDI R16,0

OUT OCR1AH,R16

LDI R16,78 ;高电平时间常数78

OUT OCR1AL,R16

OUT SREG,R5

RETI

;模/数转换和数/模转换及脉宽调制输出应用

;范例53 ;模拟量采集和3路脉宽调制输出(OCR1A/OCR1B&OCR2)综合程

;序/晶振4MHZ

.ORG $000

STRT50: RJMP RST50 ;avr is AT90S8535

.ORG $00E

RJMP ADCOM ;模数转换完成中断

.ORG $011

RST50: LDI R16,HIGH(ramend)

OUT SPH,R16

LDI R16,LOW(ramend)

OUT SPL,R16 ;堆栈指针初始化

CLR R11 ;通道号初始化

CLR R12

CLR R13 ;累加和予清除

OUT $07,R11 ;ADC通道初始化,指向0#通道

LDI R16,$6C ;T/C2为自运行pwm输出,加法计数匹配清除OC2,减法计

;数匹配置位OC2(正向PWM);对晶振64分频

OUT TCCR2,R16 ;tccr2' ADDR.:$25

LDI R16,$ED ;使能,启动ADC/自由运行/转换完成中断/对晶振32分频

OUT ADCSR,R16 ;ADDR:$06 adc控制状态寄存器

IN R16,ASSR

CBR R16,8

OUT ASSR,R16 ;TCNT2 用主时钟!

INC R11

OUT $07,R11 ;予切换到1号ADC通道

SBI DDRD,4

SBI PORTB,4 ;pd4:oc1b

SBI DDRD,5 ;pd5:oc1a pd4,pd5 皆为输出oc1b初始输出为高

SBI DDRD,7 ;oc2 输出

LDI R16,$E3 ;0B11100011,自运行PWM,COM1A1/0=11,COM1B1/0=10 OUT TCCR1A,R16 ;减法计数匹配清除OC1A,加法计数匹配置位OC1A(反向PWM);加法计

;数匹配清除OC1B,减法计数匹配置位OC1B(正向PWM)LDI R16,2

OUT TCCR1B,R16 ;tcnt1 8分频

LDI R16,0

OUT TCNT1H,R16 ;wr.high B at first

OUT TCNT1L,R16 ;清除TCNT1

OUT TCNT2,R16 ;清除TCNT2

OUT DDRA,R16 ;A口输入

OUT PORTA,R16 ;输入为高阻态

SEI

COMLP: CPI R11,1

BREQ COMLP ;通道号初始为1,等待切换过去

COML0: CPI R11,1

BRNE COML0 ;通道号再次为1时,0#通道正在转换,7#通道已转换完毕,;已得到8个A/D采样累加和

ASR R12

ROR R13

ASR R12

ROR R13

ASR R12

ROR R13 ;累加和除以8

BRCC COML1

CLR R16

ADC R13,R16

ADC R12,R16 ;四舍五入

COML1: OUT OCR1AH,R12

OUT OCR1AL,R13

OUT OCR1BH,R12

OUT OCR1BL,R13 ;10位数据写入比较匹配寄存器

ASR R12

ROR R13

ASR R12

ROR R13

BRCC COML2

INC R13

BRNE COML2

DEC R13

COML2: OUT OCR2,R13 ;8位数据写入比较匹配寄存器

CLR R12

CLR R13 ;累加和清除

RJMP COMLP

ADCOM: IN R15,ADCL ;ADC完成中断

IN R14,ADCH

ADD R13,R15 ;模拟数值加入累加和

ADC R12,R14

INC R11

SBRC R11,3

CLR R11 ;total 8 chanales!&8 CHANGED TO 0

OUT $07,R11 ;$07:admux'address REGISTER

RETI

;范例54 ;以R-2R电阻网络和C口配合组成DAC与输入模拟量比较实现模数转换

.ORG $000 ;电阻网络DAC最大输出(AIN0)只能达到3.32V(PCi输出只能达到5V)

STRT51: RJMP RST51 ;输入模拟量最大为4.98V,故应将DAC输出放大1.5倍再与前者比较

.ORG $011 ;也可将输入模拟量衰减为2/3再与DAC输出比较

RST51: LDI R16,2 ;但应将转换结果乘以1.5以使其复原,程序取后者OUT SPH,R16 ;堆栈指针初始化

LDI R16,$5F

OUT SPL,R16

SER R16

OUT DDRC,R16 ;C口全部为输出,DAC输出为AIN0输入

CLR R16

OUT DDRB,R16 ;B口为输入

LDI R16,$F3

OUT PORTB,R16 ;PB2(AIN0),PB3(AIN1)输入为高阻状态

CLR R15 ;模数转换结果予清除

LDI R16,$80 ;逼近增量初始值

CMPLP: ADD R15,R16 ;模数转换阶段值加逼近增量

OUT PORTC,R15 ;转成模拟量

NOP

NOP

NOP ;4MHZ/等待1微秒

SBIC ACSR,ACO ;输入模拟量大于DAC模拟量,清除ACO

SUB R15,R16 ;否则去掉逼近增量

LSR R16 ;逼近增量折半

BRNE CMPLP ;逼近增量变为0?

MOV R16,R15 ;*是,转换结束

LSR R15 ;*

ADC R15,R16 ;*将转换结果乘以1.5

HH50: RJMP HH50 ;背景程序略

范例55 ;40点平均在r18r19,累加和在r5r6r7;20点平均在R14R15,累加和在R1R3R4 SLPA V: PUSH R26 ;采样在R8R9,采样数据存储区$150--$19F/工作寄存器r1--r19&r26 r27

PUSH R27

LDI R27,1

LDS R26,$14F ;数据存储区首地址$14F

ADD R7,R9

ADC R6,R8 ;采样加入40点平均累加和

BRCC SLP1

INC R5 ;有进位,高位字节增1

ADC R3,R8 ;采样加入20点平均累加和

BRCC SLP2

INC R1 ;有进位,高位字节增1

SLP2: LD R16,X

ST X+,R9

MOV R9,R16 ;置换出最旧采样低位字节

LD R16,X

ST X+,R8

MOV R8,R16 ;置换出最旧采样高位字节

CPI R26,$A0

BRNE SLPA1

LDI R26,$50 ;采样放满存储区后,指针初始化($1A0=$150)

STS $14F,R26

LDS R16,$A4

SBRC R16,4

RJMP SLPA2 ;40点平均时间达到,转

SBR R16,$10 ;设置40点平均时间达到标志

STS $A4,R16

RJMP SLDIV ;转去计算40点平均

SLPA1: STS $14F,R26 ;暂存指针

LDS R16,$A4

SBRS R16,4

RJMP SLPB0 ;还未到40点平均,转

SLPA2: SUB R7,R9

SBC R6,R8 ;到40点平均后除加上新采样外,还要减去最旧采样BRCC SLDIV

DEC R5 ;不够减,高位字节减1

SLDIV: CLR R12

LDI R16,40

MOV R11,R16

CLR R10

MOV R13,R5

MOV R14,R6

MOV R15,R7

RCALL DIV165 ;计算40点平均

MOV R18,R14

MOV R19,R15 ;存入r18r19

SLPB0: CPI R26,$78

BRNE SLPB1

LDS R16,$A4

SBRC R16,3

RJMP SLPB2

SBR R16,8 ;建20点平均时间到标志

RJMP SLPDV ;

SLPB1: LDS R16,$A4

SBRS R16,3

RJMP SLRET ;20点平均时间未到

SLPB2: SUBI R26,42 ;指针退回42字节,指向20点平均最旧数据CPI R26,$50 ;不小于80,未超出采样数据存储区

BRCC SLPB20

SUBI R26,-80 ;否则加80调整回$150-$19F

SLPB20: LD R11,X+ ;

LD R10,X

SUB R4,R11

SBC R3,R10 ;找到20点平均最旧采样,并将其从累加和中减去!

BRCC SLPDV

DEC R1

SLPDV: LDI R16,20

MOV R11,R16

CLR R10

CLR R12

MOV R13,R1

MOV R14,R3

MOV R15,R4

RCALL DIV165 ;20点平均在r14r15中

SLRET: POP R27

POP R26

RET

相关文档