Перейти к содержанию
    

таймер в таймере или шим в шиме

ситуация такая: контролер -мега8

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

44d003f9c8b5t.jpg

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

мой исходник щас на уровне инициализации, такчто и выложить на обозрение нечего :(

сильно не пинайте, процессоры только начал программить .

Изменено пользователем Maks321

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надо просто в нужное время пепенастроить основной таймер, формирующий ШИМ,

на формирование ваших "мелких" импульсиков, а затем в нужное время,

вернуть реж. ШИМ в исходное состояние.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Можно сделать без внешней логики. Ставите таймер1 в Phase and Frequency Correct PWM Mode, устанавливаете период и заполнение внешнего шим, и разрешаете прерывания по завершению внешнего шим, после срабатывания прерывания, не мешкая, устанавливаете период и заполнение внутреннего шим, тем же прерыванием подсчитываете количество импульсов, и быстренько восстанавливаете период и заполнение внешнего шим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В некоторых относительно новых AVR появился "Modulator" - возможность объединить логикой одну ножку с ШИМ-выходами пары таймеров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вобщем получилось нечто такое

#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 длительность коротких импульсов(можно посчитать и количество от общей частоты) пока без регулировки скважности

мигаю всем портом исключительно в тестовых ценях на протеусе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гм. А если приспособить под это дело UART? Или нужно бОльшее разрешение по оси времени?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ситуация такая: контролер -мега8

но чтото мне подсказывает что это логика есть в контролере.

Стало быть, даташит Вы читали по диагонали :(

Можно ведь модулятор и на диодах, и на транзисторе сделать... на любой вкус. Медленный ШИМ на OC1B быстрый на OC2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если я правильно понял, то низкочастотный меандр нужен с фиксированой 50% скважностью, а ВЧ врезки регулируемой частоты (нужна ли регулировка скважности ?) в нулевых состояниях основной последовательности. Я бы сделал так:

Для одного таймера делаем режим сброс по совпадению с прерыванием или прерывание по переполнению с предустановеой таймера на исходное значение в начале обработчика прерывания, что больше нравиться. Цель - получить прерывания с периодом в 2 раза меньше периода основного меандра. Второй таймер настраиваем на нужный режим ШИМ для получения ВЧ последовательности. Затем в обработчике делаем следующее:

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

УСТАНОВИТЬ ВЫХОД ШИМ В ЕДИНИЦУ (подробне почитайте в ДШ о режиме ШИМ)

 

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

 

Стоп/пуск можно делать через регистры управления тайметами TCCRx, например битами выбора источника тактового сигнала. Ести привязка фазы вч к нч не требуется - перед пуском таймет можно не сбрасывать (предустанавливать).

Если требуется переменная скважность, то для первого таймера используем прерывание по переполнению, и в зависимости от того, что сделали в данной итерации (остановили или запустили ВЧ ШИМ) записываем в таймер новую длительность для следующего полупериода (длительность нуля после запуска ШИМ и длительность единицы после остановки ШИМ).

Вот в принципе и все, при ваших частотах останется >99% процессорного времени для других полезных дел. Сам много раз успешно применял этот способ для самых разных задач.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

всем кто помогал спасибо, сделал в двух вариантах(1-мой сложение переменных,2- от max_cnc) практика покажет какой вариант больше подходит для млоего девайса, кока все работает на моем,

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...