Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: таймер в таймере или шим в шиме
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Maks321
ситуация такая: контролер -мега8
нужно сделать от 2 до 10 импульсов в одном такте PWM сигнала. частоты пвма в пределах от 40гц до 5Кгц ,осцилограмму нужно получить примерно такую

простыми задержками по мсекундам никчему не привела(съела весь ресурс),запустить или остановить 2й таймер из-под прерывания первого тож не получилось. можно конешно на 2 выхода повесить логику 2И , но чтото мне подсказывает что это логика есть в контролере.
мой исходник щас на уровне инициализации, такчто и выложить на обозрение нечего sad.gif
сильно не пинайте, процессоры только начал программить .
domowoj
Надо просто в нужное время пепенастроить основной таймер, формирующий ШИМ,
на формирование ваших "мелких" импульсиков, а затем в нужное время,
вернуть реж. ШИМ в исходное состояние.
Duhas
2 ШИМ + или... на том же транзисторе..
=GM=
Цитата(Maks321 @ Sep 7 2009, 19:17) *
нужно сделать от 2 до 10 импульсов в одном такте PWM сигнала. частоты пвма в пределах от 40гц до 5Кгц

Можно сделать без внешней логики. Ставите таймер1 в Phase and Frequency Correct PWM Mode, устанавливаете период и заполнение внешнего шим, и разрешаете прерывания по завершению внешнего шим, после срабатывания прерывания, не мешкая, устанавливаете период и заполнение внутреннего шим, тем же прерыванием подсчитываете количество импульсов, и быстренько восстанавливаете период и заполнение внешнего шим.
Dx!
В некоторых относительно новых AVR появился "Modulator" - возможность объединить логикой одну ножку с ШИМ-выходами пары таймеров.
Maks321
вобщем получилось нечто такое
Код
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
// TCNT1H = 0xFF; //reload counter high value
// TCNT1L = 0x06; //reload counter low value
if (a1 < q1) if (a2 > q2)  { a2 = 0; if (PORTD == 0x00) PORTD = 0xFF;else PORTD = 0x00;}
if (a1 > 10000) { a1 = 0; a2 = 0; PORTD = 0xFF;} // (10000 условная частота 10КГц)
a1++; a2++;
}

a1 a2 переменные для счета.
q1 (q1 = 5000 для 50%) расчитываем % обшего пвм
q2 длительность коротких импульсов(можно посчитать и количество от общей частоты) пока без регулировки скважности
мигаю всем портом исключительно в тестовых ценях на протеусе.
VSt&
Гм. А если приспособить под это дело UART? Или нужно бОльшее разрешение по оси времени?
_Pasha
Цитата(Maks321 @ Sep 7 2009, 23:17) *
ситуация такая: контролер -мега8
но чтото мне подсказывает что это логика есть в контролере.

Стало быть, даташит Вы читали по диагонали sad.gif
Можно ведь модулятор и на диодах, и на транзисторе сделать... на любой вкус. Медленный ШИМ на OC1B быстрый на OC2
Maks321
датащит был прочитан по диагонали, получилась вот такая штука, таймер2 на 2кгц
Код
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
TCNT2 = 0x83; //reload counter value
    if (a5 < q2) {
       if (a4 < q4) { a4++; PORTD = 0xFF;} else {PORTD = 0x00;  
        if (a3 < q3-1) a3++; else {a4=0;a3=0;}}
        a5++;} else
    if (a1 < q1-1) a1++; else {a1=0;a5=0;a3=0;a4=0;}
}
void pwm()
{
a1=0;a2=0;a3=0;a4=0;a5=0; // peremennue schota
q1 = 10; //pausa mejdu paketami
q3 = 3; // pausa mejdu impulsami
q4 = 2; // dlinna impulsa
q5 = 5;   // kolichestvo impulsov
q2 = (q3+q4)*q5; // dlina impulsnogo paketa
}

мои дельфовые припарации сильно замедлят процесор? или всеже я могу расчитывать макс частоту в 1 кгц?
max_cnc
Если я правильно понял, то низкочастотный меандр нужен с фиксированой 50% скважностью, а ВЧ врезки регулируемой частоты (нужна ли регулировка скважности ?) в нулевых состояниях основной последовательности. Я бы сделал так:
Для одного таймера делаем режим сброс по совпадению с прерыванием или прерывание по переполнению с предустановеой таймера на исходное значение в начале обработчика прерывания, что больше нравиться. Цель - получить прерывания с периодом в 2 раза меньше периода основного меандра. Второй таймер настраиваем на нужный режим ШИМ для получения ВЧ последовательности. Затем в обработчике делаем следующее:
ЕСЛИ ВТОРОЙ ТАЙМЕР ДЛЯ ВЧ ШИМ ЗАПУЩЕН - ОСТАНАВЛИВАЕМ ЕГО И ЗАПИСЫВАМ ЗНАЧЕНИЕ, ЧТОБЫ
УСТАНОВИТЬ ВЫХОД ШИМ В ЕДИНИЦУ (подробне почитайте в ДШ о режиме ШИМ)

ЕСЛИ ВТОРОЙ ТАЙМЕР ДЛЯ ВЧ ШИМ ОСТАНОВЛЕН - СБРАСЫВЕМ (ПРЕДУСТАНАВЛИВАЕМ) ЕГО И ЗАПУСКАЕМ

Стоп/пуск можно делать через регистры управления тайметами TCCRx, например битами выбора источника тактового сигнала. Ести привязка фазы вч к нч не требуется - перед пуском таймет можно не сбрасывать (предустанавливать).
Если требуется переменная скважность, то для первого таймера используем прерывание по переполнению, и в зависимости от того, что сделали в данной итерации (остановили или запустили ВЧ ШИМ) записываем в таймер новую длительность для следующего полупериода (длительность нуля после запуска ШИМ и длительность единицы после остановки ШИМ).
Вот в принципе и все, при ваших частотах останется >99% процессорного времени для других полезных дел. Сам много раз успешно применял этот способ для самых разных задач.
Maks321
всем кто помогал спасибо, сделал в двух вариантах(1-мой сложение переменных,2- от max_cnc) практика покажет какой вариант больше подходит для млоего девайса, кока все работает на моем,
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.