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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Изменение частоты ШИМ


Изменение частоты ШИМ

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

1

Добрый день! Можно ли как-то программно менять частоту ШИМ в небольших пределах?

0

2

код

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
       Tcnt0 = 0 : While Tcnt0 < Dlina_tx : Wend       ' Длительность посылки, us
     Stop Timer2
     Config Timer2 = Timer , Prescale = 1 , Compare = Disconnect , Clear Timer = 1

0

3

Проверил в протеусе

Config Timer2 = Timer , Prescale = 8 , Compare = Toggle , Clear Timer = 1
Ocr2 = 52

частота меняется при задании ORC2.

Но скважность всегда 50%. Мне же нужен полноценный ШИМ, т.е. скважность будет произвольно меняться, но также нужно изменять и его частоту в небольших пределах - допустим, на 500 Гц или около того. Неужели менять частоту ШИМ невозможно во время работы?

Отредактировано kokosh (2017-10-22 20:26:03)

0

4

Прежде всего нужно понимать отчего зависит частота и скважность ШИМ.
Частота от времени переполнения таймера, т. е. есть таймер переполняется скажем 1000 раз в секунду, то частота будет 1000 Гц.
Скважность зависит от числа в OcrX относительно к разрядности таймера. Скажем если таймер 8-ми битный, а в OcrX будет число 64, то скважность равна 25%.

Теперь подумайте каким образом можно изменять частоту переполнения таймера чтобы иметь возможность менять частоту и скважность ШИМ.

0

5

Подскажите, если знаете. До ума сам доведу.

0

6

На самом деле вариантов не много. Для изменения времени переполнения можно менять частоту тактирования таймера. Предделитель очень грубый и имеет коэффициент деления только 1, 8, 64, 256 и 1024. Вариант изменения частоты тактирования МК наверное рассматривать не стоит.
В ATmega таймеры не такие функциональные как хотелось бы. Непонятно что мешало Atmel сделать нормальный предделитель с коэффициентом деления 0 - 255 или даже 0 - 65535.

Есть еще вариант, но сработает только с Timer1 или аналогичным ему. Таймер настраивается на автосброс по первому каналу сравнения.

Код:
Config Timer1 = PWM , Prescale = 1 , Compare_a_pwm = Disconnect , Compare_b_pwm = Clear_up , Clear Timer = 1

В Compare1a следует записать число (0 - 65535) до которого таймер досчитает прежде чем сбросится.
Compare1b изменяет скважность ШИМ и может быть равен от 0 до Compare1a.

0

7

Да, с предделителем не получится. Вообще, у меня задача достаточно простая, может я просто неверно её решаю.

Устройство представляет собой частотомер. У него в памяти есть некая фиксированная частота F1, а в реальном времени он замеряет другую частоту - F2. И чем больше эти две частоты отличаются, тем большей частоты звуковой сигнал нужно выводить на динамик. Есть ещё один параметр в измерении, от которого должна зависеть громкость звукового сигнала. Таким образом я поначалу подумал, что громкостью звука можно управлять, изменяя длительность сигнала ШИМ, но всё упёрлось в частоту. Изменение частоты генерируемого звука нужно небольшое, тут уж пришлось бы подстраиваться под ограничения реализации, хоть 500Гц, хоть 5кГц.

Значит нет вариантов сделать это программно и проще сделать генератор звука на отдельной логической микросхеме, а МК бы управлял параметрами его генерации?

PS: я нашёл почти то, что нужно, но не смог понять, как и почему оно работает. В протеусе не заработало. http://www.elektronik-labor.de/AVR/dds/PulsGen.html

Отредактировано kokosh (2017-10-22 21:27:47)

0

8

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

Устройство представляет собой частотомер. У него в памяти есть некая фиксированная частота F1, а в реальном времени он замеряет другую частоту - F2. И чем больше эти две частоты отличаются, тем большей частоты звуковой сигнал нужно выводить на динамик


Металлоискатель строите ?

0

9

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

0

10

Используйте серию Xmega, там по мягче с таймерами и их больше и все 16 битные.
Там есть регистр PER - который ограничивает счёт, есть таймеры с 2 и 4 выходами ШИМ и вообще можно в совокупности аппаратно два таймера объединить.

0

11

Atmega8 - Timer1 9bit 8мГц
Рукожопный код:

Свернутый текст
Код:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
$baud = 19200
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 1

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Portc.5 = Input
Config Portc.0 = Input
Config Timer1 = Pwm , , Pwm = 9 , Compare A Pwm = Clear Up , Prescale = 1
Config Portb.1 = Output

Dim Ac1 As Word
Dim Ac2 As Word
Dim Maxmotor As Word
Dim Maxregul As Word
Dim Motor As Word
Dim Regul As Word
Dim Shim As Word
Dim Tm1 As Byte
Dim Tm2 As Byte
Dim Raznica As Byte
Dim Vr2 As Word
Dim Maxshim As Word
Dim Mac As Word

Start Adc
Do


If Tm1 = 4 Then
   'Motor = Maxmotor
   'Regul = Maxregul
   If Maxmotor < Maxregul Then
      Raznica = Maxregul - Maxmotor
      If Shim < 511 Then         Incr Shim
         Elseif Maxmotor > Maxregul Then
             Raznica = Maxmotor
             Shim = Maxregul / 2                             ' = Regul / 2
   End If
      Maxregul = 0
      Maxmotor = 0
      Tm1 = 0
   Else
      Ac1 = Getadc(5)
      Ac2 = Getadc(0)
      Incr Tm1
      If Maxmotor < Ac1 Then Maxmotor = Ac1
      If Maxregul < Ac2 Then Maxregul = Ac2
End If

If Raznica > 60 Then
   If Tm1 = 0 And Tm2 < 250 Then Incr Tm2
   Else
   If Tm1 = 0 Then Tm2 = 0
End If
If Shim > 511 Then Shim = 511
If Tm2 = 70 Then Shim = 0
Pwm1a = Shim

Loop


:blush:

+2

12

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

ещё есть интересная серия AT90PWM именно под эту тему, правда там как-то безграмотно разведены на чип/ноги аппаратные ШИМы (конфликтуют с ногами программирования)

Отредактировано RDW (2017-10-27 11:25:18)

0

13

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

.... управляющие мосфеты все горят как свечки при неправильном включении (без норм обвязки входов) и управлении
главное чтобы нигде и ничего не повисло, иначе всё горит.....


Спас драйвер IGBT с опторазвязкой А3120, у него на выходе на открытие транзистор, а на закрытие (разряд) полевой, полная пила идёт.
Он годится и для IGBT (двуполярного питания базы) и для MOSFET, проблемы на 110в. были, в основном в качестве этих транзисторов, в руках была три варианта, один с алиэкспресс, сдох в нагрузке 1kW, другой с радио рынка, сдох при нагрузке 2kW,а третий выпаял с одной Германской платы, так от него провод отпаялся несколько раз и выдерживал, при этом все транзисторы были на радиаторе. Они греются, но не обжигают, всё-же 0.3 Ома это много.
Сегодня воткнул в станок и вижу как идёт дым из двигателя и провод дымится, но транзисторы выдержали и даже не нагрелись, чуть тёпленькие, это было при постоянном напряжении 36 вольт, выпрямленного с 3х фазного диодного моста.

http://sf.uploads.ru/t/Eyorg.png

Вот, рекомендую - http://datasheet.elcodis.com/pdf/11/4/1 … 0-500e.pdf
Брал ТУТ

Отредактировано Ev3658 (2017-10-27 18:24:35)

+1


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Изменение частоты ШИМ