Два генератора частоты , К176ИЕ12 и ATiny2313

Автор: с2. Опубліковано в Вимірювання

В статье, пример двух простых схем генераторов, для получения образцового сигнала от 0.1Гц до 4мГц (частоты фиксировано)

 

После изготовления  частотомера на PIC 16F628A появилась потребность в генераторе частот.

Первый на микросхеме К176ИЕ12, в этой схеме можно получить шесть разных частот, в том числе стабильную часовую 32768Гц

генератор

Архив печатной платы  176ie12.rar 

 

Второй на МК ATTiny2313  выдаёт 30 фиксированных частот от 0.1Гц до 4мГц 

генератор

 

 Исходный код программы;

Code
$crystal = 20000000
$regfile = "attiny2313.dat"
$hwstack = 32
$swstack = 8
$framesize = 32

Dim F As Byte , F_input As Byte , Clkpr_prescale As Byte
Dim Ocr1a_value As Word , Ocr0a_value As Byte
Dim Clock_prescale As Word , Timer0_prescale As Byte

Config Pinb.2 = Output
Config Pinb.3 = Output
Config Portd = Input
Portd = &HFF

F = 255

Do
F_input = Pind And &H1F 'check switch combination
If F <> F_input Then 'if changed,
F = F_input
Gosub Set_f 'set new frequency
End If
Loop

Set_f:
Stop Timer0
Stop Timer1
Timer0 = 0
Timer1 = 0
Ocr0a_value = Lookup(f , Ocr0a_table)
Ocr1a_value = Lookup(f , Ocr1a_table)
Clock_prescale = Lookup(f , Clock_prescale_table)
Timer0_prescale = Lookup(f , Timer0_prescale_table)
Clkpr_prescale = 0
While Clock_prescale > 1
Shift Clock_prescale , Right
Incr Clkpr_prescale
Wend
Clkpr = &B10000000
Clkpr = Clkpr_prescale
If F < 31 Then 'f <= table_entries #
If Ocr0a_value = 0 Then
Gosub Set_high_f
Else
Gosub Set_low_f
End If
Else
Set Portb.3
End If
Return

Set_high_f: '10MHz-5Hz
Decr Ocr1a_value
Compare1a = Ocr1a_value
Config Timer1 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1 'start Timer1
Return

Set_low_f: '2Hz-0.001Hz
Decr Ocr0a_value
Ocr0a = Ocr0a_value
If Timer0_prescale = 1 Then
Config Timer0 = Timer , Prescale = 1 , Compare A = Toggle , Clear Timer = 1 'start Timer0
Else
Config Timer0 = Timer , Prescale = 8 , Compare A = Toggle , Clear Timer = 1 'start Timer0
End If
Decr Ocr1a_value
Compare1a = Ocr1a_value
Config Timer1 = Counter , Edge = Falling , Compare A = Toggle , Clear Timer = 1 'start Timer1
Return

'for $crystal = 20MHz & table_entry 0-19:
'f = 20000000 / (2*clock_prescale*(1+ocr1a_value))

'for $crystal = 20MHz & table_entry 20-30:
'f = 20000000 / (2*clock_prescale*(1+ocr1a_value)) / (2*Timer0_clock_prescale*(1+ocr0a_value))

Clock_prescale_table: '[1-256]
Data 1% '0: 10 MHz
Data 2% '1: 5 MHz
Data 1% '2: 2 MHz
Data 2% '3: 1 MHz
Data 4% '4: 500 kHz
Data 2% '5: 200 kHz
Data 4% '6: 100 kHz
Data 8% '7: 50 kHz
Data 4% '8: 20 kHz
Data 8% '9: 10 kHz
Data 16% '10: 5 kHz
Data 8% '11: 2 kHz
Data 16% '12: 1 kHz
Data 32% '13: 500 Hz
Data 16% '14: 200 Hz
Data 32% '15: 100 Hz
Data 64% '16: 50 Hz
Data 32% '17: 20 Hz
Data 64% '18: 10 Hz
Data 64% '19: 5 Hz
Data 32% '20: 2 Hz
Data 64% '21: 1 Hz
Data 128% '22: 0.5 Hz
Data 64% '23: 0.2 Hz
Data 128% '24: 0.1 Hz
Data 256% '25: 0.05 Hz
Data 128% '26: 0.02 Hz
Data 256% '27: 0.01 Hz
Data 64% '28: 0.005 Hz
Data 256% '29: 0.002 Hz*
Data 256% '30: 0.001 Hz*
Data 256% '31: stop

Ocr1a_table: '[1-65535], Ocr1a = Ocr1a_table_entry - 1
Data 1% '0: 10 MHz
Data 1% '1: 5 MHz
Data 5% '2: 2 MHz
Data 5% '3: 1 MHz
Data 5% '4: 500 kHz
Data 25% '5: 200 kHz
Data 25% '6: 100 kHz
Data 25% '7: 50 kHz
Data 125% '8: 20 kHz
Data 125% '9: 10 kHz
Data 125% '10: 5 kHz
Data 625% '11: 2 kHz
Data 625% '12: 1 kHz
Data 625% '13: 500 Hz
Data 3125% '14: 200 Hz
Data 3125% '15: 100 Hz
Data 3125% '16: 50 Hz
Data 15625% '17: 20 Hz
Data 15625% '18: 10 Hz
Data 31250% '19: 5 Hz
Data 625% '20: 2 Hz
Data 625% '21: 1 Hz
Data 625% '22: 0.5 Hz
Data 3125% '23: 0.2 Hz
Data 3125% '24: 0.1 Hz
Data 3125% '25: 0.05 Hz
Data 15625% '26: 0.02 Hz
Data 15625% '27: 0.01 Hz
Data 15625% '28: 0.005 Hz
Data 5731% '29: 0.002 Hz*
Data 11462% '30: 0.001 Hz*
Data 0% '31: stop

Ocr0a_table: '[1-255, 0=not used], Ocr0a = Ocr0a_table_entry - 1
Data 0 '0: 10 MHz
Data 0 '1: 5 MHz
Data 0 '2: 2 MHz
Data 0 '3: 1 MHz
Data 0 '4: 500 kHz
Data 0 '5: 200 kHz
Data 0 '6: 100 kHz
Data 0 '7: 50 kHz
Data 0 '8: 20 kHz
Data 0 '9: 10 kHz
Data 0 '10: 5 kHz
Data 0 '11: 2 kHz
Data 0 '12: 1 kHz
Data 0 '13: 500 Hz
Data 0 '14: 200 Hz
Data 0 '15: 100 Hz
Data 0 '16: 50 Hz
Data 0 '17: 20 Hz
Data 0 '18: 10 Hz
Data 0 '19: 5 Hz
Data 125 '20: 2 Hz
Data 125 '21: 1 Hz
Data 125 '22: 0.5 Hz
Data 125 '23: 0.2 Hz
Data 125 '24: 0.1 Hz
Data 125 '25: 0.05 Hz
Data 125 '26: 0.02 Hz
Data 125 '27: 0.01 Hz
Data 125 '28: 0.005 Hz
Data 213 '29: 0.002 Hz*
Data 213 '30: 0.001 Hz*
Data 0 '31: stop

Timer0_prescale_table: '[1-8-64-256-1024, 0=not used]
Data 0 '0: 10 MHz
Data 0 '1: 5 MHz
Data 0 '2: 2 MHz
Data 0 '3: 1 MHz
Data 0 '4: 500 kHz
Data 0 '5: 200 kHz
Data 0 '6: 100 kHz
Data 0 '7: 50 kHz
Data 0 '8: 20 kHz
Data 0 '9: 10 kHz
Data 0 '10: 5 kHz
Data 0 '11: 2 kHz
Data 0 '12: 1 kHz
Data 0 '13: 500 Hz
Data 0 '14: 200 Hz
Data 0 '15: 100 Hz
Data 0 '16: 50 Hz
Data 0 '17: 20 Hz
Data 0 '18: 10 Hz
Data 0 '19: 5 Hz
Data 1 '20: 2 Hz
Data 1 '21: 1 Hz
Data 1 '22: 0.5 Hz
Data 1 '23: 0.2 Hz
Data 1 '24: 0.1 Hz
Data 1 '25: 0.05 Hz
Data 1 '26: 0.02 Hz
Data 1 '27: 0.01 Hz
Data 8 '28: 0.005 Hz
Data 8 '29: 0.002 Hz*
Data 8 '30: 0.001 Hz*
Data 0 '31: stop

 

 

FUSE:
Программа написана для работы МК  от внешнего кварца.

После сборки и прошивки контролера генератор начинает работать сразу.

Смотрим осциллографом, сигнал 10.000гц    и на 4мгц  

Фото платы

  

Архив печатной платы generator2313_lay

Генератор так же, можно применить для тестирования кварцев,

Проверяются все, пробовал от 4 до 24 мгц

Вот например кварц 24 мгц

Свойства схемы генератора, делить минимально показания на 2

(на фото 12 мгц, ничего, здесь каждому будет нетрудно вычислить реальный номинал кварца)

Да, этот генератор в общем неплохой помощник радиолюбителя!

Архив прошивок Генератор частоты на ATTiny2313

 Источник; сайт Микроконтроллеры и Технологии   http://radioparty.ru