реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> таймер в таймере или шим в шиме, помогите исходничком
Maks321
сообщение Sep 7 2009, 20:17
Сообщение #1


Участник
*

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



ситуация такая: контролер -мега8
нужно сделать от 2 до 10 импульсов в одном такте PWM сигнала. частоты пвма в пределах от 40гц до 5Кгц ,осцилограмму нужно получить примерно такую

простыми задержками по мсекундам никчему не привела(съела весь ресурс),запустить или остановить 2й таймер из-под прерывания первого тож не получилось. можно конешно на 2 выхода повесить логику 2И , но чтото мне подсказывает что это логика есть в контролере.
мой исходник щас на уровне инициализации, такчто и выложить на обозрение нечего sad.gif
сильно не пинайте, процессоры только начал программить .

Сообщение отредактировал Maks321 - Sep 7 2009, 20:20
Go to the top of the page
 
+Quote Post
domowoj
сообщение Sep 8 2009, 01:09
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Надо просто в нужное время пепенастроить основной таймер, формирующий ШИМ,
на формирование ваших "мелких" импульсиков, а затем в нужное время,
вернуть реж. ШИМ в исходное состояние.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
Duhas
сообщение Sep 8 2009, 05:11
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 13-04-07
Пользователь №: 27 018



2 ШИМ + или... на том же транзисторе..
Go to the top of the page
 
+Quote Post
=GM=
сообщение Sep 8 2009, 09:38
Сообщение #4


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, устанавливаете период и заполнение внешнего шим, и разрешаете прерывания по завершению внешнего шим, после срабатывания прерывания, не мешкая, устанавливаете период и заполнение внутреннего шим, тем же прерыванием подсчитываете количество импульсов, и быстренько восстанавливаете период и заполнение внешнего шим.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Dx!
сообщение Sep 8 2009, 13:09
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 108
Регистрация: 6-02-09
Из: Новочеркасск
Пользователь №: 44 469



В некоторых относительно новых AVR появился "Modulator" - возможность объединить логикой одну ножку с ШИМ-выходами пары таймеров.
Go to the top of the page
 
+Quote Post
Maks321
сообщение Sep 9 2009, 22:26
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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 длительность коротких импульсов(можно посчитать и количество от общей частоты) пока без регулировки скважности
мигаю всем портом исключительно в тестовых ценях на протеусе.
Go to the top of the page
 
+Quote Post
VSt&
сообщение Sep 11 2009, 07:55
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 101
Регистрация: 3-08-06
Из: Екатеринбург
Пользователь №: 19 275



Гм. А если приспособить под это дело UART? Или нужно бОльшее разрешение по оси времени?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Sep 11 2009, 10:01
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Maks321 @ Sep 7 2009, 23:17) *
ситуация такая: контролер -мега8
но чтото мне подсказывает что это логика есть в контролере.

Стало быть, даташит Вы читали по диагонали sad.gif
Можно ведь модулятор и на диодах, и на транзисторе сделать... на любой вкус. Медленный ШИМ на OC1B быстрый на OC2
Go to the top of the page
 
+Quote Post
Maks321
сообщение Sep 11 2009, 14:38
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
max_cnc
сообщение Sep 14 2009, 13:41
Сообщение #10





Группа: Участник
Сообщений: 11
Регистрация: 29-08-09
Пользователь №: 52 087



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

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

Стоп/пуск можно делать через регистры управления тайметами TCCRx, например битами выбора источника тактового сигнала. Ести привязка фазы вч к нч не требуется - перед пуском таймет можно не сбрасывать (предустанавливать).
Если требуется переменная скважность, то для первого таймера используем прерывание по переполнению, и в зависимости от того, что сделали в данной итерации (остановили или запустили ВЧ ШИМ) записываем в таймер новую длительность для следующего полупериода (длительность нуля после запуска ШИМ и длительность единицы после остановки ШИМ).
Вот в принципе и все, при ваших частотах останется >99% процессорного времени для других полезных дел. Сам много раз успешно применял этот способ для самых разных задач.
Go to the top of the page
 
+Quote Post
Maks321
сообщение Sep 17 2009, 17:34
Сообщение #11


Участник
*

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



всем кто помогал спасибо, сделал в двух вариантах(1-мой сложение переменных,2- от max_cnc) практика покажет какой вариант больше подходит для млоего девайса, кока все работает на моем,
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 10:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01436 секунд с 7
ELECTRONIX ©2004-2016