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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Генератор прямоуг. импульсов с регулируемой частотой и скважностью.


Генератор прямоуг. импульсов с регулируемой частотой и скважностью.

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

1

Привет всем. Подскажите пожалуйста идею, может кто сталкивался, как можно реализовать генератор прямоуг. импульсов с регулировкой частоты от 0.1 Гц до 150 Гц с шагом 0.1 Гц и регулировкой скважности от 5% до 95% с шагом 1%? Тактовая частота контроллера 8 МГц.

Отредактировано emal-05 (2018-05-27 18:27:20)

0

2

Настраиваете таймер так чтобы получить 15 тысяч прерываний в секунду и в обработчике прерывания изменяете состояние выхода чтобы добиться нужных параметров импульса. Но высокой точности не будет.
Если МК XMega, то возможно можно добиться аппаратными средствами. Если не ошибаюсь, в них можно соединить два таймера, и один будет задавать частоту, а второй скважность.

0

3

На таймере 0.1 Гц скорее всего получить не удастся, есличо поправьте меня.

Короче, я делал такую хреновню так: отключил ВСЁ (таймеры, прерывания и тд) и сделал бесконечный цикл, в котором было три переменных: частота, время положительного импульса и время отрицательного импульса. "дешманский" опрос клавиатуры из десяти команд на ассемблере не более 25 тактов проца. С дисплеем никак, или сначала ставим частоту а потом генерим без дисплея.

0

4

Второй день голову ломаю, пока ничего в голову не приходит. С регулировкой скважности, по прерыванию таймера проблем нет, а вот как ещё и частоту изменять,, хотя бы с шагом 1 Гц фиг знает. Проблема ещё в том что контроллер ещё при этом должен и другими делами заниматься, выводить посл. данные, следить за состоянием внешних прерываний (для энкодера) и т.д.

0

5

Ну в общем то получилось сделать генератор с регулировкой частоты от 1 Гц до 200 Гц с шагом 1 Гц и регулировкой скважности от 5% до 95% с шагом 1%. Так как в обработчике прерывания таймера заложено вычисление, которое сжирает примерно 30 тактов контроллера + погрешность от частоты контроллера 8 МГц (без кварца), в итоге на 200 герцах погрешность 5 Гц. Попробую поколдовать с коэффициентом погрешности, либо переложить код обработчика на асму. В принципе такая погрешность меня тоже устраивает, но если получится меньше, хорошо. Ещё бы в идеале сделать чтобы от 0.5 Гц до 1 Гц регулировалась с шагом 0.1 Гц, а от 1 Гц до 200 Гц с шагом 1 Гц. Если кому интересно, доделаю и могу выложить результат.

0

6

На XMega не пробовали делать? Два таймера соединяете так чтобы первый тактировал второй. Первый задает частоту, а второй скважность (ШИМ). Получится аппаратное решение, без необходимости прерываний. Правда не знаю возможно ли в XMega сделать подобное, но вроде можно. На МК от другого производителя, такое возможно, но это не AVR и баскома для них нет.

0

7

Всё пересчитал, получается с шагом 0.1 Гц и более менее приемлемой погрешностью можно сделать до 20-30 Гц, дальше только с шагом 1 Гц.

0

8

Проц акромя генерации что-то ещё

0

9

Ставьте внешний кварц на 20МГц.

0

10

На XMega не пробовал, не знаком с ней. Сделал на обычной меге, от 0.1 Гц - 9.9 Гц с шагом 0.1 Гц, от 10 Гц - 200 Гц с шагом 1 Гц, скважность от 1% до 99% с шагом 1%, такт. частота контроллера 8 МГц (без кварца). Оказалась довольно лёгкая задача. С внешним кварцем можно конечно получить лучше точность, но меня устраивает и так.

0

11

Ну и как сделал? Код не нужен, расскажи просто принцип.
И... а сдвигать по фазе относительно "маркера" может твой код???

0

12

Да без проблем, вот код самого генератора, значения у меня задаются энкодером и выводятся на индикатор через MAX7219. Отличный такой программный ШИМ получился с регулировкой частоты.

Код:
$regfile = "m32def.dat"
$crystal = 8000000

Ddra.7 = 1
Pwm_out Alias Porta.7

Dim D As Long
Dim Freq As Word
Dim Period As Long : Period = 1000
Dim Dlitelnost As Long
Dim Balance As Byte

'Инициализация таймер-счётчика 0
Config Timer0 = Timer , Prescale = 1
Enable Timer0
On Timer0 Pwm

Enable Interrupts

Freq = 1000                                                 'заданная частота (1000=100Гц, 100=10Гц, 10=1Гц, 1=0.1Гц, 56=5.6Гц и т.д.)
Balance = 10                                                'заданный баланс импульса в процентах (от 1% до 99%)

Do

Loop
End


Pwm:
  Incr D

  If D = Period Then
    Period = 312500 / Freq                                  'расчёт периода (312500 - кол. прерываний, равное 0,1 сек. при такт. частоте проца 8МГц)
    Dlitelnost = Period * Balance
    Dlitelnost = Dlitelnost / 100                           'расчёт длительности импульса (скважности)
    D = 0
    Pwm_out = 1
    Elseif D = Dlitelnost Then
      Pwm_out = 0
  End If
Return

+1


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Генератор прямоуг. импульсов с регулируемой частотой и скважностью.