Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
07.11.2008, 01:29
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Mega16: вход в противофазу OCR1A и B
МК avr mega16. частота 4 мгц. использую таймер 1 с OCR1A и B. В эти регистры записываются числа с разницей, например в 6 единиц (DEC). при динамическом изменении значений OCR временами получается так, что один из счетчиков не досчитывает до нужного значения, и после предварительного обнуления регистров OCR на выходе получается противофаза A и B из-за асинхронного старта. как можно решить проблему? (пробывал останавливать таймер, делать задержки - не помогло)
P.s. на всякий: в программе также планируется дополнительно использовать внешнее прерывание.
спасибо!
-- Прилагается рисунок: --
|
|
|
|
07.11.2008, 13:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Во-первых, проследите порядок записи в OCRx - сначала старший байт, потом младший. Во-вторых, реакция на изменение OCR для разных режимов ШИМ разная, часто отложенная до переполнения счётчика. В даташите всё разжёвано с картинками.
"и после предварительного обнуления регистров OCR на выходе получается противофаза A и B из-за асинхронного старта" - предварительного когда, сброса кем?! Про асинхронный старт не понятно совсем - а с чем он должен быть синхронный? генерация ШИМ это сугубо их семейные дела между TCCR/OCR/ICR/TCNT.
Ну и подробнее надо писать. TCCRx хоть бы привели.
|
|
|
|
07.11.2008, 13:30
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
1. очередность записи соблюдена
2. значения таймера:
Код:
|
TCCR1A=0x50;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00; |
в программе при изменении:
Код:
|
OCR1AH=0; OCR1AL=0;
OCR1BH=0; OCR1BL=0;
TIFR=0;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
TCCR1A=0x50;
TCCR1B=0x09;
...
OCR1AH=HD;
OCR1AL=LD;
...
OCR1BH=HD;
OCR1BL=LD;
... |
3. при старте мк сигнал А и Б (желтый и зеленый) начинают генерировать импульсы одновременно. далее при изменении OCRA/B один из них начинает генерацию раньше и получается противофаза
|
|
|
|
07.11.2008, 13:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
навно у вас режим "фэйз корект" включен, сделайте "фаст" - тогда начала будут совпадать при любом значении ШИМ.
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
07.11.2008, 14:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
При конфигурации TCCR1A=0x50; TCCR1B=0x09; у Вас установлен режим CTC с вершиной равной OCR1A. Это правильно? Тогда что будет на OC1A? не знаю, читайте даташит. Ещё у меня отмечено, что AVR Studio правильно симулирует этот режим. Можно пободаться с симулятором.
А зачем Вы в программе сбрасываете/устанавливаете TCCRx? Если для остановки счётчика, то для этого достаточно сбросить младших 3 бита TCCR1B. И надо ли обнулять TCNT? хотя, если режим СТС то наверное да.
|
|
|
|
08.11.2008, 14:03
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
OC1A в смысле OCR1A? OCR1A, как я понимаю, это OCR1AH+OCR1AL (т.е. деленный на старший и младший байты). может попробовать делать через прерывания?
Может кто-нибудь делал режим мертвого времени на tiny 261/461?
|
|
|
|
08.11.2008, 18:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Сообщение от code-by
|
Может кто-нибудь делал режим мертвого времени на tiny 261/461?
|
КОНЕЧНО же ДА ! апноут AVR449 посмотрите внизу
http://avr123.nm.ru/07.htm
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
09.11.2008, 15:04
|
|
Частый гость
Регистрация: 18.12.2007
Сообщений: 34
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 1 сообщении
|
Сообщение от code-by
|
1. очередность записи соблюдена
2. значения таймера:
Код:
|
TCCR1A=0x50;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00; |
в программе при изменении:
Код:
|
OCR1AH=0; OCR1AL=0;
OCR1BH=0; OCR1BL=0;
TIFR=0;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
TCCR1A=0x50;
TCCR1B=0x09;
...
OCR1AH=HD;
OCR1AL=LD;
...
OCR1BH=HD;
OCR1BL=LD;
... |
3. при старте мк сигнал А и Б (желтый и зеленый) начинают генерировать импульсы одновременно. далее при изменении OCRA/B один из них начинает генерацию раньше и получается противофаза
|
ИМХО при изменении OCR1B надо делать так:
1.Остановить таймер(сбросить бит 0 в TCCR1B)
2. сравнить выходы OC1A и OC1B и при необходимости записать 1 в FOC1B.
3. изменить OCR1B
4.Запустить таймер и все должно быть в фазе, если я правильно понял в OCR1B и OCR1A пишите одно и тоже,
в противном случае остановку таймера надо делать со сбросом(или по другому учесть вариант при котором новое OCR1B‹TCNT1)
при увеличении OCR1A можно делать то же самое а при
уменьшении надо ещё подумать
Удачи!
|
|
|
|
10.11.2008, 12:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Сообщение от code-by
|
OC1A в смысле OCR1A? OCR1A, как я понимаю, это OCR1AH+OCR1AL (т.е. деленный на старший и младший байты). может попробовать делать через прерывания?
Может кто-нибудь делал режим мертвого времени на tiny 261/461?
|
OC1A в смысле нога микросхемы, выход ШИМ от сравнения OCR1A с TCNT1.
В режиме CTC, который у Вас задан значениями в TCCR, счётчик таймера считает до значения, заданного в OCR1A, потом уменьшается до нуля потом увеличивается до OCR1A и т.д. OCR1A определяет частоту ШИМ. Как при этом ведёт себя нога OC1A? Не знаю! Может быть, она изменяется синхронно с направлением счёта? Если OCR1B › OCR1A, то может быть и получается то, что у Вас?
Чтобы ответить на эти вопросы надо открыть даташит и очень внимательно прочитать. Да, потратить 4 часа на 2 страницы. Пусть Вас утешает мысль, что таймеры одинаковые во всех АВРах.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Генерация стабильных импульсов на mega16
|
moroz_gr |
Микроконтроллеры, АЦП, память и т.д |
14 |
02.03.2009 17:58 |
Mega16+MMC TS1GMMC4
|
woroba |
Микроконтроллеры, АЦП, память и т.д |
3 |
10.12.2008 08:11 |
Mega16 + TDA7468
|
timrf |
Микроконтроллеры, АЦП, память и т.д |
10 |
31.08.2007 15:08 |
mega16 , траблы с АЦП
|
MiHoY |
Микроконтроллеры, АЦП, память и т.д |
23 |
28.02.2007 12:24 |
mega16 - int0 - наводка?
|
mel2 |
Микроконтроллеры, АЦП, память и т.д |
10 |
26.07.2006 08:08 |
Часовой пояс GMT +4, время: 03:54.
|
|