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

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

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

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


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


ШИМ. Связать СТС с FAST PWM.

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

1

Помогите кто может. ATmega8 - мне необходимо сформировать серию импульсов, при этом
возможность регулирования частоты и регулирования скважности. Применяю Таймер-2 в режиме СТС
для регулировки частоты. Дальше частоту с PB3(OC2) соединяю с PD5(T1) и входом таймера Т1, а конкретно
работать будет по регистру ТСCR1A - по сравнению с Pwm1a и Pwm1b в режиме FAST PWM. Вот тут и засада. Если задаю  Config Timer1 = Pwm , Pwm = 9 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 8
то все работает.Но мне необходимо работать с внешней частотой, которая подаются с PB3(OC2) на PD5(T1).
Но к сожелению на выходе PB1(OC1A) ничего нет. По даташиту А. В. Евстифеев Микроконтроллеры AVR семейств Tiny и Mega
фирмы ATMEL, подбираю СS10,CS11,CS12, но таймер не работает (вернее не восприменяет внешний такт).

КОД----------------

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

Dim A As Byte , B As Byte
Dim C As Byte , D As Byte

Config Pind.0 = Input
Config Pind.1 = Input
Config Pind.5 = Input

Config Pinb.1 = Output
Config Pinb.3 = Output
Config Pinc.0 = Output
Outp_1 Alias Pinb.3
Outp_2 Alias Pinc.0

Config Adc = Single , Prescaler = Auto , Reference = Avcc 
Start Adc
  Tccr2 = &B00011101

  'Здесь надо сконфигурировать таймер1
    'TCCR1A = &B01000001
    'TCCR1B = &B00001111

   Config Timer1 = Pwm , Pwm = 9 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up , Prescale = 8
   
Do

A = Getadc(1)                                             
      B = A / 20
       Ocr2 = B
C = Getadc(2)                                           
      D = C / 2
    Pwm1a = D
Pwm1b = 150

    Loop
    Return
End

Пока писал вам питицию - меня осенило
Вот как правильно ------- Tccr1a = &B10000001
                                       Tccr1b = &B00001110  --------- УРА

Отредактировано AleksanderG (2012-10-25 22:28:06)

0

2

Опять засада. Итак, кончная задача у меня стоит что-бы иметь возможность
1. Регулировать частоту ( у меня это выполняет таймер 2)
2. Регулировать скважность ( у меня это выполняет таймер 1А)
3. Сдвинуть фазу импульса с ноги ОС0, относительно выходной ноги ОС1А (выполнить надо на таймере Т0)
     Вся затея это сформировать генерацию ипульсов  ОС1А и ОС0 для подачи их на управляющие электроды тиристоров, находящиеся в схеме резонасного контура сварочного трансформатора. Скважность импульсов должна быть одинакова, но они должны быть сдвинуты по фазе, что-бы не допустить даже на короткое время одновременное состояния открытых тиристоров.
В этом варианте применяю ATmega 32(16), из-за наличия в нем трех таймеров.
Две первые задачи у меня решены. По Таймеру0 режим  Phase Correct PWM. Дальше засада. Перебровывал все варианты-не то.
Думаю что что выход ОС1А дополнительно использовать как прерывание или как-то оперировать флагами.

Код ДаВинчи ----------

$regfile = "m32def.dat"
$crystal = 2000000

Dim A As Byte , B As Byte
Dim C As Byte , D As Byte

Config Pinb.3 = Output
Config Pind.5 = Output
Config Pinb.1 = Input
Config Pind.7 = Output
Config Pinb.0 = Input

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
  Tccr2 = &B00011101
  Tccr0 = &B01110111

    Tccr1a = &B10000001
    Tccr1b = &B00001110

Do

A = Getadc(0)
      B = A / 20
       Ocr2 = B
C = Getadc(1)
      D = C
    Ocr1a = 10
    Ocr0 = 250
    Loop
    Return
End

0

3

попробуй такую схему (для M8):

Timer1:
- формирует частоту - режим CTC. длительность периода определяет ICR1
- длительность первого импульса ШИМ1 определяет OCR1A. 
- сдвиг фазы определяет OCR1B. по совпадению с OCR1B происходит прерывание,
  которое запускает TIMER2 с нуля и устанавливает порт ШИМ2 в "1"
Timer2:
- формирует длительность второго импульса с помощью OCR2 - режим ждущего
  мультивибратора
- по совпадению OCR2 происходит прерывание, которое останавливает
  таймер 2 и сбрасывает порт ШИМ2 в "0"

если взять семейство ATMEGA88(164), то можно придумать больше, там таймеры более функциональные

0

4

dmm - спасибо что откликнулся. Один вопрос. Ты пишеш
Timer2:
- формирует длительность второго импульса с помощью OCR2 - режим ждущего
  мультивибратора
Мне не совсем понятно что за режим.

0

5

Это не специальный режим, его  нужно отрабатывать программно в прерываниях. Программы в прерываниях будут простейшие, пиши их на ассемблере
например:
$asm
    Push R31
    Sbi Porta , 2
    Ldi R31 , $b00000011
    Out Tccr0
    Ldi R31 , 0
    Out Tcnt0 , R31
    Pop R31
    Reti
$endasm

0

6

$asm
    Push R31  ---------------------  Помещаем значение в R31 в стек
    Sbi Porta , 2  -----------------  Ногу 2 порта А взводим
    Ldi R31 , $b00000011 -------  число записываем в R31
    Out Tccr0   -------------------- здесь ошибочка надо добавить R31 -  Out Tccr0, R31 -  определяем режим нормальный просто счет, предделитель
                                               тактовая частота проца делим на 64
    Ldi R31 , 0 --------------------  дальше прописываем 0 во временный регистр
    Out Tcnt0 , R31 --------------- определяем значение Tcnt0 = 0 (хотя не совсем понятно - OUT работает с портами, а Tcnt0 - это регистр)
    Pop R31  ----------------------- забираем из стека и отправляем во временный R31
    Reti  ---------------------------- ну и возврат из прерывания
$endasm

Все равно не понимаю как оно будет работать

0

7

Здравствуйте. Заранее прошу простить меня за глупые вопросы, потому что я лишь начинаю осваивать Bascom.

Я пишу программу для Atmega8. Таймеры распределены так:

Config Timer0 = Timer - на этом таймере у меня висит программное прерывание и подпрограмма
Config Timer1 = Pwm - здесь ШИМ №1, это вывод OC1A микроконтроллера
Config Timer2 = Pwm - здесь ШИМ №2, это вывод OC2 микроконтроллера

У МК есть ещё вывод OC1B - это ещё один ШИМ? Если да, то можно ли его как-то использовать или все ресурсы уже исчерпаны?

PS: Прошу прощения, что пишу здесь, форум не разрешает мне создать новую тему.

0

8

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

Здравствуйте. Заранее прошу простить меня за глупые вопросы, потому что я лишь начинаю осваивать Bascom.

Я пишу программу для Atmega8. Таймеры распределены так:

Config Timer0 = Timer - на этом таймере у меня висит программное прерывание и подпрограмма
Config Timer1 = Pwm - здесь ШИМ №1, это вывод OC1A микроконтроллера
Config Timer2 = Pwm - здесь ШИМ №2, это вывод OC2 микроконтроллера

У МК есть ещё вывод OC1B - это ещё один ШИМ? Если да, то можно ли его как-то использовать или все ресурсы уже исчерпаны?

PS: Прошу прощения, что пишу здесь, форум не разрешает мне создать новую тему.

Вот, что пишут в datasheet. Имеет 3 канала шим.
http://s3.uploads.ru/t/qYTnD.png

Отредактировано Tankor (2015-09-22 21:09:18)

0

9

Как же мне программно задействовать этот третий ШИМ, задать его частоту и скважность?

Для первого шима я задаю так:

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8

Для второго - так:

Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 32

Отредактировано beginer (2015-09-22 21:28:19)

0

10

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

Как же мне программно задействовать этот третий ШИМ, задать его частоту и скважность?

Для первого шима я задаю так:

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8

Для второго - так:

Config Timer2 = Pwm , Compare Pwm = Clear Down , Prescale = 32

Отредактировано beginer (Сегодня 21:28:19)

Внимательно посмотрите на конфиг. Timer1- Compare A Pwm. Канал А, но есть и B. Они от одного таймера работают.

Отредактировано Tankor (2015-09-22 22:03:29)

0

11

попробуйте как-то так:

Код:
Config Timer0 = Pwm , Prescale = 8 , Compare B Pwm = Clear Up
Config Timer1 = Pwm , Prescale = 8 , Compare B Pwm = Clear Up , Compare A Pwm = Clear Up , Pwm = 8
Pwm1b = 0                                       
Pwm1a = 0                                          
Ocr2 = 0

0

12

Правильно ли я понял, оба канала одного ШИМ-а работают всегда только на одинаковой частоте? И менять их скважность независимо один какал от другого также нельзя?

0

13

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

Правильно ли я понял, оба канала одного ШИМ-а работают всегда только на одинаковой частоте? И менять их скважность независимо один какал от другого также нельзя?

Почему нельзя, можно. Загоняем в А и В разные значения и получаем результат.
Например PWM1A=123
               PWM1B=250

Отредактировано sva-don (2015-09-23 16:40:00)

0

14

Спасибо, всё получилось! Оба канала работают с одной частотой, но независимой скважностью. То, что нужно.

0


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