|
|
  |
Fast PWM на AVR |
|
|
|
Mar 18 2006, 17:03
|
Профессионал
   
Группа: Свой
Сообщений: 553
Регистрация: 17-02-05
Из: Свердловская обл.
Пользователь №: 2 712

|
Нет, это не реально.  А как организовать инкремент значения OCR, чтобы, допустим, каждые 5 периодов ШИМа менять его частоту? Придется использовать прерывания этого таймера?
Сообщение отредактировал Валентиныч - Mar 18 2006, 17:06
--------------------
Закономерность: Чем больше узнаю, тем меньше знаю... Любые мнения, даже ошибочные, имеют право на существование. Чем лучше узнаю людей, тем больше нравятся собаки...
|
|
|
|
|
Mar 18 2006, 17:34
|
Профессионал
   
Группа: Свой
Сообщений: 553
Регистрация: 17-02-05
Из: Свердловская обл.
Пользователь №: 2 712

|
Цитата(Stanislav @ Mar 18 2006, 22:09)  Может, Вам всё-таки ЧИМ нужна? Если ширина импульса фиксирована, это можно попытаться устроить... Подскажете - буду рад, самому реализовать не удается. Цитата(DS_ @ Mar 18 2006, 22:09)  Так аппаратный ШИМ практически на фиксированной частоте работает. Разве что прескейлер менять. А там где 2, где 4 раза шаг. В моде CTC, если Вы ШИМ делаете - переписывание значения ОСR и так при каждом прерывании - см. datasheet. Не всегда - допустим, у Тини 15, если память не изменяет, имеется OCRA и OCRB - это позволяет "конструировать" и частоту ШИМ и его скважность одновременно. В Мегах такой фишки не нахожу.
--------------------
Закономерность: Чем больше узнаю, тем меньше знаю... Любые мнения, даже ошибочные, имеют право на существование. Чем лучше узнаю людей, тем больше нравятся собаки...
|
|
|
|
|
Mar 18 2006, 18:38
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Вот пример реализации ЧИМ + ШИМ на 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..
Сообщение отредактировал defunct - Mar 19 2006, 06:54
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|