Страница 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 писал(а):в каких случаях используется вектор по переполнению, и вектор по сравнению
Зависит от ваших задач... А также, может вы будете организовывать, например, аппаратный ШИМ. Там и используется.
Если мне удобно использовать переполнение, то его и сделаю. Тоже самое и с другими режимами работы таймера.
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.
Большое спасибо! С вашим настройками всё заработало!