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

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

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

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



ШИМ OC0A

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

1

Как поменять местами синюю и желтую линии ШИМ на осциллографе не меняя электрическую схему? На PD6 (OC0A) необходим ШИМ
http://s3.uploads.ru/t/bzKQw.jpg
Нужен режим в котором можно изменить скважность, а соответственно и выдаваемую мощность шим с шагом в 5%. Частота ШИМ должна быть более 20 кГц. В следующем коде эти условия соблюдены для лапы OC0B:

Код:
$regfile = "m88def.dat"
$crystal = 8000000
Ddrd = &B01100000                                           ' конфигурируем ножки OC0A и OC0B на выход
'-------------------------------------------------------------------------------------------
'Настраиваем регистр Tccr0a

Tccr0a.com0a1 = 0
Tccr0a.com0a0 = 0
'биты com0a1 и com0a0  настройка лапы OC0A
'00 = Oc0a Отключен От Порта.
'01 = Toggle OC0A по совпадению. Также WGM02 должен быть = 0 иначе  Oc0a Отключен От Порта???
'10 = Clear OC0A по совпадению  (non-inverting mode).
'11 = Set OC0A по совпадению    (inverting mode).

Tccr0a.com0b1 = 1
Tccr0a.com0b0 = 0
'биты com0b1 и com0b0 тоже самое что и предыдущие, только для  лапы OC0B

Tccr0b.wgm02 = 1
Tccr0a.wgm01 = 0
Tccr0a.wgm00 = 1
'биты wgm02, wgm01 wgm00 определяют режим генерации:
' _____________________________________________
'|код|  режим |  Макс   | обновление | TOV Flag|
'|   | таймера| значение|    OCRx    |  Set on |
'|___|________|_________|____________|_________|
'|000|  норм  |   FF    | немедленное|    MAX  |
'|001|PWM PC* |   FF    |     TOP    |  Bottom |*
'|010|  CTC** |  OCRA***| немедленное|   MAX   |
'|011|Fast PWM|   FF    |   Bottom   |   MAX   |
'|101|PWM PC* |  OCRA***|     TOP    |  Bottom |
'|111|Fast PWM|  OCRA***|    Bottom  |   TOP   |
'|100|Reserved|    -    |      -     |     -   |
'|110|Reserved|    -    |      -     |     -   |
' ---------------------------------------------
'* PWM PC = PWM Phase Correct  управление скважностью
'**CTC=Clear Timer on Compare Match
'*** ШИМ работает при условии Ocr0a >= Ocr0b. Причем Ocr0a задает количество шагов(0-255). А Ocr0b увеличивается и при его увеличении до Ocr0a идет прерывание.
'1. MAX = 0xFF
'2. BOTTOM = 0x00

'Настраиваем регистр Tccr0b  биты: FOC0A FOC0B – – WGM02 CS02 CS01 CS00

' бит foc0a и foc0b Force Output Compare A
Tccr0b.foc0a = 0
Tccr0b.foc0b = 0

'биты  CS02 CS01 CS00 являются делителем
' ------------------------------------------------------
'|код| делитель                                         |
'|------------------------------------------------------|
'|000| таймер остановлен                                |
'|001| /1                                               |
'|010| /8                                               |
'|011| /64                                              |
'|100| /256                                             |
'|101| /1024                                            |
'|110| внешний генератор на Т0 прерывание по спаду      |
'|111| внешний генератор на Т0 прерывание по нарастанию |
' ------------------------------------------------------
Tccr0b.cs02 = 0
Tccr0b.cs01 = 0
Tccr0b.cs00 = 1

'Теперь зададим скважность и шкалу

Do
Ocr0a = 20                                                  'шкала ШИМ 0..255 чем больше, тем ниже частота но более плавные ступени
Ocr0b = 5                                                   'коэффициент заполнения 0..Ocr0a
Delay : Delay
Loop
'текущее значение 8битного таймера счетчика можно прочитать из регистра TCNT0. Например х=TCNT0 или TCNT0 = х


''Регистр Timsk0   биты: – – – – – OCIE0B OCIE0A TOIE0
'Timsk0.ocie0b = 1                                           'Timer/Counter Output Compare Match B Interrupt Enable
'Timsk0.ocie0a = 1                                           'Timer/Counter0 Output Compare Match A Interrupt Enable
'Timsk0.toie0 = 0                                            ' Timer/Counter0 Overflow Interrupt Enable

'' Регистр TIFR0   биты: – – – – – OCF0B OCF0A TOV0
'Tifr0.ocf0b = 0                                             ' Timer/Counter 0 Output Compare B Match Flag
'Tifr0.ocf0a = 1                                             'Timer/Counter 0 Output Compare A Match Flag
'Tifr0.tov0 = 0                                              'TOV0: Timer/Counter0 Overflow Flag

0

2

Вот что пытаюсь сделать:

Код:
$regfile = "m88def.dat"
$crystal = 8000000
Ddrd = &B01100000                                           ' конфигурируем ножки OC0A и OC0B на выход
'-------------------------------------------------------------------------------------------


'Выбираю Режим Работы Ножки OC0A для режима "Compare Output Mode, Phase Correct PWM Mode"
Tccr0a.com0a1 = 1
Tccr0a.com0a0 = 0
'выбор означает "Clear OC0B on Compare Match when up-counting. Set OC0B on Compare Match when down-counting."
'как я понимаю OC0B=0 при совпадении значения таймера с Ocr0b когда таймер инкреминируется
'            и OC0B=1 при совпадении значения таймера с Ocr0b когда таймер декрименируется
' сам таймер считает от 0 до 255 и потом на убывание до 0. Это настроим позже.

'Выбираю Режим Работы Ножки OC0B
Tccr0a.com0b1 = 0
Tccr0a.com0b0 = 0
'Normal port operation, OC0B disconnected
'Обычная работа ножки. ШИМ от нее отключен.

'Теперь выбираю режим генерации "Waveform Generation Mode Bit Description Mode WGM02 WGM01 WGM00 Timer/Counter"
Tccr0b.wgm02 = 1
Tccr0a.wgm01 = 0
Tccr0a.wgm00 = 1
'Режим PWM, Phase Correct
'В этом режиме максимальный предел счета таймера = Ocra
'обновление OCRx в верху счета
'TOV Flag: bottom  флаг переполнения , устанавливается при достижении 00.

'Выставляю делитель = 8
Tccr0b.cs02 = 0
Tccr0b.cs01 = 1
Tccr0b.cs00 = 0

'Enable Interrupts

'Выставляю макс значение таймера=100
Ocr0a = 100

'Выставляю величину сравнения таймера при совпадении с которой будет менятся выходной импульс
Ocr0b = 10

Генерации не происходит. На OC0A единица.

Отредактировано Pasha (2016-02-09 22:08:16)

0