Страница 34 из 72

Re: Таймеры/счётчики в AVR

Добавлено: Чт апр 07, 2016 14:56:36
Jman
Вот теперь понятно! Спасибо огромное!!! Мне к примеру раз включать пин. Если я делаю переполнение беру переменную int i, инкриминирую i++, до условия i==100 PORTB.1 == 1; (100*0,013 = 1,3c) Верно? И например включаю пин.

Re: Таймеры/счётчики в AVR

Добавлено: Чт апр 07, 2016 14:57:15
СКАЗОЧНИК
Да.

Re: Таймеры/счётчики в AVR

Добавлено: Чт апр 07, 2016 15:00:56
Jman
А в каких случаях используется вектор по переполнению, и вектор по сравнению? И вопрос... Если в Тине 13 стоит CKDIV8 мне брать частоту 600КГц для расчета? Или лучше убрать этот фуз? Это аппаратный предделитель?

Re: Таймеры/счётчики в AVR

Добавлено: Чт апр 07, 2016 15:09:38
СКАЗОЧНИК
Jman писал(а):в каких случаях используется вектор по переполнению, и вектор по сравнению
Зависит от ваших задач... А также, может вы будете организовывать, например, аппаратный ШИМ. Там и используется. :roll:
Если мне удобно использовать переполнение, то его и сделаю. Тоже самое и с другими режимами работы таймера.
Jman писал(а):Тине 13 стоит CKDIV8 мне брать частоту 600КГц
Да, при условии что частота настроена на 4,8 МГц.
Я обычно его убираю, т.к. чем выше частота, тем быстрее МК выполняет другие команды, а значит и больше их может выполнить за тот же промежуток времени.

Аппаратный предделитель... Да, аппаратный. Настраивается программно.
Суть их отличия лишь в том, что программный делитель вы пишите сами, своими руками. Например, ваше число 100 в прерывании в переменной = это и есть ваш программный делитель на 100. А все другие вы сконфигурировали с помощью битов в регистрах.

Re: Таймеры/счётчики в AVR

Добавлено: Ср апр 20, 2016 11:26:21
baron_P
Доброго дня.
Случился затуп на ровном месте в с работой режима FastPWM в таймере 1 контроллера Atmega16.
Настраиваю вот так:

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

//Процедура инициализации Т/С1 (формирование ШИМ-выхода)
void init_TC1(void)
{
    //На выводе OC1A "0" при совпадении  Т/С1 с OCRA1, "1"
    //при переполнении Т/С1, режим 8-битного FastPWM
    TCCR1A |= (1 << COM1A1) | (1 << WGM10);
    //Предделитель 8
    TCCR1B |= (1 << CS11) | (1 << WGM12);
    //PD5 - выход ШИМ
    DDRD |= (1 << PD5);   
    //Начальное задание ШИМ
    OCR1AL = 0;
}
В принципе работает, но дает на выходе (PD5) значение ШИМ на 1 больше заданного. Т.е. при нуле, на этом выводе не ноль, а импульс минимальной длительности, как будто я написал OCR1AL = 1. В программе этот регистр вообще не задействован сейчас, т.е менять начальное значение нечему.
Суть работы FastPWM в моем примере: В регистре TCNT1 значения меняются от 0 до 255 с частотой F_CPU / 8. Когда значение TCNT1 совпадает с OCR1A, на вывод PD5 дается "0", а когда TCNT1 обнуляется - дается "1". Получается, эта "1" в любом случае появится на выходе?
Если убрать (1 << WGM12), т.е. перевести Т/С1 в режим Phase Correct PWM, то отсчет начинается с нуля, как и должен бы по идее.
Главный вопрос: как в режиме FastPWM дать нулевое значение ШИМ на выход?

Re: Таймеры/счётчики в AVR

Добавлено: Пт апр 22, 2016 14:06:31
baron_P
Ковырялся так и сяк - не смог убрать этот ненулевой ноль при FastPWM. Попробовал тот же режим в ATTiny13A - та же петрушка. Видимо, чего-то фундаментально не понимаю.

Re: Таймеры/счётчики в AVR

Добавлено: Пт апр 22, 2016 22:53:06
12val12
baron_P писал(а):Ковырялся так и сяк - не смог убрать этот ненулевой ноль при FastPWM. Попробовал тот же режим в ATTiny13A - та же петрушка. Видимо, чего-то фундаментально не понимаю.
Это нормально читаем даташит
в режиме FAST PWM при OCR=0 на выходе короткий импульс
как пример второй таймер меги16

If the OCR2 is set equal to BOTTOM, the
output will be a narrow spike for each MAX+1 timer clock cycle.
при нижнем значении (0) короткий импульс (сам пару месяцев назад узнал)

можно настроить инверсный PWM
тогда ноль будет чистым 0 (при OCR=255)
но будет короткий импульс нуля при максимальном значении (при OCR=0)

Setting the OCR2 equal
to MAX will result in a constantly high or low output (depending on the polarity of the out-
put set by the COM21:0 bits.)

Re: Таймеры/счётчики в AVR

Добавлено: Чт апр 28, 2016 11:02:26
baron_P
Спасибо, проморгал этот нюанс в даташите. Получается, PhaseCorrect PWM - наше все.

Re: Таймеры/счётчики в AVR

Добавлено: Чт апр 28, 2016 21:23:13
12val12
А мне не нравится в том частота шим ("несущая") в 2раза меньше значит фильтр надо ставить с меньшей частотой среза а значит и время реакции
цепи ООС больше .
короткий импульс 1/256 это после фильтра в FAST PWM всего то превышение 0.4 % над нулем
как для меня fast PWM лучше

Re: Таймеры/счётчики в AVR

Добавлено: Пт апр 29, 2016 18:57:32
12val12
Вопрос выводится апаратный шим на определенный вывод контрллера
напрмер PCINT6/OC1A/SDA/MOSI/DI/ADC6) PA6
хочу синхронизировать цикл программы к спаду выхода
конструкция вида
h=PINA.6
будет возвращать адекватное значение ?
вроде возвращает

Re: Таймеры/счётчики в AVR

Добавлено: Пт апр 29, 2016 19:32:14
Kavka
12val12, конструкция вида "h=PINA.6" будет возвращать адекватное значение. Но с задержкой на несколько тактов.

PS: Не мешало бы использовать запятые и точки по назначению. Это форум, а не смс переписка.

Re: Таймеры/счётчики в AVR

Добавлено: Сб апр 30, 2016 07:06:06
prinv
Коты, подскажите пожалуйста, почему у меня на выход PB1 тишина?
Atmega88.
Таймер Т1.
Обычный режим.
Инверсия OC1A при совпадении с 60000, считаем от 50000 до 65535.

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

#include <avr/io.h>
#include <avr/interrupt.h>

#define TCNT1BEGIN		50000
#define OCR1ABEGIN		60000

ISR(TIMER0_OVF_vect)
{
	TCNT1	=	TCNT1BEGIN;	
}

int main(void)
{
	DDRB	|=	_BV(1);				// Бит 1 порта B - выход OC1A
	TCCR1B	=	0;					// Таймер Т1 остановлен.
	TCCR1A	=	0;
	TCNT1	=	TCNT1BEGIN;
	OCR1A	=	OCR1ABEGIN;
	TCCR1A	=	_BV(COM1A0);		// изменение состояния вывода OC1A на противоположное при совпадении с OCR1A
	TIMSK1	|=	_BV(TOIE1);			// Разрешаем прерывание по переполнению
	TCCR1B	|=	_BV(CS10);			// Тактируемся от CLK	
	
	sei();

    while (1) 
    {
    }
}
Всё-таки на выходе меандр пошел со скважностью 50%.

Re: Таймеры/счётчики в AVR

Добавлено: Сб апр 30, 2016 07:59:56
Z_h_e
В этих же регистрах еще есть биты WGM, прочитайте про них в даташит. Тут еще режимы обсуждали, да их везде обсуждали.

Re: Таймеры/счётчики в AVR

Добавлено: Сб апр 30, 2016 08:43:27
prinv
Обычный режим -все биты WGM равны 0

Re: Таймеры/счётчики в AVR

Добавлено: Сб апр 30, 2016 08:54:39
Z_h_e
prinv писал(а):Всё-таки на выходе меандр пошел со скважностью 50%.
Не заметил сразу. Вы задачу решили свою?

Re: Таймеры/счётчики в AVR

Добавлено: Сб апр 30, 2016 08:56:22
prinv
В том-то и дело что нет. Нужен сигнал регулируемой частоты и скважности на 15й ноге.

Re: Таймеры/счётчики в AVR

Добавлено: Сб апр 30, 2016 08:56:50
COKPOWEHEU
А почему настраиваете Timer1, а прерывание ловите от Timer0?

Re: Таймеры/счётчики в AVR

Добавлено: Сб апр 30, 2016 09:14:40
Z_h_e
prinv писал(а):Нужен сигнал регулируемой частоты и скважности на 15й ноге.
Т.е. ШИМ с разной частотой. Лучше для Вашей задачи использовать один из режимов FAST PWM, например режим 14. Т.е. все WGM включены, кроме младшего. COM1A1:COM1A0 = 0b10 или 0b11.
Счетчик будет считать от 0 до ICR1. Выход будет переключаться при совпадении с OCA1 и ICR1. Флаг переполнения будет устанавливаться при достижении счетчиком ICR1.

Если ничего не напутал, то будет работать. Для изменения частоты меняете регистр ICR1 и OCA1 , для скважности OCA1.

Re: Таймеры/счётчики в AVR

Добавлено: Сб апр 30, 2016 10:57:54
prinv
COKPOWEHEU писал(а):А почему настраиваете Timer1, а прерывание ловите от Timer0?
Спасибо!
Теперь частота стала регулироваться, а вот скважность так и осталась 50%.

Re: Таймеры/счётчики в AVR

Добавлено: Сб апр 30, 2016 11:05:08
prinv
Z_h_e писал(а):Лучше для Вашей задачи использовать один из режимов FAST PWM, например режим 14. Т.е. все WGM включены, кроме младшего. COM1A1:COM1A0 = 0b10 или 0b11.
Счетчик будет считать от 0 до ICR1. Выход будет переключаться при совпадении с OCA1 и ICR1. Флаг переполнения будет устанавливаться при достижении счетчиком ICR1.

Если ничего не напутал, то будет работать. Для изменения частоты меняете регистр ICR1 и OCA1 , для скважности OCA1.
Большое спасибо! С вашим настройками всё заработало!