Порывшись в инете, нашел схему, частично реализующую поставленную задачу, а именно синус на выходе (с дальнейшей раскачкой пуш-пулл).
Только здесь частота генерируется самим МК и задается потенциометром, а не синхронизацией внешним сигналом.
Выходная часть полностью устраивает. Но ведь ассемблер...
Код: Выделить всё
;*************************************************
; ГЕНЕРАТОР УПРАВЛЯЕМОЙ СИНУСОИДЫ.
;*************************************************
.include "tn13def.inc"
; управление частотой с помощью OSCCAL.
; ИМЕНА РЕГИСТРОВ.
.def ZER = r14 ;
.def TMP_0 = r16 ;
.def TMP_1 = r17 ;
.def POL = r22 ;
.def FASE = r23 ;
.def SOST = r24 ;
.def AD_H = r25 ;
; ВЫХОДЫ/ВХОДЫ.
.equ Out_A = 0 ;
.equ Out_B = 1 ;
;**************************************
.cseg
.org $000
rjmp Reset ;
; .org TIM0_OVF0addr ; по переполнению Т0.
.org TIM0_COMPAaddr
rjmp ObnA ;
.org TIM0_COMPBaddr
rjmp ObnB ;
.org ADCaddr ;
rjmp Speed ;
;***********************************************
.org $00A
Reset: ; инициализация.
ldi TMP_0,low(RAMEND) ; указание
out SPL,TMP_0 ; вершины
clr ZER ; =0.
clr SOST ; =0.
clr FASE ; =0.
clr POL ; =0.
out OSCCAL,ZER ;
clr ZH ;
rcall Pio ;
rcall T_0 ;
rcall AD_u ;
sei
;*********************************
Main:
rjmp Main ;
;*********************************
ObnA:
ObnB:
ldi ZL,low(2*Sin) ;
add ZL,FASE ;
lpm ;
sbrc POL,0 ;
rjmp Negat ;
; положительная полуволна.
out OCR0A,r0 ;
rcall Sos_t ;
reti
Negat: ; отрицательная полуволна.
out OCR0B,r0 ;
rcall Sos_t ;
reti
;********
Sos_t: ; ФАЗИРОВКА.
; положительная полуволна.
inc SOST ;
mov FASE,SOST ;
cpi SOST,25 ;
brsh Neg_fa ;
ret
Neg_fa: ;
; отрицательная полуволна.
ldi POL,$01 ;
ldi TMP_1,(1<<OCF0B) ;TOV0 |
out TIFR0,TMP_1 ;
out TIMSK0,TMP_1 ;
ldi TMP_0,(1<<COM0B1|1<<COM0B0|1<<WGM01|1<<WGM00);
out TCCR0A,TMP_0 ;
cpi SOST,49 ;
brsh Nach ;
subi FASE,24 ;
ret
Nach: ; зацикливание.
; clr SOST ; =0.
; clr FASE ; =0.
ldi SOST,$01 ;
ldi FASE,$01 ;
clr POL ; =0.
ldi TMP_1,(1<<OCF0A) ; 1<<OCF0B|
out TIFR0,TMP_1 ;
out TIMSK0,TMP_1 ;
ldi TMP_0,(1<<COM0A1|1<<WGM01|1<<WGM00);
out TCCR0A,TMP_0 ;
ret
;**************************************
Speed: ; ПРЕРЫВАНИЕ АЦП.
; установка частоты синусоиды.
;**************************************
in TMP_1,ADCH ;
lsr TMP_1 ;
out OSCCAL,TMP_1 ;
reti
;************************************
; ИНИЦИАЛИЗАЦИЯ.
;************************************
Pio:
ldi TMP_0,(1<<Out_B) ;
out PortB,TMP_0 ;
ldi TMP_1,(1<<Out_A|1<<Out_B);
out DDRB,TMP_1 ;
ret
;***********
T_0:
out GTCCR,ZER ;
out TCNT0,ZER ;
ldi TMP_0,(1<<COM0A1|1<<WGM01|1<<WGM00);
out TCCR0A,TMP_0 ;
out OCR0A,ZER ;
out OCR0B,ZER ;
ldi TMP_1,(1<<OCF0B) ;TOV0 1<<OCF0B|
out TIFR0,TMP_1 ;
out TIMSK0,TMP_1 ;
ldi TMP_0,(1<<CS00) ;
out TCCR0B,TMP_0 ;
ret
;***********
AD_u:
out DIDR0,ZER ;
out ADCSRB,ZER ;
ldi TMP_0,(1<<ADLAR|1<<MUX1); вход 2 РВ4.
out ADMUX,TMP_0 ;
ldi TMP_0,(1<<ADEN|1<<ADSC|1<<ADATE|1<<ADIF|1<<ADIE|1<<ADPS2|1<<ADPS1|1<<ADPS0);
out ADCSRA,TMP_0 ;
ret
;**************************************
.org $60
Sin: ; таблица синуса.
;
.db 1,33,65,96,125,152,177,198
.db 217,231,241,248,250,248,241,231 ;
.db 217,198,177,152,125,96,65,33
.db 1