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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Замечал ли кто-то странности с PWM на lpc2103 ?, непонятное поведение регистра сравнения в PWM режиме
GetSmart
сообщение Jul 8 2008, 11:35
Сообщение #16


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(cebotor @ Jul 8 2008, 17:13) *
Cмысл этой фразы для меня остался тайной , по моему и так нельзя загружать в MR значение большее периода smile.gif
Если нужно чтобы на выходе MAT всегда было значение 1, то в регистр MR загружают значение большее или равное периоду таймера.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
avva
сообщение Jul 8 2008, 12:18
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 15-02-07
Из: Москва
Пользователь №: 25 386



Вариант 2, учитывающий абсолютно верное замечание CEBOTOR и замечание Alex03 насчёт запаздывания обновления на период и за счёт этого выигрыш в использовании предпосчитанного значения.

//InitTimer0():
215 T0MCR = 0x0601;

//
void timer0_handler(void)
{
static unsigned int i=0;
static unsigned int val=0;

if ( T0IR & 0x01 ) {
T0MR0 = val;
T0IR = (1<<0);
}

if ( T0IR & 0x08 ) {
if (i>399){
val=( (PWM_period_val-( (PWM_period_val*usin[i-400] )>>10))>>1 );
}else{
val=( ((PWM_period_val+((PWM_period_val*usin[i] )>>10))>>1));
}
i = (i != 799) ? i+1 : 0;
T0IR = (1<<3 );
}

return;
}



За сим предлагаю закончить с данной темой, содружеству спасибо! Не наступайте на такие грабли.


--------------------
С уважением,
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jul 9 2008, 09:13
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(avva @ Jul 8 2008, 16:18) *
val=( ((PWM_period_val+((PWM_period_val*usin[i] )>>10))>>1));

Не хочется создавать новой темы, мне вот сейчас тоже надо получать синусоиду с помощью ШИМ. Не могли бы Вы пояснить, как формируете длину импульса с помощью этой формулы? Дело в том, что я думал использовать конструкцию аля val=PWM_period_val*usin[i]. У Вас же, получается val=(PWM_period_val+PWM_period_val*usin[i]/1024)/2. Не понятно...

Сообщение отредактировал Lotor - Jul 9 2008, 09:14


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
avva
сообщение Jul 9 2008, 09:27
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 15-02-07
Из: Москва
Пользователь №: 25 386



Цитата(Lotor @ Jul 9 2008, 13:13) *
Не хочется создавать новой темы, мне вот сейчас тоже надо получать синусоиду с помощью ШИМ. Не могли бы Вы пояснить, как формируете длину импульса с помощью этой формулы? Дело в том, что я думал использовать конструкцию аля val=PWM_period_val*usin[i]. У Вас же, получается val=(PWM_period_val+PWM_period_val*usin[i]/1024)/2. Не понятно...


внутри таблица синуса - половинка волны в unsigned c диапазоном значений 0-1024. по-этому нормировка амплитуды = 1/1024 ну а на 2 делится потому-что от середины половинка строится...
проект скачайте, поиграйтесь и всё поймёте..


--------------------
С уважением,
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jul 9 2008, 09:34
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(avva @ Jul 9 2008, 13:27) *
внутри таблица синуса - половинка волны в unsigned c диапазоном значений 0-1024. по-этому нормировка амплитуды = 1/1024 ну а на 2 делится потому-что от середины половинка строится...
проект скачайте, поиграйтесь и всё поймёте..

Спасибо, разобрался.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
Alex03
сообщение Jul 10 2008, 05:13
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Если бы PWM_period_val было чётным, то можно было бы упростить до
Код
val= (PWM_period_val >> 1) + ((PWM_period_val*usin[i] )>>11);

(PWM_period_val >> 1) - константа (по крайней мере в нормальных компиляторах)

Иначе
Код
val= ((PWM_period_val << 10) + (PWM_period_val*usin[i]) )>>11;

(PWM_period_val << 10) - тоже константа поэтому один сдвиг экономится.

И я бы всётаки ввёл макрос PWM_AMPLITUDE
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th June 2025 - 12:29
Рейтинг@Mail.ru


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