ШИМ с ATtiny24
#1
Продолжаем танцы вокруг этой Тиньки...
Честно пытался понять как там устроено все, что бы реализовать ШИМование на ногах микрухи. Но совсем не втыкаю, а русского описания нет, что бы "на пальцах".
Понятно, что вывод порта сперва надо настроить на выход. А какой вывод? Их 4 OC0A OC0B OC1A OC1B
Как выбрать нужный? Или я неверно понял назначение... 
В каком-то счетчике надо закладывать полный цикл, а в каком-то часть...
И - прерывания пока не рассматриваем.
Я вот тут накидал часть кода с комментариями. Давайте править...
Код:
TCCR0A |= (1<<COM0A1)|(0<<COM0A0); // подключение выхода таймера к ножке порта OC0A без инверсии
//TCCR0A |= (1<<COM0A1)|(1<<COM0A0); // подключение выхода таймера к ножке порта OC0A с инверсией
TCCR0B |=(1<<WGM02);
TCCR0A |= (1<<WGM01)|(1<<WGM00); // Режм FAST PWM
TCNT0 = 200;//величина полного цикла
OCR0A = 10;//величина части цикла
TCCR0B|= (0<<CS2)|(0<<CS01)|(0<<CS00); //Остановлено
TCCR0B|= (0<<CS2)|(0<<CS01)|(1<<CS00); //Без предделителя
TCCR0B|= (0<<CS2)|(1<<CS01)|(0<<CS00); //Пределитель  = 8
TCCR0B|= (0<<CS2)|(1<<CS01)|(1<<CS00); //Пределитель  = 64
#2
(29-10-2021, 00:28)Globus_vrn : А какой вывод? Их 4 OC0A OC0B OC1A OC1B
Смотря какой таймер будет использоваться для шима.
(29-10-2021, 00:28)Globus_vrn : В каком-то счетчике надо закладывать полный цикл, а в каком-то часть...
- это зачем? Вы собираетесь организовать программный ногодрыг используя аппаратный таймер с шимом?
У таймеров есть особый регистр сравнения OCRХХ. Если значение в счётном регистре таймера достигнет значения из регистра сравнения, то могут возникнуть следующие аппаратные события:

Прерывание по совпадению
Изменение состояния внешнего вывода сравнения OCхх.

Выходы сравнения выведены наружу, на выводы микроконтроллера, для таймера 0 OC0A OC0B, для таймера 1 OC1A OC1B.
Таймер считает как ему положено от 0 до 256, с частотой которая настроена битами предделителя таймера. После переполнения сбрасывается в 0 и продолжает заново. А вот в момент когда значение в счетном регистре становиться больше чем в регистре сравнения, то вывод ОСхх переключается согласно настройке битов COMхх соответствующего таймера. Изменяя значение регистра сравнения можно изменять период инвертирования вывода (ширину импульсов шима).
Вкратце как-то так, но для таймера есть несколько режимов работы и алгоритм переключения вывода шим будет несколько отличаться. Помню про три режима работы шим генератора avr CTC, Phase Correct PWM, Fast PWM, или в переводе с буржуйского сброс при совпадении, шим с точной фазой, быстрый шим. Настраивается битами WGMxx соответствующего таймера.

Теперь по коду....
Код:
TCCR0A |= (1<<COM0A1)|(0<<COM0A0); // подключение выхода таймера к ножке порта OC0A без инверсии
скорее очистить вывод ОС0А при совпадении, установить вывод ОС0А внизу (это для режима быстрый шим)
Код:
TCCR0B |=(1<<WGM02);

TCCR0A |= (1<<WGM01)|(1<<WGM00); // Режм FAST PWM
ОК.
Код:
TCNT0 = 200;//величина полного цикла

OCR0A = 10;//величина части цикла

TCCR0B|= (0<<CS2)|(0<<CS01)|(0<<CS00); //Остановлено

TCCR0B|= (0<<CS2)|(0<<CS01)|(1<<CS00); //Без предделителя

TCCR0B|= (0<<CS2)|(1<<CS01)|(0<<CS00); //Пределитель  = 8

TCCR0B|= (0<<CS2)|(1<<CS01)|(1<<CS00); //Пределитель  = 64
Тут какая-то ересь...
Предделитель какой? допустим 8, тогда оставить только одну запись, остальные закомментить:
Код:
TCCR0B|= (0<<CS2)|(1<<CS01)|(0<<CS00); //Пределитель  = 8
В счётный регистр ничего не пишем. В регистр сравнения нужное число. Ногу PB2 включаем на выход.
ШИМ будет работать на частоте (Частота МК) / (Предделитель таймера * 2^(разрядность таймера)).
В нашем случае, допустим частота МК 8 МГц, тогда шим таймера (у нас таймер0 8-разрядный) будет 8 000 000 / (8 * 2^8) = 3906.25 Гц. Ширину импульса будет определять соотношение значения в регистре сравнения и размер счетного регистра (у таймера0 это 2^8 = 256). Т.е. если в регистре сравнения будет 64, то заполнение шима составит 100% * 64 / 256 = 25%.

Добавлю, что все рассуждения правдивы для режима Fast PWM.
#3
---Тут какая-то ересь...
Это я написал все варианты. Выбирать, конечно, один.
С остальным вроде понятно, буду пробовать. По результату отпишусь...
СПАСИБИЩЕ!!!
#4
Получилось!

Код:
void TIM0_Init(void)
{
TCCR0B |=(0<<WGM02);
TCCR0A |= (1<<WGM01)|(1<<WGM00); // Режм FAST PWM
TCCR0A |= (1<<COM0A1)|(0<<COM0A0); // подключение выхода таймера к ножке порта OC0A
TCCR0B |= (1<<CS01)|(0<<CS00); //Пределитель  = 8
OCR0A = 10;//величина части цикла
}
10 - это как раз и есть величина ШИМ

Еще раз СПАСИБО!!!

...И еще один момент. Осциллограф показывает, что частота шим с предделителем =1
Код:
TCCR0B |= (0<<CS02)|(0<<CS01)|(1<<CS00);
около 4кГц. Увеличение этого числа приводит к падению частоты до 3Гц примерно (деление на 1024). А можно увеличить частоту выше 3кГц или нет?
#5
Рад за Вас 1
#6
(29-10-2021, 13:09)Globus_vrn : А можно увеличить частоту выше 3кГц или нет
Можно. Используя более высокую частоту работы МК. Например на частоте 8МГц с таймером без предделителя получим 31,25кГц.

Если частота шима в Вашем случае ~4кГц, предположу что частота работы МК 1Мгц. Скорее всего запрограммирован fuse-bit CKDIV8.
#7
(29-10-2021, 13:09)Globus_vrn : А можно увеличить частоту выше 3кГц или нет?
Если очистить запрограммированный по умолчанию фьюз CKDIV8, отключится делитель тактового генератора МК и тактовая частота поднимется до 8МГц.
Частоту ШИМ вообще-то очень легко посчитать: 1000000Гц/1024/256=3.8Гц.
Так же считаем без предделителя таймера: 1000000/1/256=3906, что совпадает с измеренным вживую.
Для более эффективного управления значением частоты ШИМ, используй 7 режим таймера:
TCCR0B |=(1<<WGM02);
TCCR0A |= (1<<WGM01)|(1<<WGM00); // Режм FAST PWM
Считается так же, только вместо фиксированного значения ТОР (0xff) устанавливаем любое разумное значение OCR0A.
#8
---предположу что частота работы МК 1Мгц. Скорее всего запрограммирован fuse-bit CKDIV8.
OK!!!
---Считается так же, только вместо фиксированного значения ТОР (0xff) устанавливаем любое разумное значение OCR0A.
А вот это очень интересно! Я смог менять частоту и скважность ШИМ у процессоров STM8, а с Атмелами только недавно начал знакомство. Хорошо, что и тут это возможно.
#9
Что-то не то...
Предделитель не трогаем. 
Изменяемый параметр - регистр OCR0A
Вот при таких настройках меняется частота ШИМ (в широких пределах) при постоянной скважности 50%
Код:
OCR0A = 10;
TCCR0B |= (1<<WGM02);
TCCR0A |= (1<<WGM01)|(1<<WGM00);

TCCR0A |= (1<<COM0A0);
TCCR0A &= ~(1<<COM0A1);
При таких настройках
Код:
OCR0A = 10;
TCCR0B &= ~(1<<WGM02);
TCCR0A |= (1<<WGM01)|(1<<WGM00);

TCCR0A |= (1<<COM0A1);
TCCR0A &= ~(1<<COM0A0);
меняется скважность, при постоянной частоте.
Режима, при котором можно изменением двух регистров менять одновременно и частоту и скважность я пока не нашел...
#10
Было бы логично предположить, что если регистр OCR0A теперь занят под ТОР, то скважность теперь будет регулироваться с помощью OCR0В, ну и выход нужно соответственно настроить.