Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Fast PWM на AVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Валентиныч
Парочка вопросов к уважаемой публике.
1) Можно ли на Меге 8 (f(clc)=8 МГц, Timer2) организовать PWM с программной регулировкой частоты (от 20 до 200 кГц) и скважности (с дискретностью не хуже 5 %) ШИМ-сигнала?
2) Если можно - то КАК ЭТО СДЕЛАТЬ (какие настройки таймера использовать)?
DS
Насколько я помню, аппаратный режим ШИМ с частотой, больше, чем 1/256 тактовой организовать нельзя.
"Руками" 200 Кгц с 5% тоже - Вам надо будет отрабатывать все с точностью 2 такта. Если взять 20 Мгц версию AVR и на ассемблере сильно потрудиться, может и получиться.
Валентиныч
Спасибо, был в этом уверен, требовалось подтверждение.
Тогда другой вопрос.
Позволяет ли СТС мода для таймера 2 той же микросхемы одновременно задать нужную частоту ( в пределах f/256) и скважность? Или можно задать только частоту, при неизменной выходной скважности 2 (меандр)?
DS
Если писать в OCR 2 раза за период, то можно управлять и частотой и скважностью. Соотвественно зависит от Ваших возможностей отреагировать на прерывание по CM
Валентиныч
Нет, это не реально. sad.gif
А как организовать инкремент значения OCR, чтобы, допустим, каждые 5 периодов ШИМа менять его частоту? Придется использовать прерывания этого таймера?
Stanislav
Может, Вам всё-таки ЧИМ нужна? Если ширина импульса фиксирована, это можно попытаться устроить...
DS
Так аппаратный ШИМ практически на фиксированной частоте работает. Разве что прескейлер менять. А там где 2, где 4 раза шаг. В моде CTC, если Вы ШИМ делаете - переписывание значения ОСR и так при каждом прерывании - см. datasheet.
Валентиныч
Цитата(Stanislav @ Mar 18 2006, 22:09) *
Может, Вам всё-таки ЧИМ нужна? Если ширина импульса фиксирована, это можно попытаться устроить...

Подскажете - буду рад, самому реализовать не удается.

Цитата(DS_ @ Mar 18 2006, 22:09) *
Так аппаратный ШИМ практически на фиксированной частоте работает. Разве что прескейлер менять. А там где 2, где 4 раза шаг. В моде CTC, если Вы ШИМ делаете - переписывание значения ОСR и так при каждом прерывании - см. datasheet.
Не всегда - допустим, у Тини 15, если память не изменяет, имеется OCRA и OCRB - это позволяет "конструировать" и частоту ШИМ и его скважность одновременно. В Мегах такой фишки не нахожу. sad.gif
DS
Так это же 1 таймер. В Меге он 16 разрядный. 2 в Tiny нет вообще, кажется.

Для ЧИМ на втором таймере, похоже тоже понадобиться 2 записи на период.
defunct
Вот пример реализации ЧИМ + ШИМ на Tiny13 (OCR0A - регулирует частоту, OCR0B - ширину импульса):

Код
.include <tn13def.inc>
.def AL = R24
.def AH = R25

.equ  Period = 100;
.equ  SwitchPoint =  20;

;--------------------------------------------------
; Макрос настройки таймера T0 на работу в режиме ОС
; с длительностью периода = Period, и скважностью шириной импульса определяемой SwitchPoint
.macro INIT_TIMER0
    ldi  AL, (Period); Длительность периода
    out  OCR0A, AL

    ldi  AL, (SwitchPoint); Скважность
    out  OCR0B, AL

    ldi  AL, (1 << WGM01);  Режим CTC по достижению OCR0A
    out  TCCR0A, AL

    ldi  AL, 1
    out  TCCR0B, AL;   Режим подсчета тактов (Prescaler = 1)

    ldi  AL, (1 << OCIE0A)|(1 << OCIE0B); Разрешить оба прерывания по достижению OCR0A и OCR0B
    out  TIMSK0, AL
.endmacro
;---------------------------------------------------
.cseg

;===================================================
; ENTRY POINT
;===================================================
.org 0
    rjmp  Start
    reti; IRQ0 Handler
    reti; PCINT0 Handler
    reti; Timer0 Overflow Handler
    reti; EEPROM Ready Handler
    reti; Analog Comparator Handler
    rjmp  TIM0_COMPA; Timer0 CompareA Handler
    rjmp  TIM0_COMPB; Timer0 CompareB Handler
    reti; Watchdog Interrupt Handler
    reti; ADC Conversion Handler

START: //
    ldi   AL,low(RAMEND); Main program start
    out   SPL, AL
    ldi   AL, $FF
    out   DDRB, AL

    INIT_TIMER0; Инициализация таймера

    sei


;****************************************************
; Основной цикл программы
;****************************************************
MainCycle:          
    rjmp  MainCycle  

    
;****************************************************
; Обработчик прерывания TMR0 (Timer 0 OC)
;****************************************************
TIM0_COMPA:; Timer0 Compare A Handler
    cbi   PortB, 0
    reti

;****************************************************
; Обработчик прерывания TMR0 (Timer 0 OC)
;****************************************************
TIM0_COMPB:; Timer0 Compare B Handler
    sbi   PortB, 0
    reti


Удачи

Цитата
В Мегах такой фишки не нахожу.

В мегах то же самое только на таймере 1. Поле для конструирования частот и ширины куда больше т.к. таймер 16-бит. если не нужно использовать все 16 разрядов, то можно производить запись соответственно только в младшую часть регистров OCR1AL, OCR1BL..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.