Я экспериментировал с режимами генерации формы PWM на ATMega328P. Я получаю некоторые странные результаты, и я не могу понять, есть ли проблема с тем, как я пишу прошивку или как я интерпретирую datasheet.Arduino Uno PWM - Странные результаты
Вот первый кусок кода, который я написал для эмуляции функции analogWrite():
// Waveform Generation Mode 0
// Table 15-4 of the datasheet
void setup()
{
DDRB = (1<<PB1); // set pin 9 as output
TCCR1A |= (1<<COM1A1);
OCR1A = 125;
}
void loop()
{
}
Приведенный выше код производит в среднем выходное напряжение около 2,5В (49% рабочего цикла) из штифта 9 Странная вещь (для меня) заключается в том, что согласно техническому описанию TIMER1 является 16-битным таймером, поэтому он должен переполняться на 65536 тиков. Насколько я понимаю, установка OCR1A между 0 и 65535 изменит рабочий цикл импульса. Итак, установив OCR1A на 125, не должен ли я получать выход около 0,01 В вместо 2,5 В? Результаты, похоже, подразумевают, что часы переполнены на 255.
Для моего второго набега на землю PWM, я хотел попробовать создать сигнал 2.5V с использованием режима быстрой PWM ATMega. Вот что я получил:
// Waveform Generation Mode 14
// Table 15-4 of the datasheet
void setup()
{
DDRB = (1<<PB1);
TCCR1A |= (1<<COM1A1) | (1<<WGM11);
TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS10);
ICR1 = 19999;
OCR1A = 10000;
}
void loop()
{
}
Я поставил ICR1 (значение переполнения) произвольно 20000 тиков затем установите OCR1A (сравниваемое значение) примерно в два раза меньше. Я установил канал A в режим без инвертирования, но (я думаю), если бы я установил его в режим инвертирования, это не имело бы значения. Когда я высветил это на Arduino, я получил постоянное напряжение в среднем 5 В (100% -ный рабочий цикл) из штыря 9, и я не могу на всю жизнь понять, почему.
Я хотел бы получить любое понимание, которое вы можете предложить.
Я согласен с тем, что 8V, вероятно, является ошибкой измерения. Но дело не в этом. Дело в том, что я получал 100% сигнал рабочего цикла, когда ожидал 50% -ный сигнал рабочего цикла. Я обновил свой пост с измеренными рабочими циклами, которые мой друг измерил с помощью его осциллографа. ICR1 - это значение переполнения (TOP) в режиме 14 таблицы 15-4 в руководстве пользователя ATMega328P, поэтому я его использовал. –
editet мой ответ. Также выполняется быстрый тест, печатающий значение регистра. с вашим кодом: 4.97V, конечное значение TCCR1A 10000011 и TCCR1B = 11011 (режим предварительного предсказателя 15, 16) с коррекцией: 2,47 В, конечное значение TCCR1A 10000010 и TCCR1B = 11001 (режим 14, 8 предделитель) – Lesto
Я думаю, что вы правы на этом один. Ребята на уроках AVR также участвуют в одном решении. Вы знаете, есть ли список значений по умолчанию, которые библиотеки Arduino инициализируют регистры? Я проверю это, как только у меня появится шанс. –