Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » генератор импульсов mega8


генератор импульсов mega8

Сообщений 1 страница 15 из 15

1

Здравствуйте!
Необходимо сделать генератор прямоугольных импульсов с возможностью регулирования частоты и длительности импульсов. 
С регулировкой частоты все просто, работает. С длительностью затык. Нужно считать и сравнить значение Timer1 , но это не происходит.
Что я делаю не так?

код

$regfile = "m8def.dat"
$crystal = 4000000

Config Pind.2 = Output
Config Portd.3 = Output
Config Portd.0 = Input : Set Portd.0
Config Portd.1 = Input : Set Portd.1
'Config Portb.3 = Input : Set Portb.3
'Config Portb.4 = Input : Set Portb.4
Config Debounce = 10

Config Timer1 = Timer , Prescale = 1

Dim F As Word                                               'частота
Dim D As Word                                               'длительность
Dim T As Word

F = 63104

Stop Timer1
Timer1 = F

On Timer1 Pulse:
Start Timer1

Enable Interrupts
Enable Timer1

Do

Debounce Pind.0 , 0 , Fup , Sub                             'увеличение частоты
Debounce Pind.1 , 0 , Fdown , Sub                           'уменьшение частоты
'Debounce Pinb.3 , 0 , Dup , Sub
'Debounce Pinb.4 , 0 , Ddown , Sub
T = Timer1
If T = 63232 Then
Toggle Portd.3
End If

Loop

Pulse:
  Stop Timer1
  Timer1 = F
  Toggle Portd.2
  Start Timer1
  Return

Fup:
If F < 63104 Then
F = F + 128
End If
Return

Fdown:
If F > 39936 Then
F = F - 128
End If
Return




End

0

2

"Prescale = 1" - это таймер у вас работает на максимальной частоте, возможно за это время прерывание может не успевать полностью отрабатывать или максимально нагружать МК.
Плюс в коде нет никакой регулировке скважности (да и откуда ей взяться, если вы просто дергаете ногой) и отсутствует часть кода Dup/Ddown.
Вообще в инете и тут на форуме уже были темы про генераторы. Возможно надо делать не на таймере, а на ШИМ.

0

3

Dup/Ddown как раз будут привязаны к регулировке скважности, остались от другой версии кода. Регулировку я пытался реализовать тут

T = Timer1
If T = 63232 Then
Toggle Portd.3
End If

пока просто задание какой либо, без возможности изменения.

Про шим я тоже думал, но как при этом задать изменение частоты? Как я понял при Pwm невозможно записывать значение регистра таймера, во всяком случае у меня не получилось.

P.S.

пока все моделируется в протэусе, так что возможные косяки и перегрузки МК можно не учитывать, позже отлажу, сейчас важен только алгоритм.

Отредактировано TlsT (2014-12-10 17:08:31)

0

4

Управляйте напрямую ШИМ через регистры (коэффициент деления, до сколки считать..).

0

5

не совсем понял.
Если менять OCR, то регулироваться будет только скважность. Для изменения частоты на код

Stop Timer1
Timer1 = xxxx
Start Timer1

ни какой реакции

0

6

Config Timer2 = Timer , Prescale = 1 , Compare = Toggle , Clear Timer = 1       ' сигнал будет на ноге PB.3  #
     Ocr2 = Tx_freq              ' 32 =120 кгц, 35=110, 39=99, 42=93kHz
     Start Timer2
     

     Stop Timer2
     Config Timer2 = Timer , Prescale = 1 , Compare = Disconnect , Clear Timer = 1

0

7

Александр, спасибо за код, очень удобно. Но тут опять же  регулировка только частоты, но не скважности.

0

8

Почитайте тут http://www.530.ru/electronics/projects.php?do=p072
Там есть раздел Получение сигнала произвольной скважности. Как то давно делал все работало.

0

9

Почитал, подумал, чего то получилось. В таком виде примерно работает, но с 8ми битным таймером плохо регулируется.

Код:
$regfile = "m8def.dat"
$crystal = 4000000


Config Pinb.3 = Output

Config Timer2 = Timer , Prescale = 256 , Compare = Toggle , Clear Timer = 1




Do
If Pinb.3 = 1 Then
Ocr2 = 100
Else
Ocr2 = 200
End If

Loop

0

10

Вот нашел свой старый код. Там много лишнего, но попробуй разобраться. Это генератор снабжен LCD, клавиатурой, а также EEPROM для сохранения настроек. https://yadi.sk/i/HTHGAZz6dLCww

0

11

вы просите то частоту, то скважность...
частоту я написал, вот скважность:

Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Up  'down       ' PB.1

Pwm1a = xx

0

12

Александр, sva-don, спасибо.

Александр, регулировать нужно и частоту и скважность.

sva-don, чет ссылка битая.

0

13

Поправил https://yadi.sk/d/lNw5rJobdN9m4

0

14

TlsT написал(а):

T = Timer1
If T = 63232 Then
Toggle Portd.3
End If

Один из видов грабель, через которые сложно перешагнуть. На момент одной проверки, T может быть = 63158, а на момент следующей, = 63249. Наступили. Знак "=" надо бы заменить на "=>".

0

15

SIvan, спасибо за пояснение, может по этому и не заработало в том варианте. Что ни делается, все к лучшему, так как  версия как в посте №9 много проще.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » генератор импульсов mega8