Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как использовать ШИМ в МК от атмел?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ps1x
Хочется научится использовать шим, но не нашел доступного материала, как это реализовать. Я использую CVAVR, в code warior про шим или pwm ничего нет... Дайте пожалуйста ссылку или пример программы с использованием ШИМа.
Заранее спасибо smile.gif
CSB
Вот с исходников насобирал:

Код

// скважиность ШИМ-сигнала
#define PORE_PWM OCR1A  

// частота ШИМ-сигнала
#define FREQUENCY_PWM OCR1B

void main(void)
{
    TCCR1 |= BIT(6);    // enable PWM

    TCCR1 |= BIT(5);    // инвертированный
    TCCR1 |= BIT(4);    //  ШИМ-сигнал

    // Frequency PWN 20 kHz
    TCCR1 &= ~ BIT(3);  // источник тактового сигнала - PCK/8  
    TCCR1 |= BIT(2);
    TCCR1 &= ~ BIT(1);
    TCCR1 &= ~ BIT(0);
    
    FREQUENCY_PWM = 159;
    PORE_PWM = 13;            
...
...

Под конкрентые задачи частоту и скважиность можно посмотреть из datasheet используемого МК
ps1x
Цитата(CSB @ Apr 24 2006, 22:37) *
Вот с исходников насобирал:

Код

// скважиность ШИМ-сигнала
#define PORE_PWM OCR1A  

// частота ШИМ-сигнала
#define FREQUENCY_PWM OCR1B

void main(void)
{
    TCCR1 |= BIT(6);    // enable PWM

    TCCR1 |= BIT(5);    // инвертированный
    TCCR1 |= BIT(4);    //  ШИМ-сигнал

    // Frequency PWN 20 kHz
    TCCR1 &= ~ BIT(3);  // источник тактового сигнала - PCK/8  
    TCCR1 |= BIT(2);
    TCCR1 &= ~ BIT(1);
    TCCR1 &= ~ BIT(0);
    
    FREQUENCY_PWM = 159;
    PORE_PWM = 13;            
...
...

Под конкрентые задачи частоту и скважиность можно посмотреть из datasheet используемого МК


но как с помощью этого зажечь, например, в пол-накала светодиод?
defunct
Цитата(ps1x @ Apr 24 2006, 22:47) *
но как с помощью этого зажечь, например, в пол-накала светодиод?


В даташите все расписано более чем доступно.
У 16-ти разрядного таймера есть два регистра OCR1A/OCR1B которые можно задействовать для PWM.
Имеется несколько режимов PWM из которых Fast PWM наиболее прост как для понимания так и для использования. Идея такова: в один из регистров или в оба регистра OCR1X заносится некоторое число, при достижении которого счетчиком (TCNT1) таймера будет осуществлено переключение определенного пина. При сбросе счетчика TCNT1 будет осуществлено обратное переключение пина. Т.о. если в OCR1A или OCR1B записать значение равное половине (127/255/511) от максимально возможного значения (в зависимости от режима 8, 9, 10bit Fast PWM - 255/511/1023) TCNT, вы получите яркость как раз в "пол-накала".

Есть еще один из путей - когда можно воспользоваться любыми пинами и сделать PWM любой разрядности с гибкой подстройкой частоты следования импульсов. Для этого можно задействовать режим CTC, задать частоту следования импульсов регистром OCR1A и задать ширину пульса регистром OCR1B, соответственно переключать требуемые пины по прерываниям от OCR1A и OCR1B.
Валентиныч
Цитата(defunct @ Apr 25 2006, 07:27) *
Есть еще один из путей - когда можно воспользоваться любыми пинами и сделать PWM любой разрядности с гибкой подстройкой частоты следования импульсов. Для этого можно задействовать режим CTC, задать частоту следования импульсов регистром OCR1A и задать ширину пульса регистром OCR1B, соответственно переключать требуемые пины по прерываниям от OCR1A и OCR1B.

К сожалению, не все модели камней от Атмел (точнее - не все таймеры) имеют OCRхA и OCRхB. А использовать для генерации ШИМ именно Т1 не всегда удобно.
Сталкивался с аналогичной проблемой на Меге 8 (Timer2), там только один регистр задает параметры ШИМ, и регулировать одновременно частоту и скважность ШИМа не удается.
Но для регулировки яркости светодиода Т2 - в самый раз, можно выбрать любой период переполнения таймера, и регулировать только скважность импульсов.
defunct
Цитата(Валентиныч @ Apr 25 2006, 16:16) *
К сожалению, не все модели камней от Атмел (точнее - не все таймеры) имеют OCRхA и OCRхB.

Да Вы безусловно правы, не во всех камнях и не все таймеры оснащены этими регистрами, но это не беда, т.к. наиболее популярные (все Mega) и (Tiny 13/2313) содержат по крайней мере один таймер с двумя регистрами OCRxA/B.

Цитата
А использовать для генерации ШИМ именно Т1 не всегда удобно.

С этим тоже бесусловно согласен.
Однако это не отменяет приведенного, одного из возможных путей, генерации ШИМ. ;>
otrog
Цитата(ps1x @ Apr 24 2006, 19:59) *
Хочется научится использовать шим, но не нашел доступного материала, как это реализовать. Я использую CVAVR, в code warior про шим или pwm ничего нет... Дайте пожалуйста ссылку или пример программы с использованием ШИМа.
Заранее спасибо smile.gif

Почитайте здесь:
http://forum.roboclub.ru/IPBoard/index.php?showtopic=35
и вот здесь:
http://forum.roboclub.ru/IPBoard/index.php?showtopic=72
Думаю Вам поможет.
Успехов.
-=user=-
А вот как получить два сигнала, сдвинутых по фазе?
Например,
_____/~~~~~\____
_________/~~~~~\____
vet
Цитата(-=user=- @ May 7 2006, 19:43) *
А вот как получить два сигнала, сдвинутых по фазе?
Например,
_____/~~~~~\____
_________/~~~~~\____
Если нужна скважность 1/2, то так:
Включить инверсию выходов OC1A и OC1B при совпадении с OCR1A и OCR1B соответственно.
Занести в OCR1A и OCR1B числа, задающие фазы сигналов.
Занести в ICR1 число, задающее период.
Включить на таймере 1 режим CTC со счётом от 0 до ICR1, время счёта равно половине периода сигнала.
Прерывания - по необходимости.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.