реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> PWM на tiny26, PWM на tiny26
evgn
сообщение Apr 26 2007, 15:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 4-10-06
Пользователь №: 20 954



Использую tiny26 для формирования шима на 2 ногах PB1 и PB2... соответственно прямого и инвертированного.

Кварц 16МГц(хотя от 8 тоже пробовал smile.gif на fast PWM). Тактирование от СК с делителем на 128.

DDRB = 3;
TCCR1A = ((1<<COM1A0) | (1<<PWM1A));
TCCR1B = 136;

Генерируем меандр с переменной частотой от 2кГц до 2,5кГц, меняется с частотой 7Гц.
В цикле меняем

OCR1C=X;
OCR1A=X/2;

Где Х вычисленное значение для генерации необходимо частоты меандра.

Причем на некоторых частотах такого эффекта не наблюдалось(там была медленная смена 2 частот)

На осилографе наблюдаем переодическое пропадание шима... т.е. установление в 0 или 1 на несколько милисекунд... В чем причина такого поведения? help.gif

Также пробовал atmell-овский пример на fast PWM (avr131) где генерируется синусоида на фаст ПВМ. Наблюдалось также только половина синусоиды sad.gif..
Go to the top of the page
 
+Quote Post
Dima_Ag
сообщение Apr 26 2007, 15:46
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 12-09-06
Пользователь №: 20 304



Цитата(evgn @ Apr 26 2007, 16:27) *
Генерируем меандр с переменной частотой от 2кГц до 2,5кГц, меняется с частотой 7Гц.
В цикле меняем

OCR1C=X;
OCR1A=X/2;

Где Х вычисленное значение для генерации необходимо частоты меандра.

На осилографе наблюдаем переодическое пропадание шима... т.е. установление в 0 или 1 на несколько милисекунд... В чем причина такого поведения? help.gif



Обратите внимание на тот момент, что Вы никак не синихронизируете смену значения в OCR регистрах
и значение таймера. Поэтому возникает ситуация, когда Вы сменили значение в OCR, а TCNT продолжает считать, и если его значение выше нового OCR, то счётчик будет считать до переполнения, потом,естественно, обнулится, и только после этого произойдёт возврат к нормальной генерации.

Чтобы избежать подобных проблем - после записи в OCR ОБЯЗАТЕЛЬНО обнуляйте TCNT регистр.
Тогда сбоев в формировании ШИМ не будет.
Go to the top of the page
 
+Quote Post
Guest_=AVR=_*
сообщение Apr 26 2007, 16:53
Сообщение #3





Guests






Цитата
Чтобы избежать подобных проблем - после записи в OCR ОБЯЗАТЕЛЬНО обнуляйте TCNT регистр.
Программно трогать сам таймер (TCNT), работающий в режиме PWM, не нужно и даже вредно. Разработчики Atmel позаботились о том, чтобы запись в OCR1A/B можно было делать В ЛЮБОЙ МОМЕНТ без сбоев в формировании ШИМ:

Цитата
Note that in PWM mode, writing to the Output Compare Registers OCR1A or OCR1B, the data value is first transferred to a temporary location. The value is latched into OCR1A or OCR1B when the Timer/Counter reaches OCR1C. This prevents the occurrence of odd-length PWM pulses (glitches) in the event of an unsynchronized OCR1A or OCR1B.


А вот с OCR1C (TOP) ситуация иная - запись в него делается напрямую, без буферного регистра, и именно это обстоятельство и может вызывать наблюдаемый эффект. Чтобы исключить его, надо сделать так, чтобы запись в OCR1C происходила в безопасные моменты времени, т.е. сразу после сброса TCNT, вызванного его совпадением с OCR1C. Это легко и просто делается с помощью изредка разрешаемого прерывания по TOV1 - когда main вычислил и готов загрузить новые значения в OCR1A/C, то сначала грузит OCR1A и просто разрешает прерывание по TOV1, обработчик которого будет вызван при ближайшем TCNT1==OCR1C. Обработчик этот, в свою очередь, грузит новое значение в OCR1C и запрещает дальнейшие прерывания по TOV1. По завершению 7-ГЦ периода main снова разрешит однократное срабатывание прерывания по TOV1 и т.д.

Отмечу, что из обработчика TOV1 грузить и новое значение OCR1A нежелательно, т.к. именно из-за буферизации оно вступит в силу только после следующего совпадения TCNT1==OCR1C. Впрочем, при малом шаге генерируемой частоты это будет практически незаметно. В идеальном случае нужно устраивать не одно-, а двукратное прерывание - в первом грузить OCR1A, а в следующем - OCR1C, и уже после этого запрещать. Немного усложнится код, но зато результат будет безукоризненным для любой крутизны изменения частоты
Go to the top of the page
 
+Quote Post
djmixi(Димка)
сообщение Apr 27 2007, 06:10
Сообщение #4


Частый гость
**

Группа: Новичок
Сообщений: 75
Регистрация: 13-02-07
Пользователь №: 25 307



А во время изменения OCR я не отключал раньше прерывания и у меня постоянно так скакали 0 и 1 когда я 0 в I запихивал а потом опять 1 то все стало ОК... может дело из-за прерываний происходит...
Go to the top of the page
 
+Quote Post
evgn
сообщение Apr 27 2007, 08:38
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 4-10-06
Пользователь №: 20 954



Всем большое спасибо за помощь! a14.gif

Менять TCNT программно это действительно не выход...
Это помогает... но появляются небольшие на 1-2 цикла шима задержки..... зато часто, что дает еще более худший эффект, чем длинные но редко smile.gif.

Решением было менять OCR1C и OCR1A в прерывании, запуская прерывание после вычисления значения, и запрещая их по выходу из прерывания.
Хотя я так и раньше пробовал... но почему-то не получилоось unsure.gif , наверное я не запрещал прерывания...

Работает и так как предложил уважаемый =AVR=, т.е. меняя в прерывании сначала OCR1A, затем OCR1C и запрещая прерывания, хотя отличий не видно, т.к. частота небольшая.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 27 2007, 16:06
Сообщение #6


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(evgn @ Apr 27 2007, 04:38) *
Решением было менять OCR1C и OCR1A в прерывании, запуская прерывание после вычисления значения, и запрещая их по выходу из прерывания.

Вам надо именно меандр формировать от 2 кГц до 2.5 кГц или это просто пример? А то я было подумал, что можно обойтись одной переменной, записываемой в OCR1C и смена состояния пина.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016