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

 
 
 
Reply to this topicStart new topic
> Конфигурирование timer1 (Atmega16) в режим PWM
man1
сообщение Feb 2 2011, 15:50
Сообщение #1


Участник
*

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



Добрый день,
Подскажите плз в чем может быть проблема , хочу сделать два канала ШИМ 8 bit на выходы OC1A,OC1B , использую timer1 конфигурирую его для работы в режиме Fast Mode 8 bit

#define setbit(x,y) (x|=(1<<y))
#define clearbit(x,y) (x&=~(1<<y))
#define checkbit(x,y) (x&(1<<y))

TCCR1B = 2; //clk/8
setbit(DDRD,PD5);
setbit(DDRD,PD4);

setbit(TCCR1A,WGM10);
clearbit(TCCR1A,WGM11);
setbit(TCCR1B,WGM12);
clearbit(TCCR1B,WGM13); установка режима fast mode

setbit(TCCR1A,COM1A0);
setbit(TCCR1A,COM1A1);
setbit(TCCR1A,COM1B0);
setbit(TCCR1A,COM1B1); управление выводом

OCR1AH=255/256;
OCR1AL=255%256;
//setbit(TIMSK,OCIE1A); //INT CompareA enable

OCR1BH=255/256;
OCR1BL=255%256;
//setbit(TIMSK,OCIE1B); //INT CompareA enable

По отдельности выводы OC1A и OC1B работают , а вместе не хотят .
В чем может быть причина?
Go to the top of the page
 
+Quote Post
2891oleg
сообщение Feb 2 2011, 16:21
Сообщение #2





Группа: Новичок
Сообщений: 5
Регистрация: 1-02-11
Из: Запорожье
Пользователь №: 62 620



Вот тебе работающий пример из СVAVR.
Кстати, ты не забыл OC1A OC1B (PD4, PD5) сделать выходами?

DDRD=0x30;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz clk/8
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x80; //pwm1 0...FF
OCR1BH=0x00;
OCR1BL=0x80; // pwm2 0...FF

Цитата(2891oleg @ Feb 2 2011, 18:10) *
Вот тебе работающий пример из СVAVR.
Кстати, ты не забыл OC1A OC1B (PD4, PD5) сделать выходами?

DDRD=0x30;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz clk/8
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x80; //pwm1 0...FF
OCR1BH=0x00;
OCR1BL=0x80; // pwm2 0...FF


Пардон, вижу, что не забыл:
setbit(DDRD,PD5);
setbit(DDRD,PD4);
Go to the top of the page
 
+Quote Post
man1
сообщение Feb 2 2011, 16:40
Сообщение #3


Участник
*

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



Цитата(2891oleg @ Feb 2 2011, 19:21) *
Вот тебе работающий пример из СVAVR.

Огромное спасибо, причину нашел она была не в программе , а в том что я не туда припаял светодиод на котором смотрел ШИМ.
Ваша программа дала мне уверенность, зная что она точно работает стал искать причину в другом и нашел! А так полдня копался в программе
думал в настройках ШИМа косяк.
Большое спасибо!
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 2 2011, 17:04
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(man1 @ Feb 2 2011, 19:40) *
в том что я не туда припаял светодиод на котором смотрел ШИМ.
Не скупитесь на осциллограф!
Облегчит Вам существование весьма и весьмаwink.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Roger
сообщение Apr 27 2011, 19:36
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383



не буду создавать новую тему спрошу тут также про Timer 1
МК Atmega 32
Задача использую Timer 1
Нужно генерировать два прерывания
1:с изменяющей частотой от 500Гц до 11кГц, главное менять состояние вывода на PD5 аппаратно, но можно и программно
2:с частотой 1/64с 15.625мс или 64Гц. При этот состояние вывода PD4 не нужно.
Поменять выводы пины PD5 и PD4 можно, как и прерывания.

делаю так, режим FastPWM(14). но наверное можно и CTC(12)
инициализация таймера
Код
//    Инициализация таймера 1
    //    Выбор источника тактого сигнала и коэфф. предделителя
    TCCR1B|=(0<<CS12)|(1<<CS11)|(0<<CS10);     // коэфф. 8
    //    Режим работы FASTPWM - сброс при совпадении
    TCCR1B|=(1<<WGM13)|(1<<WGM12)|(1<<WGM11); //WGM10-0 по defualt
    TIMSK|=(1<<OCIE1A)|(1<<OCIE1B);    //Разеришь прерывание по событию "совпадение А" таймера 1
                    //Разеришь прерывание по событию "совпадение B" таймера 1
    TCCR1A|=(1<<COM1A0);//Разрешить изменения состояние выхода на противоположное
    ICR1=0x464F;//15.625мс
    OCR1B=0x464F;//15.625мс
    OCR1A=0x08FF;//500Гц

Ну и обработка прерывания
Код
*/
//    Прерывание по совпадению таймера 1 A
#pragma vector=TIMER1_COMPA_vect
__interrupt void StepDriver(void)
{
//PORTD ^= (1<<(5)); попытка программно менять состояние пина.
// что то делаем    
}
//    Прерывание 15.625мс
#pragma vector=TIMER1_COMPB_vect
__interrupt void SpeedUpDown(void)
{
// что то делаем
//OCR1A= новое значение
}


В результате на выходе PD5 получаю постоянно частоту 1/64с 64гц.

в чем я ошибся?

Сообщение отредактировал Roger - Apr 28 2011, 07:22
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 28 2011, 08:36
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Roger @ Apr 27 2011, 23:36) *
в чем я ошибся?
Один таймер - одна частота. Вероятно, нужно задействовать ещё один таймер, если есть свободный.
Go to the top of the page
 
+Quote Post
Roger
сообщение Apr 28 2011, 09:44
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383



Цитата(Палыч @ Apr 28 2011, 12:36) *
Один таймер - одна частота. Вероятно, нужно задействовать ещё один таймер, если есть свободный.


Есть таймер 2 свободный... но посчитал, он не подойте чтобы использовать его для прерывания 1/64с
А всякими финтами можно добится поставленной задачи?

Сообщение отредактировал Roger - Apr 28 2011, 09:47
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 28 2011, 10:51
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Roger @ Apr 28 2011, 13:44) *
но посчитал, он не подойте чтобы использовать его для прерывания 1/64с
Зависит от используемой тактовой частоты и требуемой точности
F= 9,216 MГц -> 64,2857 1/c
F=14,746 MГц -> 64,0017 1/c

Go to the top of the page
 
+Quote Post
Roger
сообщение Apr 28 2011, 11:34
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383



Цитата(Палыч @ Apr 28 2011, 14:51) *
Зависит от используемой тактовой частоты и требуемой точности
F= 9,216 MГц -> 64,2857 1/c
F=14,746 MГц -> 64,0017 1/c

Да забыл указать
18.432МГц
Точность для 1/64с не так уж и важна

Сообщение отредактировал Roger - Apr 28 2011, 11:35
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 28 2011, 11:52
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Roger @ Apr 28 2011, 15:34) *
18.432МГц
Помнится, что для m32 Fmax=16МГц... На такой тактовой частоте 64 прерывания от этого таймера не получить, но 128 - можно (128,5714 1/с). Прийдётся применять ещё программное деление на два.
Go to the top of the page
 
+Quote Post
Roger
сообщение Apr 28 2011, 12:35
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383



Малек разогнал...
както 1/64с была отпимально.
посмотрим что получится при 1/128с
Go to the top of the page
 
+Quote Post
Roger
сообщение May 3 2011, 06:16
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383



Цитата(Палыч @ Apr 28 2011, 15:52) *
Прийдётся применять ещё программное деление на два.


А это пояснить можно?
мое предположение сводиться к тому что, пропускать одно прерывание.... я ошибаюсь?

Go to the top of the page
 
+Quote Post
Палыч
сообщение May 3 2011, 06:25
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Roger @ May 3 2011, 10:16) *
мое предположение сводиться к тому что, пропускать одно прерывание....
Да, каждое второе прерывание - пропускать (выходить из прерывания ничего не делая).
Go to the top of the page
 
+Quote Post
Roger
сообщение May 5 2011, 10:40
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 27-06-06
Пользователь №: 18 383



Цитата(Палыч @ May 3 2011, 10:25) *
Да, каждое второе прерывание - пропускать (выходить из прерывания ничего не делая).

спасибо
Go to the top of the page
 
+Quote Post

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

 


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


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