Проблема с ШИМ на таймере 1 контроллера ATmega168

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Сообщения: 250
Зарегистрирован: Пн окт 01, 2012 09:26:55

Сообщение DeRex »

Суть в том, что необходимо получить ШИМ не менее 14 разрядов на таймере 1 ATmega168 и выход ШИМа через RC-фильтр подать на операционник для усиления напряжения и согласования выходного сопротивления.

Пытался запустить 16-битный шим на ATmega168. По даташиту в режиме PWM, Phase and Frequency Correct ICR1-Top и в режиме Fast PWM ICR1-Top регистр ICR1 задаёт разрешение ШИМ и верхнюю границу работы таймера T1.

В режимах 8-10 бит всё работает как надо. А при установке вышеуказанных режимов с изменяемой разрядностью начинаются глюки. Причём не важно какое число записано в ICR1 для указания разрядности ШИМ. Выходное напряжение после RC-фильтра "болтается"
и при ICR1=0x00FF - 8-ми разрядный ШИМ
и при ICR1=0x03FF - 10-ти разрядный ШИМ
и при ICR1=0xFFFF - 16-ти разрядный ШИМ.

Повторюсь, что выходное напряжение после RC-фильтра болтается +/-20% именно при работе таймера в режиме с шим с изменяемой разрядностью. И это не зависит от установленной разрядности. В режиме ШИМ с фиксированной разрядностью - всё стабильно.

Кто в курсе, где проблема? За неимением осциллографа не могу посмотреть пропадает ШИМ на выходе контроллера или меняется его скважность. Код прилагаю. Нигде в программе регистры более не изменяются.

Вот так выходное напряжение болтается.

Код: Выделить всё

#include <mega168.h>

void main(void)
{

//отключить предделитель тактовой частоты
CLKPR=0x80;
CLKPR=0x00;

PORTB=0x00;
DDRB=0x02;    //Выход ШИМ TCCR1A

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x82;
TCCR1B=0x1A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0xFF;//разрядность ШИМ
ICR1L=0xFF;//разрядность ШИМ 16 бит

//Установить выходое напряжение
OCR1AH=0x0F;
OCR1AL=0xFF;    

while (1)
      {
      //пока пусто
      };
}
И вот при таких установках таймера глюки тоже продолжаются - выходное напряжение болтается. Даже с 10-разрядным ШИМ.

Код: Выделить всё


// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Ph. correct PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x82;
TCCR1B=0x12;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x03;   //10 разрядный ШИМ
ICR1L=0xFF;

А вот так работает без проблем. Использованы те же настройки, но ШИМ с фиксированным 10-битным разрешением.

Код: Выделить всё

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Fast PWM top=03FFh
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x83;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
Так в чём дело? Помогите кто сталкивался. Нужен именно 16-битный ШИМ! Советовать взять преобразователь ЦАП в готовом виде не нужно...
Реклама
Ответить

Вернуться в «AVR»