Таймеры/счётчики в AVR
Вот теперь понятно! Спасибо огромное!!! Мне к примеру раз включать пин. Если я делаю переполнение беру переменную int i, инкриминирую i++, до условия i==100 PORTB.1 == 1; (100*0,013 = 1,3c) Верно? И например включаю пин.
Последний раз редактировалось Jman Чт апр 07, 2016 14:57:31, всего редактировалось 1 раз.
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
- Реклама
А в каких случаях используется вектор по переполнению, и вектор по сравнению? И вопрос... Если в Тине 13 стоит CKDIV8 мне брать частоту 600КГц для расчета? Или лучше убрать этот фуз? Это аппаратный предделитель?
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Зависит от ваших задач... А также, может вы будете организовывать, например, аппаратный ШИМ. Там и используется.Jman писал(а):в каких случаях используется вектор по переполнению, и вектор по сравнению
Если мне удобно использовать переполнение, то его и сделаю. Тоже самое и с другими режимами работы таймера.
Да, при условии что частота настроена на 4,8 МГц.Jman писал(а):Тине 13 стоит CKDIV8 мне брать частоту 600КГц
Я обычно его убираю, т.к. чем выше частота, тем быстрее МК выполняет другие команды, а значит и больше их может выполнить за тот же промежуток времени.
Аппаратный предделитель... Да, аппаратный. Настраивается программно.
Суть их отличия лишь в том, что программный делитель вы пишите сами, своими руками. Например, ваше число 100 в прерывании в переменной = это и есть ваш программный делитель на 100. А все другие вы сконфигурировали с помощью битов в регистрах.
Станислав
Доброго дня.
Случился затуп на ровном месте в с работой режима FastPWM в таймере 1 контроллера Atmega16.
Настраиваю вот так:
В принципе работает, но дает на выходе (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 дать нулевое значение ШИМ на выход?
Случился затуп на ровном месте в с работой режима 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;
}Суть работы FastPWM в моем примере: В регистре TCNT1 значения меняются от 0 до 255 с частотой F_CPU / 8. Когда значение TCNT1 совпадает с OCR1A, на вывод PD5 дается "0", а когда TCNT1 обнуляется - дается "1". Получается, эта "1" в любом случае появится на выходе?
Если убрать (1 << WGM12), т.е. перевести Т/С1 в режим Phase Correct PWM, то отсчет начинается с нуля, как и должен бы по идее.
Главный вопрос: как в режиме FastPWM дать нулевое значение ШИМ на выход?
We do what we must because we can (c) GLaDOS
- Реклама
Ковырялся так и сяк - не смог убрать этот ненулевой ноль при FastPWM. Попробовал тот же режим в ATTiny13A - та же петрушка. Видимо, чего-то фундаментально не понимаю.
We do what we must because we can (c) GLaDOS
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
Это нормально читаем даташит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.)
ух ты.... показывает
Спасибо, проморгал этот нюанс в даташите. Получается, PhaseCorrect PWM - наше все.
We do what we must because we can (c) GLaDOS
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
А мне не нравится в том частота шим ("несущая") в 2раза меньше значит фильтр надо ставить с меньшей частотой среза а значит и время реакции
цепи ООС больше .
короткий импульс 1/256 это после фильтра в FAST PWM всего то превышение 0.4 % над нулем
как для меня fast PWM лучше
цепи ООС больше .
короткий импульс 1/256 это после фильтра в FAST PWM всего то превышение 0.4 % над нулем
как для меня fast PWM лучше
ух ты.... показывает
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
Вопрос выводится апаратный шим на определенный вывод контрллера
напрмер PCINT6/OC1A/SDA/MOSI/DI/ADC6) PA6
хочу синхронизировать цикл программы к спаду выхода
конструкция вида
h=PINA.6
будет возвращать адекватное значение ?
вроде возвращает
напрмер PCINT6/OC1A/SDA/MOSI/DI/ADC6) PA6
хочу синхронизировать цикл программы к спаду выхода
конструкция вида
h=PINA.6
будет возвращать адекватное значение ?
вроде возвращает
ух ты.... показывает
12val12, конструкция вида "h=PINA.6" будет возвращать адекватное значение. Но с задержкой на несколько тактов.
PS: Не мешало бы использовать запятые и точки по назначению. Это форум, а не смс переписка.
PS: Не мешало бы использовать запятые и точки по назначению. Это форум, а не смс переписка.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Коты, подскажите пожалуйста, почему у меня на выход PB1 тишина?
Atmega88.
Таймер Т1.
Обычный режим.
Инверсия OC1A при совпадении с 60000, считаем от 50000 до 65535.
Всё-таки на выходе меандр пошел со скважностью 50%.
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)
{
}
}
Никакая контра не уйдёт от нас
В этих же регистрах еще есть биты WGM, прочитайте про них в даташит. Тут еще режимы обсуждали, да их везде обсуждали.
Обычный режим -все биты WGM равны 0
Никакая контра не уйдёт от нас
Не заметил сразу. Вы задачу решили свою?prinv писал(а):Всё-таки на выходе меандр пошел со скважностью 50%.
В том-то и дело что нет. Нужен сигнал регулируемой частоты и скважности на 15й ноге.
Последний раз редактировалось prinv Сб апр 30, 2016 08:59:06, всего редактировалось 1 раз.
Никакая контра не уйдёт от нас
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Т.е. ШИМ с разной частотой. Лучше для Вашей задачи использовать один из режимов FAST PWM, например режим 14. Т.е. все WGM включены, кроме младшего. COM1A1:COM1A0 = 0b10 или 0b11.prinv писал(а):Нужен сигнал регулируемой частоты и скважности на 15й ноге.
Счетчик будет считать от 0 до ICR1. Выход будет переключаться при совпадении с OCA1 и ICR1. Флаг переполнения будет устанавливаться при достижении счетчиком ICR1.
Если ничего не напутал, то будет работать. Для изменения частоты меняете регистр ICR1 и OCA1 , для скважности OCA1.
Спасибо!COKPOWEHEU писал(а):А почему настраиваете Timer1, а прерывание ловите от Timer0?
Теперь частота стала регулироваться, а вот скважность так и осталась 50%.
Никакая контра не уйдёт от нас
Большое спасибо! С вашим настройками всё заработало!Z_h_e писал(а):Лучше для Вашей задачи использовать один из режимов FAST PWM, например режим 14. Т.е. все WGM включены, кроме младшего. COM1A1:COM1A0 = 0b10 или 0b11.
Счетчик будет считать от 0 до ICR1. Выход будет переключаться при совпадении с OCA1 и ICR1. Флаг переполнения будет устанавливаться при достижении счетчиком ICR1.
Если ничего не напутал, то будет работать. Для изменения частоты меняете регистр ICR1 и OCA1 , для скважности OCA1.
Никакая контра не уйдёт от нас



