AVR单片机的定时器功能非常强大,除了一般的定时、计数功能外,还具有PWM波形发生,捕获和比较等功能。本实验演示AVR单片机的定时器产生PWM波形的方法。我们配置定时器1(Timer1)工作在10位相位修正PWM波形产生模式。该程序用AVR- Studio-4 开发,在AVR单片机Atmega48上调试通过。 ;-------------------------------------------------------------------------------------------------- .org $0000 rjmp _main .org $0020 _port_init: ; PORTB = 0x00; _timer1_init:clr R2 out 0x5,R2 ; DDRB = 0x06; ldi R24,6 out 0x4,R24 ; PORTC = 0x00; out 0x8,R2 ; DDRC = 0x00; out 0x7,R2 ; PORTD = 0x00; out 0xb,R2 ; DDRD = 0x00; out 0xa,R2 ret ; TCCR1B = 0x00; //stop _adc_init:clr R2 sts 129,R2 ; TCNT1H = 0xFC; //setup ldi R24,252 sts 133,R24 ; TCNT1L = 0x01; ldi R24,1 sts 132,R24 ; TCCR1A = 0xE3; ldi R24,227 sts 128,R24 ; TCCR1B = 0x03; //start Timer ldi R24,3 sts 129,R24 ret ; 设置前,先关闭ADC _adc_get:clr R2 sts 122,R2 ; 选择内部AVCC为基准 ldi R24,64 sts 124,R24 ; 关闭模拟比较器 ldi R24,128 out 0x30,R24 ; 使能ADC,启动ADC单次转换,选64分频 ldi R24,198 sts 122,R24 ret ; 启动ADC转换 L5:lds R24,122 ori R24,64 sts 122,R24 lds R2,122 _main:sbrc R2,6 rjmp L5 lds R16,120 lds R17,120+1 ret rcall _port_init L9:rcall _timer1_init rcall _adc_init ; adc_v = adc_get(); //ADC转换 rcall _adc_get ; lt = 1023 - adc_v; ldi R24,0xff ldi R25,3 movw R12,R24 sub R12,R16 sbc R13,R17 ; rt = 1023 - adc_v; sub R24,R16 sbc R25,R17 movw R10,R24 ; ; OCR1A = lt; sts 136+1,R13 sts 136,R12 ; OCR1B = rt; sts 138+1,R11 sts 138,R10 rjmp L9 ret |
联系客服