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

 
 
 
Reply to this topicStart new topic
> Как использовать ШИМ в МК от атмел?
ps1x
сообщение Apr 24 2006, 15:59
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Хочется научится использовать шим, но не нашел доступного материала, как это реализовать. Я использую CVAVR, в code warior про шим или pwm ничего нет... Дайте пожалуйста ссылку или пример программы с использованием ШИМа.
Заранее спасибо smile.gif
Go to the top of the page
 
+Quote Post
CSB
сообщение Apr 24 2006, 18:37
Сообщение #2


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

Группа: Новичок
Сообщений: 100
Регистрация: 9-03-06
Пользователь №: 15 088



Вот с исходников насобирал:

Код

// скважиность ШИМ-сигнала
#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 используемого МК
Go to the top of the page
 
+Quote Post
ps1x
сообщение Apr 24 2006, 19:47
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Цитата(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 используемого МК


но как с помощью этого зажечь, например, в пол-накала светодиод?
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 25 2006, 01:27
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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.
Go to the top of the page
 
+Quote Post
Валентиныч
сообщение Apr 25 2006, 13:16
Сообщение #5


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

Группа: Свой
Сообщений: 553
Регистрация: 17-02-05
Из: Свердловская обл.
Пользователь №: 2 712



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

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


--------------------
Закономерность: Чем больше узнаю, тем меньше знаю...
Любые мнения, даже ошибочные, имеют право на существование.
Чем лучше узнаю людей, тем больше нравятся собаки...
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 25 2006, 15:21
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Валентиныч @ Apr 25 2006, 16:16) *
К сожалению, не все модели камней от Атмел (точнее - не все таймеры) имеют OCRхA и OCRхB.

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

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

С этим тоже бесусловно согласен.
Однако это не отменяет приведенного, одного из возможных путей, генерации ШИМ. ;>
Go to the top of the page
 
+Quote Post
otrog
сообщение Apr 26 2006, 04:56
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(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
Думаю Вам поможет.
Успехов.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
-=user=-
сообщение May 7 2006, 15:43
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 4-08-05
Пользователь №: 7 369



А вот как получить два сигнала, сдвинутых по фазе?
Например,
_____/~~~~~\____
_________/~~~~~\____
Go to the top of the page
 
+Quote Post
vet
сообщение May 7 2006, 18:11
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(-=user=- @ May 7 2006, 19:43) *
А вот как получить два сигнала, сдвинутых по фазе?
Например,
_____/~~~~~\____
_________/~~~~~\____
Если нужна скважность 1/2, то так:
Включить инверсию выходов OC1A и OC1B при совпадении с OCR1A и OCR1B соответственно.
Занести в OCR1A и OCR1B числа, задающие фазы сигналов.
Занести в ICR1 число, задающее период.
Включить на таймере 1 режим CTC со счётом от 0 до ICR1, время счёта равно половине периода сигнала.
Прерывания - по необходимости.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post

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

 


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


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