|
|
  |
таймер в таймере или шим в шиме, помогите исходничком |
|
|
|
Sep 7 2009, 20:17
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 6-05-08
Пользователь №: 37 328

|
ситуация такая: контролер -мега8 нужно сделать от 2 до 10 импульсов в одном такте PWM сигнала. частоты пвма в пределах от 40гц до 5Кгц ,осцилограмму нужно получить примерно такую простыми задержками по мсекундам никчему не привела(съела весь ресурс),запустить или остановить 2й таймер из-под прерывания первого тож не получилось. можно конешно на 2 выхода повесить логику 2И , но чтото мне подсказывает что это логика есть в контролере. мой исходник щас на уровне инициализации, такчто и выложить на обозрение нечего  сильно не пинайте, процессоры только начал программить .
Сообщение отредактировал Maks321 - Sep 7 2009, 20:20
|
|
|
|
|
Sep 8 2009, 09:38
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Maks321 @ Sep 7 2009, 19:17)  нужно сделать от 2 до 10 импульсов в одном такте PWM сигнала. частоты пвма в пределах от 40гц до 5Кгц Можно сделать без внешней логики. Ставите таймер1 в Phase and Frequency Correct PWM Mode, устанавливаете период и заполнение внешнего шим, и разрешаете прерывания по завершению внешнего шим, после срабатывания прерывания, не мешкая, устанавливаете период и заполнение внутреннего шим, тем же прерыванием подсчитываете количество импульсов, и быстренько восстанавливаете период и заполнение внешнего шим.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Sep 9 2009, 22:26
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 6-05-08
Пользователь №: 37 328

|
вобщем получилось нечто такое Код #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 длительность коротких импульсов(можно посчитать и количество от общей частоты) пока без регулировки скважности мигаю всем портом исключительно в тестовых ценях на протеусе.
|
|
|
|
|
Sep 11 2009, 14:38
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 6-05-08
Пользователь №: 37 328

|
датащит был прочитан по диагонали, получилась вот такая штука, таймер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 кгц?
Сообщение отредактировал Maks321 - Sep 11 2009, 14:39
|
|
|
|
|
Sep 14 2009, 13:41
|
Группа: Участник
Сообщений: 11
Регистрация: 29-08-09
Пользователь №: 52 087

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

Группа: Участник
Сообщений: 18
Регистрация: 6-05-08
Пользователь №: 37 328

|
всем кто помогал спасибо, сделал в двух вариантах(1-мой сложение переменных,2- от max_cnc) практика покажет какой вариант больше подходит для млоего девайса, кока все работает на моем,
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|