Свежие обсуждения
Измерения

Селективный усилитель низкой частоты

1 6 9

Ходил вокруг да около DDS AD9833, не верил что будет генерить 0,1Гц. Купил, собрал тестовую плату - генерит, как заявлено cool Теперь можно и полосу усилка посмотреть 0,1 - 10Гц

 
vintik: Теперь можно и полосу усилка посмотреть 0,1 - 10Гц

И куда это потом приткнуть?

 

Сделал делитель из двух резисторов 10к и 0,1 Ом. Отношение 100001:1. DDS генератор выдает 624мВ, после делителя 6.239 мкВ. На выходе селективного усилителя 3240мВ, усиление 519314 раз. Полоса пропускания по уровню 0,7 составила  0,2 - 9Гц.

И картинки для наглядности.




Запитать МК и DDS пришлось от батарейки. По тому, как наводка от программатора просто замазала всю полезную информацию.

 

Почему осциллограмма такая страшная на 9 Гц?
Какая модель Сиглента?

 

SDS1102CML 
Страшная потому, что не растянул, при уменьшении длительности развертки всё красиво.

 

Если есть счастливые обладатели такой-же демоплаты, выкладываю исходник на асме.

;******************************************************************************
; Управление DDS генератором AD9833.
; По включению питания устанавливается частота генератора 0,1 Гц
; Шкала светодиодов не светится, в таблице частоте 0,1 Гц соответствует нулевая позиция.
; После клика по кнопке частота соответствует первой позиции 0,2 Гц и светит первый светодиод.
; Последующие нажатия кнопки переключают частоту до 11 позиции (100 Гц) с
; соответствующим отображением на шкале светодиодов в двоичном формате.
; Двенадцатое нажатие возвращает генератор к 0.1 Гц (нулевая позиция).
; Частоты:
; 0 - 0,1Гц
; 1 - 0,2Гц
; 2 - 0,4Гц
; 3 - 1Гц
; 4 - 2Гц
; 5 - 4Гц
; 6 - 9Гц
; 7 - 16Гц
; 8 - 24Гц
; 9 - 32Гц
; 10 - 50Гц
; 11 - 100Гц
; AD9833| Demo Board
; UCC | Vdd
; DGND | Gnd
; SDATA | RC0
; SCLK | RC1
; FSYNC | RC2
; AGND | общий для делителя напряжения
; OUT | вход делителя напряжения.
; *******************************************************************
; * See 44-pin Demo Board *
; *******************************************************************
list p=16F887 ; list directive to define processor
#include <p16F887.inc>
errorlevel -302 ; suppress message 302 from list file

__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V

cblock 0x20
Val_1 ; Значение старшего байта
Val_0 ; Значение младшего байта
Count_bit
Delay ; Assign an address to label Delay1
Display ; define a variable to hold the diplay
LastStableState ; keep track of switch state (open-1; closed-0)
Counter
endc

ORG 0x000 ; processor reset vector
goto INIT_MCU ; go to beginning of program

ORG 0x004 ; interrupt vector location
retfie ; return from interrupt
;=================================================================
; initializing MCU
;=================================================================
INIT_MCU
BANKSEL PORTB
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE
BANKSEL TRISB ; select Register Bank 1
clrf TRISA ; Make PortA all input
movlw 0x01
movwf TRISB ; Make RBO pin input (switch)
clrf TRISC
clrf TRISD ; Make PortD all output
clrf TRISE


movlw 0x00 ; Left Justified, Vdd-Vss referenced
movwf ADCON1
bsf STATUS,RP1 ; select Register Bank 3
movlw 0x00 ; we want all Port A pins Analog
movwf ANSEL
clrf ANSELH
BANKSEL PORTB
;=================================================================

clrf Display
call DDSinit ; Загружаем синус 0,1Гц
movlw .1
movwf LastStableState ; Assume the Switch is up.
clrf Counter
MainLoop:
btfsc LastStableState,0
goto LookingForUp
LookingForDown:
clrw ; assume it's not, so clear
btfss PORTB,0 ; wait for switch to go low
incf Counter,w ; if it's low, bump the counter
movwf Counter ; store either the 0 or incremented value
goto EndDebounce
goto LookingForDown
LookingForUp:
clrw ; assume it's not, so clear
btfsc PORTB,0 ; wait for switch to go low
incf Counter,w
movwf Counter

EndDebounce:
movf Counter,w ; have we seen 5 in a row?
xorlw .5
btfss STATUS,Z
goto Delay1mS

comf LastStableState,f ; after 5 straight, reverse the direction
clrf Counter
btfss LastStableState,0 ; Was it a key-down press?
goto Delay1mS ; no: take no action

incf Display,f ; if it's the down direction,
movf Display,w ; take action on the switch
call DDSinit
Delay1mS:
movlw .71 ; delay ~1000uS
movwf Delay
decfsz Delay,f ; this loop does 215 cycles
goto $-1
decfsz Delay,f ; This loop does 786 cycles
goto $-1
goto MainLoop

;-------------------------------------------------------
; Инициализация DDS AD9833
;-------------------------------------------------------
; Запись в регистр управления 0x2100 b'00100001 00000000'
DDSinit
BANKSEL Val_0 ;Bank 0
movf Display,w
xorlw .12
btfss STATUS,Z
goto $+2
clrf Display
movf Display,w
movwf PORTD ; выод на светики в порту D
addwf PCL,f ; В зависимости от количества кликов по кнопке
goto F01 ; выбирается частота генерации.
goto F02
goto F03
goto F04
goto F05
goto F06
goto F07
goto F08
goto F09
goto F10
goto F11
goto F12


; 0x50C7—Frequency Register 0 LSB b'01010000 11000111' для 400Гц
F01 movlw b'01000000' ; частота 0,1Hz
movwf Val_1 ;
movlw b'00000001' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F02 movlw b'01000000' ; частота 0,2Hz
movwf Val_1 ;
movlw b'00000010' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F03 movlw b'01000000' ; частота 0,4Hz
movwf Val_1 ;
movlw b'00000100' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F04 movlw b'01000000' ; частота 1Hz
movwf Val_1 ;
movlw b'00001011' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F05 movlw b'01000000' ; частота 2Hz
movwf Val_1 ;
movlw b'00010110' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F06 movlw b'01000000' ; частота 4Hz
movwf Val_1 ;
movlw b'00101011' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F07 movlw b'01000000' ; частота 9Hz
movwf Val_1 ;
movlw b'01100001' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F08 movlw b'01000000' ; частота 16Hz
movwf Val_1 ;
movlw b'10101100' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F09 movlw b'01000001' ; частота 25Hz
movwf Val_1 ;
movlw b'00001100' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F10 movlw b'01000001' ; частота 36Hz
movwf Val_1 ;
movlw b'10000011' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F11 movlw b'01000010' ; частота 50Hz
movwf Val_1 ;
movlw b'00011001' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

F12 movlw b'01000100' ; частота 100Hz
movwf Val_1 ;
movlw b'00110010' ;
movwf Val_0 ;
call TRT_BYTE ;
goto FREQ

; 0x4000—Frequency Register 0 MSB b'01000000 00000000'
FREQ
movlw b'01000000' ;
movwf Val_1 ;
movlw b'00000000' ;
movwf Val_0 ;
call TRT_BYTE ;
; 0xC000—Phase Register 0 b'11000000 00000000'
movlw b'11000000' ;
movwf Val_1 ;
movlw b'00000000' ;
movwf Val_0 ;
call TRT_BYTE ;
; 0x2000—Exit Reset b'00100000 00000000'
movlw b'00100000' ;
movwf Val_1 ;
movlw b'00000000' ;
movwf Val_0 ;
call TRT_BYTE ;
bsf PORTC,2 ; /SINC - HI
return ;

;Передача байта для DDS AD9833
TRT_BYTE
bsf PORTC,2 ; SINC - HI
bsf PORTC,1 ; CLK - HI

rlf Val_0,F ;
rlf Val_1,F ;
bcf PORTC,2 ; SINC - LO

; 15
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 14
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 13
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 12
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 11
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 10
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 9
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 8
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 7
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 6
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 5
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 4
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 3
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 2
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
;1
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
rlf Val_0,F ;
bcf PORTC,1 ; CLK - LO
rlf Val_1,F ;
bsf PORTC,1 ; CLK - HI
; 0
btfsc STATUS,C ;
bsf PORTC,0 ; DAT - HI
btfss STATUS,C ;
bcf PORTC,0 ; DAT - LO
nop ;
bcf PORTC,1 ; CLK - LO
nop ;
bsf PORTC,1 ; CLK - HI
bcf PORTC,0 ; DAT - LO
nop ;
nop ;
bsf PORTC,2 ; SINC - HI
return ;
END ;

Прошивка для МК PIC16F887

:020000040000FA
:020000000528D1
:080008000900831203138501B6
:100010008601870188018901831603138501013058
:10002000860087018801890100309F000317003096
:100030008800890183120313A4013F200130A50029
:10004000A601251829280301061C260AA6002D282A
:10005000232803010618260AA6002608053A031DD0
:100060003828A509A601251C3828A40A24083F2001
:100070004730A300A30B3A28A30B3C282128831266
:10008000031324080C3A031D4628A4012408880001
:10009000820755285B28612867286D2873287928EE
:1000A0007F2885288B28912897284030A000013090
:1000B000A100AE209D284030A0000230A100AE205B
:1000C0009D284030A0000430A100AE209D28403083
:1000D000A0000B30A100AE209D284030A0001630BB
:1000E000A100AE209D284030A0002B30A100AE2002
:1000F0009D284030A0006130A100AE209D284030F6
:10010000A000AC30A100AE209D284130A0000C30F2
:10011000A100AE209D284130A0008330A100AE2078
:100120009D284230A0001930A100AE209D28443007
:10013000A0003230A100AE209D284030A000003049
:10014000A100AE20C030A0000030A100AE202030C1
:10015000A0000030A100AE20071508000715871485
:10016000A10DA00D071103180714031C0710A10D02
:100170008710A00D871403180714031C0710A10D86
:100180008710A00D871403180714031C0710A10D76
:100190008710A00D871403180714031C0710A10D66
:1001A0008710A00D871403180714031C0710A10D56
:1001B0008710A00D871403180714031C0710A10D46
:1001C0008710A00D871403180714031C0710A10D36
:1001D0008710A00D871403180714031C0710A10D26
:1001E0008710A00D871403180714031C0710A10D16
:1001F0008710A00D871403180714031C0710A10D06
:100200008710A00D871403180714031C0710A10DF5
:100210008710A00D871403180714031C0710A10DE5
:100220008710A00D871403180714031C0710A10DD5
:100230008710A00D871403180714031C0710A10DC5
:100240008710A00D871403180714031C0710A10DB5
:100250008710A00D871403180714031C0710000053
:100260008710000087140710000000000715080021
:02400E00C420CC
:02401000FF3E71
:00000001FF

 
vintik: SDS1102CML 

У меня SDS1102CML+.
Выглядит совсем по другому. В смысле - организация экрана.

 

Организация экрана страшная?
А это нормальная?

Или так?

 
vintik: Организация экрана страшная?

Не, не, я имел в виду, что у CML+ по другому всё выглядит в смысле пользовательского интерфейса.

 

Допилил DDS генератор до самостоятельной конструкции, рассчитанной исключительно для контроля АЧХ селективного усилителя.
www.youtube.com/watch?v=2iGpC8lBzXs
www.youtube.com/watch?v=2_WXT_rf75k

Управление одной кнопкой. В режиме покоя потребляет 110нА. Генерирует 14 частот от 0,01Гц до 100Гц. Есть визуальный контроль  за аккумулятором, защита от пере разряда-заряда.  

Подправил АЧХ селективного усилителя


Провел еще один эксперимент с экранировкой. На листе из жести расположил усилитель и накрыл его коробкой из черного металла. Собственные шумы снизились на 10%. 


Однако победить присутствие 50Гц шума так и не удалось, как и определить его природу.

Амплитуда этого шума составляет 13% от общего шума. Т.е. если его убрать, то можно получить 0,1мкВ по амплитуде собственных шумов.