Суть в том, что необходимо получить ШИМ не менее 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% именно при работе таймера в режиме с шим с изменяемой разрядностью. И это не зависит от установленной разрядности. В режиме ШИМ с фиксированной разрядностью - всё стабильно.
Кто в курсе, где проблема? За неимением осциллографа не могу посмотреть пропадает ШИМ на выходе контроллера или меняется его скважность. Код прилагаю. Нигде в программе регистры более не изменяются.
Вот так выходное напряжение болтается.
И вот при таких установках таймера глюки тоже продолжаются - выходное напряжение болтается. Даже с 10-разрядным ШИМ.
А вот так работает без проблем. Использованы те же настройки, но ШИМ с фиксированным 10-битным разрешением.
Так в чём дело? Помогите кто сталкивался. Нужен именно 16-битный ШИМ! Советовать взять преобразователь ЦАП в готовом виде не нужно...
Пытался запустить 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)
{
//пока пусто
};
}Код: Выделить всё
// 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;
Код: Выделить всё
// 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;