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

 
 
 
Reply to this topicStart new topic
> PWM на ATmega16A
qwerty1023
сообщение May 21 2015, 15:02
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 9-04-14
Пользователь №: 81 295



Использую PWM на базе Timer/Counter1. Инициализирую следующим образом:

Код
/ Timer 1 Fast PWM 0x3FF TOP
// TCCR1A
//   1     0      1      0      0     0     1    1
//COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11)|(1<<WGM10);
// TCCR1B
//   0     0    0     0     1    0     0    1
//ICNC1 ICES1   –   WGM13 WGM12 CS12 CS11 CS10
TCCR1B = (1<<WGM12)|(1<<CS10);
// разрешить прерывание
TIMSK |= (1<<TOIE1);


OCR1x обновляются в прерывании по переполнению TIMER1_OVF как то так:

Код
#pragma vector = TIMER1_OVF_vect
__interrupt void _pwm (void)
{

if (xDivCh1 < pwmSpeedDivCh1)
{
  xDivCh1++;
}
else
{
  xDivCh1 = 0;
  
  if (curPWMCh1 != OCR1A)
  {
    if (curPWMCh1 < OCR1A) OCR1A--;
    if (curPWMCh1 > OCR1A) OCR1A++;
  }
}
...


Проблема вот в чем. Если OCR1x равно 0x3FF (верхнее значение) выхода постоянно "стоят" в 1 уровне, как и положено. Если значение OCR1x < 0x3FF но > 0 то тоже все работает коректно. Но, когда OCR1x равно 0 на выходе, вместо того, чтобы держался постоянный 0, возникают коротенькие (около 100нс при частоте кварца 8МГц) пички 1-го уровня. Кто с таким сталкивался? Как побороть? Пока сделал костыль в виде проверки OCR1x на 0 и переконфигурирования либо порт либо выход ШИМа, но это имхо очень сильный костыль...

Код
#pragma vector = TIMER1_OVF_vect
__interrupt void _pwm (void)
{
uint tmpData;

if (xDivCh1 < pwmSpeedDivCh1)
{
  xDivCh1++;
}
else
{
  xDivCh1 = 0;
  
  tmpData = OCR1A;
  
  if (curPWMCh1 != tmpData)
  {
    if (curPWMCh1 < tmpData) OCR1A--;
    if (curPWMCh1 > tmpData) OCR1A++;
  }
  if (tmpData == 0)
  {
    // отключение шима от портов
    TCCR1A &= ~((1<<COM1A1)|(1<<COM1A0));
    PORTD &= ~(1<<PD5);
  }
  else
  {
    TCCR1A |= (1<<COM1A1);
  }
}
...


Сообщение отредактировал qwerty1023 - May 21 2015, 15:06
Go to the top of the page
 
+Quote Post
SergeiP
сообщение May 21 2015, 17:42
Сообщение #2





Группа: Новичок
Сообщений: 2
Регистрация: 23-05-11
Из: Новосибирск
Пользователь №: 65 214



Да мне кажется, такое поведение даже в даташите описано.
Так что это не баг, а фича :-)
Go to the top of the page
 
+Quote Post
qwerty1023
сообщение May 22 2015, 05:22
Сообщение #3





Группа: Новичок
Сообщений: 8
Регистрация: 9-04-14
Пользователь №: 81 295



Да, вопрос в том, как это элегантно обойти...
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение May 22 2015, 06:41
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Используйте PWM, Phase Correct или PWM, Phase and Frequency Correct режимы. В доке всё есть, надо только прочитать...

Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Jun 16 2015, 04:04
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716



ATtiny13, Mega8, у этих точно так же, если 0 - выключал PWM.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jun 16 2015, 17:53
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Ну не понимаю я людей, которые даташит не читают... Если использовать Phase Correct PWM Mode, ничего выключать не надо.
Для примера, Tiny13, Phase Correct PWM Mode
The extreme values for the OCR0A Register represent special cases when generating a PWM waveform output in the phase correct PWM mode. If the OCR0A is set equal to BOTTOM, the output will be continuously low and if set equal to MAX the output will be continuously high for non-inverted PWM mode. For inverted PWM the output will have the opposite logic values.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 09:48
Рейтинг@Mail.ru


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